その結果、2割ぐらい転送効率が落ちてしまった・・・。
これじゃ意味ないじゃない。
関数呼び出しを減らす方向で検討してみよう。
書き込み処理のデータ受信ルーチン(istgt_iscsi_transfer_out)のgprofデータの
一部だけどistgt_iscsi_read_pdu()がほとんどなのでどうにも。。。
ソケットの読み出ししたいけど相手が遅いよ!って状態なのだろうか。
R2Tリクエストをイニシエータになげて必要な書き込みデータを受信する。
その後、正しい部分データなら連続したI/Oバッファに格納する、
それ以外はキューにコピーを保存して書き込み後に再処理する。
転送要求サイズに一致するまで繰り返す。
0.02 19.94 23036/23036 worker [1]
[15] 18.4 0.02 19.94 23036 istgt_iscsi_transfer_out [15]
0.02 16.09 110778/324387 istgt_iscsi_read_pdu [3]
0.00 3.45 33823/404133 istgt_iscsi_write_pdu [4]
0.31 0.00 127922/823078 memcpy [28]
0.01 0.03 105061/2833592 free [40]
0.01 0.00 5995/1723731 memset [29]
0.00 0.01 33200/4674885 __pthread_mutex_lock [47]
0.00 0.00 6014/478204 istgt_queue_enqueue [71]
0.00 0.00 6016/2153019 xmalloc [34]
0.00 0.00 33653/10313149 pthread_mutex_unlock [54]
0.00 0.00 210104/2622567 xfree [92]
0.00 0.00 6005/12005 istgt_iscsi_copy_pdu [113]
0.00 0.00 6006/998597 istgt_queue_count [88]
一方、読み込み処理を含むデータ/レスポンス送信部分はこんな感じ。
連続したI/Oバッファに入ったデータをオフセットをずらしつつCRC計算して送信するだけ。
0.04 28.09 102574/102574 istgt_iscsi_task_response [6]
[9] 25.9 0.04 28.09 102574 istgt_iscsi_transfer_in [9]
0.03 27.99 274040/404133 istgt_iscsi_write_pdu [4]
0.01 0.04 272135/4674885 __pthread_mutex_lock [47]
0.01 0.00 272976/10313149 pthread_mutex_unlock [54]