FreeBSDで一部のアプリケーションからの書き込みに時間がかかる
KB番号 | J0005 |
最終更新日 | 2001/02/23 |
作成者 | たかはしもとのぶ |
最終更新者 |
対象
この文書は、以下のプロダクトに付いて説明したものです。
- Samba 2.0.7 日本語版リリース2.2
- FreeBSD 2.2.1(R) ~ FreeBSD 4.2(R)
概要
FreeBSDで、ある特定の条件時の書き込み速度が非常に遅くなります。
一部のアプリケーション(PhotoShop等)では、Sambaに対してftruncate()を非常に繁雑に呼び出すような書き込み要求を行ないます。そのような状況になった場合、ftruncate()で遅延が生じてしまい、予定される書き込み速度に比べ、10 ~ 100 倍もの時間がかかってしまいます。
なお、Windowsからの一般的な書き込み要求ではftruncate()が呼ばれることはありません。
詳細
問題発生時のsmbdのログ(debug level = 3)は以下のようになります。
書き込みパフォーマンスが異常に悪いときのログと正常なときのログとを比 較してみると、異常な場合には以下のようなシーケンスで reply_write() が非常に数多く呼び出されています。
[2001/01/11 10:29:22, 3] smbd/process.c:process_smb(618) Transaction 20 of length 52 [2001/01/11 10:29:22, 3] smbd/process.c:switch_message(448) switch message SMBwrite (pid 3962) [2001/01/11 10:29:22, 3] smbd/reply.c:reply_write(2533) write fnum=4184 num=0 wrote=0 [2001/01/11 10:29:22, 3] smbd/process.c:process_smb(618) Transaction 21 of length 61443 [2001/01/11 10:29:22, 3] smbd/process.c:switch_message(448) switch message SMBwriteX (pid 3962) [2001/01/11 10:29:22, 3] smbd/reply.c:reply_write_and_X(2609) writeX fnum=4184 num=61376 wrote=61376 [2001/01/11 10:29:22, 3] smbd/process.c:process_smb(618) Transaction 22 of length 4227 [2001/01/11 10:29:22, 3] smbd/process.c:switch_message(448) switch message SMBwriteX (pid 3962) (以下省略)
num = xxxxx wrote = xxxxx という部分に着目してログを抽出すると、以下のように不要な0バイトの書き込み(wrote=0)がされてしまっています。
writeX fnum=4582 num=4160 wrote=4160 writeX fnum=4582 num=61376 wrote=61376 write fnum=4582 num=0 wrote=0 writeX fnum=4582 num=4160 wrote=4160 writeX fnum=4582 num=61376 wrote=61376 write fnum=4582 num=0 wrote=0 writeX fnum=4582 num=4160 wrote=4160 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0 write fnum=4582 num=0 wrote=0
WindowsのExplorerなどで、単純にsmbdに書き込んだ場合には、SMBwrite はこれほどリクエストされません。PhotoShop で、別名で保存で bmp や tga 形式で書き込むと、このように非常に多くのリクエストがなされる場合があるようです。
このメッセージは source/smbd/reply.c 中の reply_write() が出力しており、reply_write() 中でログにnum=0と出力される場合は source/lib/util.c 中の set_filelen() 中で ftruncate() が呼ばれています。
原因
FreeBSDのftruncate()の内部実装の問題だと考えられます。
対処方法
以下のパッチを適用して、OS付属のftruncate()関数ではなくSambaの持つftruncate()相当のルーチンを利用するようにしてください。 このパッチは現在FreeBSD特有の問題かどうかが確認できていないため、次期リリースで統合されるかどうかは未定です。
またSamba 2.0.7オリジナル版および、リリース2.2以前のSamba 2.0.7日本語版に対しても、同様のロジックを適用することで、この問題を修正することが可能です。