坂元です。

解決しましたので報告します。

デバッグを有効にして追ったところ、/sys/dev/iscsi/initiator/isc_sm.c内でハード
コーディングされていた30秒のmsleep()が意図されていないタイミングで呼ばれているよ
うでした。

最終的にドライバをftp://ftp.cs.huji.ac.il/users/danny/freebsd/にある最新の物に置
き換えることで解決しました。以下、導入手順を簡単に説明します。失敗すると簡単に
カーネルがハングアップしますので(^^;ご注意ください。

1. ドライバダウンロード
   # cd /tmp
   # fetch ftp://ftp.cs.huji.ac.il/users/danny/freebsd/iscsi-2.2.4.tar.gz

2. ソース上書き
   # cd /usr/src
   # tar zxf /tmp/iscsi-2.2.4.tar.gz

3. コンパイル&インストール
 ・ドライバ(カーネルモジュール)
   # cd /usr/src/sys/modules/iscsi/initiator/
   # make clean && make depend && make && make install
 ・iscontrolコマンド
   # cd /usr/src/sbin/iscontrol/
   # make clean && make depend && make && make install

4. 再起動してバージョン確認
   # reboot
     :
   # sysctl net.iscsi_initiator.driver_version
   net.iscsi_initiator.driver_version: 2.2.4

直接メールいただいた皆様にもこちらでご報告に代えさせていただければと思います。
ご助言ありがとうございました。

Hideki SAKAMOTO さんは書きました:
> 坂元と申します。
> 
> HPのサーバにInfortrend社のiSCSI RAIDを接続して利用しようとしているのですが、
> 謎の30秒ペナルティが発生して困っております。
> 
> FreeBSD:
>  ハード: HP DL320 G5p
>  OSバージョン: 7.2-RELEASE、7.2+*1のパッチ、7_STABLE
>   *1: 
> http://lists.freebsd.org/pipermail/freebsd-scsi/2008-February/003387.html
> RAID: Infortrend EonStor S12E-G1133-2, 1TB SATA*12 RAID6/5
> 
> これをクロスケーブルで直接接続しています。
> 
> 症状:大量のデータを書き込もうとすると、30秒間のフリーズが頻発する
> 
> 最初に問題に気付いたのは、ddを使って1MBから10倍ずつ書き込むサイズを増やしていく
> テストをしていた時でした。下の試行では、100MBまではそれなりの値が出ているのです
> が、1GB連続して書き込もうとすると、1MBpsにがくんと落ちてしまっています。
> 
> # dd if=/dev/zero of=/raid/t.img bs=1024 count=1000
> 1000+0 records in
> 1000+0 records out
> 1024000 bytes transferred in 0.008301 secs (123358339 bytes/sec)
> (以下、コマンドと結果だけ示します)
> # dd if=/dev/zero of=/raid/t.img bs=1024 count=10000
> 10240000 bytes transferred in 0.175166 secs (58458869 bytes/sec)
> # dd if=/dev/zero of=/raid/t.img bs=1024 count=100000
> 102400000 bytes transferred in 1.785327 secs (57356441 bytes/sec)
> # dd if=/dev/zero of=/raid/t.img bs=1024 count=1000000
> 1024000000 bytes transferred in 895.287328 secs (1143767 bytes/sec)
> 
> 何回か調べたところ、書き込む容量によって再現性があるわけではなく、100MBとか10MB
> でも極端に遅くなることがありました。
> 
> そこでddコマンドを実行しておいてRAIDのアクセスランプの状況を見てみたところ、ddコ
> マンドが終了するまでの間、コントローラのbusyランプがしばらく点灯→30秒ほど消灯→し
> ばらく点灯という状態を繰り返していました。これをヒントにtcpdumpでパケットを観察
> したところ、iSCSサーバから変なack応答が届いたり、あるはずのack応答が無かったりし
> て、FreeBSD側のサーバが応答待ちでストップした後、タイムアウトして再送しているよ
> うでした(添付ファイル)。タイムスタンプをみると、毎回ほぼきっかり30秒で再送してい
> るので、どこかのタイムアウトなんだろうと判断しました。
> 
> 現象を確認後、以下のような試行錯誤をしてみましたが、いずれも効果ありませんでした。
> ・間にplanexのGbEハブを挟む
> ・ifconfigで強制的にmediaを100baseTXに落とす
> ・http://lists.freebsd.org/pipermail/freebsd-scsi/2008-February/003387.htmlの
>   パッチを当ててカーネルを再構築
> ・7_STABLEにアップデート
> ・バッファの増量(/etc/sysctl.conf)
>    net.inet.tcp.sendspace=196608
>    net.inet.tcp.recvspace=196608
>    net.inet.udp.maxdgram=196608
>    net.inet.udp.recvspace=196608
>    net.local.stream.sendspace=196608
>    net.local.stream.recvspace=196608
>    net.local.dgram.maxdgram=196608
>    net.local.dgram.recvspace=196608
>    net.inet.raw.recvspace=196608
>    net.inet.raw.maxdgram=196608
> ・bgeのJumbo frame化、はBCM5714コントローラでは対応していないということで試せず
> ・Intel PRO 1000 CT(emドライバ)への変更
>   - tcpdumpで'IP bad-len 0'が出たので、net.inet.tcp.tso=0に変更
>    
> http://unix.derkeiler.com/Mailing-Lists/FreeBSD/current/2008-02/msg00186.html
> ・emのJumbo frame化
>   - http://www.infortrend.com/japan/doc/appNote/APP_iSCSI_bottom_up_v1.1.pdfより
>     EonStorのMTUは9014バイトということだったので、em側も合わせた。
> 
> RAID装置の販売店の方にも問い合わせているところですが、せめて30秒のペナルティを
> 1秒とかにできないかと思っています。が、それらしいパラメータを見つけられていません。
> 
> どなたかこの30秒という値を決めている箇所に心当たりありませんでしょうか?ソースの
> 書き換えとカーネル再構築ぐらいでしたら試せます。あるいは、他に試すことがありまし
> たら助言いただけるとありがたいです。
> 
> よろしくお願いします。
> 
> --
> 坂元 英紀
>  e-mail: h...@on-sky.net
> 

メールによる返信