長老cfq-iosched.txtさまざまな場所で「非同期」または「非同期」要求への言及があります。
CFQは、I / O操作(同期要求)を要求するプロセスのプロセス固有のキューを維持します。非同期要求の場合、すべてのプロセスからのすべての要求は、そのプロセスのI / O優先順位に従ってバッチ処理されます。
ユーザー空間の観点から、この文書の違いを正確にどのように理解する必要がありますか?同期/非同期といういくつかの違いがあるため、明確ではありません。
- 一般
read()
/write()
通貨、Linux AIOを使用する(io_submit()
/io_getevents
)。 - flag
O_SYNC
、設定時に設定できます。open()
1つの文書。
(私が理解した限り、IO優先順位の上記の引用は、単純なバッファ書き込みには適用されません。。 IO優先順位はこれらの要求には影響しません。 )
答え1
Linux IOスケジューラによって処理される要求フォーマットにはさまざまな「ヒント」設定があります。そのうちの1つは「同期」プロンプトです。
LinuxのすべてのIOは非同期で処理されます。これはバックグラウンド書き込みには問題ありませんが、誰かが完了を待っている読み取りまたは書き込みの場合は、ブロック層とIOスケジューラにこれを知りたいと思います。これにより、より良いスケジュール決定を行うことができます。したがって、以下で「同期化」と「非同期化」が参照されている場合は、この優先順位のヒントを参照してください。
-/linux/fs.h が含まれます。(2016-11-01)
読み取り要求は常に同期と見なされます。
ブロック:READ_SYNC定義でREQ_SYNCを使用しないでください。(2016-11-01)
読み込みは定義に従って同期的であるため、他のフラグを追加しないでください。
O_DIRECT
書き込みはO_SYNC
同期と見なされます。
#define READ_SYNC 0
#define WRITE_SYNC (REQ_SYNC | REQ_NOIDLE)
#define WRITE_ODIRECT REQ_SYNC
fsync()
書き込みと同じプロンプトを使用してIO要求を開始しますO_SYNC
。 IO要求がすでに開始されており、fsync()
既存の要求を待たなければならない場合、要求を調整するメカニズムは見えません。
答え:READ_META、READ_SYNC、WRITE_SYNCなどを理解してください。(2010)
しかし、これがデータの整合性のためにアイドルロジック - >書き込みページを無効にしても大丈夫なのはなぜですか?という質問が残ります。これは-> fsyncまたはO_SYNC書き込みで呼び出され、O_DIRECT書き込みと同じ効果を持ちます。
我々はこれに対してアイドル状態を活性化しなかった。 O_SYNCも良い改善を得るでしょう。ベンチマークしてテストすると、追加しない理由はありません。
昨年、a64c8610bd3bの-> writepageコミットですべての種類の同期タグを使用し始めました。 "block_write_full_page:WBC_SYNC_ALL書き込み保存に同期書き込みを使用する"
「アイドルを無効にする」は、説明が少し難しい別のプロンプトフラグです。ただし、上記の引用にリンクされたコミットはWRITE_SYNCヒントの使用を確認しますfsync()
。
上記のコードは移動または交換されましたが、「同期」プロンプトの使用は2016年と同じでなければなりません。
だから私はLinux AIOを使ってリクエストをするかどうかは重要ではないと思います。
AIOはO_DIRECTのみをサポートしているため、IOスケジューラの観点から見ると、すべてのAIOは「同期」する必要があります。 :-).少なくともv4.20以降では。これ新しいAIOインターフェースの提案バッファリングされた(O_DIRECT以外)IOをサポートします。上記と同じコードが実行されるため、O_SYNCを使用するかどうかに応じてプロンプトが設定されます。
sync_file_range()
非同期書き込みストレージがトリガーされるように設計されています。現在の実装(Linux v4.20)では、書き込みREQ_SYNC
保存モードを使用してこれを設定しませんWB_SYNC_NONE
。プログラムがこのフラグを含む書き込み保存を待つ場合も同様ですSYNC_FILE_RANGE_WAIT_AFTER
。ただし、v2.6.29とv4.4の間のカーネルの使用は正しくWB_SYNC_ALL
ありません。REQ_SYNC
sync_file_range()