Asynchronous I/O (非同期I/O)
非同期I/Oは、通信が進行中でもCPUが同時に実行を続けられるようにする入出力処理の形式です。
ディスクとネットワークはCPUよりも桁違いに遅いです。I/O操作を開始して結果を待つのではなく、データが必要になることが分かったらすぐにCPUがI/O操作を開始し、I/O操作の結果に依存しない他の命令の実行を続けることができます。
説明のために大まかな比較をいくつか示します。
デバイス | レイテンシー | 帯域幅 |
CPU L3 キャッシュ | 10ns | >400 GB/秒 |
メモリ | 100ns | 100GB/秒 |
ディスク (NVMe SSD) | 400us | 380MB/秒 |
通信網 | 50~200ミリ秒 | 1 Gb/秒 (125 MB/秒) |
(fioによる報告による実際のディスク統計で、サイズ2KBのランダム読み取りで約190k IOPS)
幸いなことに、SSDドライブは操作を同時に実行できるため、CPUは同時に複数のリクエストを開始し、実行を続け、その後ほぼ同時に複数の操作の結果を受け取ることができます。
一部のデータベース(例:lmdb / mdbx)は、ディスクへの読み書きにメモリマップドストレージを使用しています。残念ながら、メモリマップドストレージはカーネル(mmap)によって実装されており、非同期ではないため、操作が完了するのを待っている間、実行がブロックされます。
非同期i/oについての詳細はこちらで読むことができます。
Last updated