return to SSR TOP
return to Daemon Lab TOP
zebedee改良テスト
last update:2003/10/8
概要
zebedee(http://www.winton.org.uk/zebedee/)の動作速度が満足行かなかったので、少し改良してみました。
主にSamba over Zebedeeのパフォーマンス改善のために試してみました。
しれっと更新
- バッファオーバーフローのばぐがあったので修正(in 5.1)
What's new
- 入出力のスレッド化
従来のzebedeeでは
while(1){
slect();//入力バッファになにか入って来るまで停止
if(ローカルの入力がある){
入力を暗号かしてリモートに出力
}
if(リモートの入力がある){
入力を復号してローカルに出力
}
}
というアルゴリズムになっていて、ローカルからの暗号かの処理中はリモートからのデータを受信できなかったりします。
そこで、ローカル用とリモート用を別スレッドで実行してみました。
スレッド1:
{
slect();//入力バッファになにか入って来るまで停止
if(ローカルの入力がある){
入力を暗号かしてリモートに出力
}
}
スレッド2:
{
slect();//入力バッファになにか入って来るまで停止
if(リモートの入力がある){
入力を復号してローカルに出力
}
}
これで速くなるか遅くなるかはOSや、マシンスペックや帯域によってかわってくることが予想されるので、
テストデータが欲しいです。だれか協力してほしいです。(;;)
ちなみに、CATV回線vsADSL回線でsamba over zebedeeではサーバ側(FreeBSD)にこれを適用するこれを適用
することにより高速かされることが確認されましたが、ほんとかなぁ?
- memcpyの削減
もとのコードが無用なmemcpyをしていたので、削除してみました。
これによるパフォーマンス改善は。。。。CPUが最近はやいので微々たるものでした。
- ソケットオプション指定
tcp_nodelay so_sndbuf so_rcvbufというソケットオプションを指定できるようになりました。
zebedeeをtcpモードで使う場合にしかいみはありません。
それらの効用についてはsambaのページによく解説されているようてです。
詳しいことはTCP/IPの本でも読んでください。TCPのフロー制御に関連してきます。
- Nagleっぽいものを実装
ng_timer ng_thresholdでNagleっぽいものを実装しています。
具体的にはng_timerマイクロ秒以内にきた総量がng_thresholdを越えない小さなでーたは
こまごまとしたデータのまま送るのではなく、まとめてから送るようにします。
samba over zebedeeでaviファイルをリモートにおいたまま再生するさいに有効に働くようです。
入手方法
実験目的のために実験仲間のためにおいいてるだけです。本運用に使おうなんておもわないでください。
えらいめにあっても知りません。
あと、本家サイトの物にも目をとおしてください。
このバージョンは実験用です。本家にまだマージとかいう話すらしていません。
このバージョンに関して本家に質問しないでください
実験仲間にはいるには?
テストして、報告してくれるとうれしいです。
別に自称してくれれば十分な気がします。
追加されたオプション
設定ファイルにおいて以下のオプションが追加されました.
()内はデフォルト値です
- tcp_nodelay (false)
ソケットオプションとしてTCP_NODELAYを指定します。
- so_sndbuf (0)
ソケットの送信ばっふぁサイズを指定します0のばあいシステムのデフォルトが使われます。
65535が最大値です最大値はシステム依存です
- so_rcvbuf (0)
同様に受信バッファサイズです
- ng_timer (0)
- ng_threashold (0)
小さなデータの塊を、ある程度ためこんで、大きな塊にしてから送ります。
samba over zebedee でaviファイルを再生するときに効果があるかもしれません
一つ目の送信データの入力があってから、ng_timerマイクロ秒以内にきたデータをまとめて送り出します。
ただし、ng_threasholdバイト以上のデータがたまったときはng_timerマイクロ秒以内であっても送り出します。
ng_timer=0のときは無効になります
ng_timerに10とか現実的じゃないぐらい小さい値をしていすると、タスク(スレッド)スイッチそこで促すという
効果があるかもしれません
設定例
CATV回線(サーバ:FreeBSD)対ADSL回線(クライアント:Windows 2000)での設定例したときの例です。
- zebedeeの追加オプション
tcp_nodelay true #これはサーバのみ
so_sndbuf 144000
so_rcvbuf 144000
so_sndbufなどの設定値については65535をこえるときはm*2^nしかとれないらしい。(うろ覚え)
tcp_nodelayに関しては、スループットよりもリアルタイム性が求められる物に
つけるのが普通です。今回のばあいは、サーバ上のAVIファイルをDLするのではなく
直接再生するためにつけました(若干改善があったように思われる)
まぁ、気持程度のオプションかも。
- smb.confの追加設定
socket options = SO_RCVBUF=81920 SO_SNDBUF=144800
oplocks = yes
over zebedeeのばあいは、smbdが直接通信する相手は自分(FreeBSD)なので、
TCP_NODELAYとかつけないほうがいいかも知れません。SNDBUFを大きめにとっているのは
このほうがzebedeeが受け取るデータがいっきに大きいものをうけとれて、転送効率が
あがったからです。
oplockに関してはこれをつけると通信速度があがりますが、副作用があるのでsmb.confのマニュアルを読んでください。
Nagle likeなあれ(ng_*オプション)使ってないじゃんって話がありますが。
oplockをつけないで、AVIの再生するときのみ必要でした。なので今はつけてません。
参考までにどういう指定をしていたかというと。
ng_timer 100
ng_threashold 800
(ただし、サーバ側(データを送り出すがわ)にしか基本的には設定するひつようがありません)
既知のバグ
- tcp接続をいきなりきるとcoreをはくばあいがある。(fixed in 5.1)
- スレッドまわりの実装がへん(無理矢理zebedeeの元のソースを流用してるため)(not fixed)
-
性能計測にはそこまで大きな影響をあたえないので、しばらく放置の予定。
HTTPproxy等にzebedeeを使う時には無駄にりそーすくうかも。