ディスクから大量のデータを読み取り、大量の書き込みも行うアプリケーションがあります。I/O パフォーマンスを向上させるためにダイレクト io を使用しようとしています。
現在libaio
、読み取りと書き込みの両方で非同期 IO を実装するために使用しています。暫定的な結果では、読解段階では改善が見られますが、執筆段階では大幅な低下が見られます。
次にstrace
、実行時の動作をキャプチャするために使用しました。これが読み取り段階のログです (関連のないログをいくつか削除しました)。
8509 20:59:03.005920 io_submit(139876672323584, 16, {{pread, filedes:102, buf:0x7f36bf816000, nbytes:524288, offset:96468992}} <unfinished ...>
8509 20:59:03.007236 <... io_submit resumed> ) = 16 <0.000893>
そして、ここに書き込み段階のログがあります:
8098 20:47:40.219194 io_submit(140277578346496, 1, {{pwrite, filedes:116, str:"\177\362\215\264\252\360\240\306\377?\265\36/\215#%\304\0343\300\230\256\3550\374 k\316\v\225\327\""..., nbytes:524288, offset:24117248}}) = 1 <0.002457>
一般に、同じio_submit
API でもさまざまな時間がかかります。一度に 16 の読み取り要求を送信しても、1 つの書き込み要求を送信するよりも高速です。
それで、それは正しいですか?書き込みステージを最適化するにはどうすればよいですか?