
この記事では、I / Oサブシステムの微妙な違いとそれらがパフォーマンスに与える影響について説明します。
数週間前、あるサーバーのNVMeが別のサーバーのSATAよりも遅いのはなぜかという疑問に遭遇しました。サーバーの特性を調べたところ、これはトリックの質問であることがわかりました。NVMeはユーザーセグメントからのものであり、SSDはサーバーセグメントからのものでした。
明らかに、異なる環境で異なるセグメントの製品を比較することは正しくありませんが、これは完全な技術的答えではありません。基本を学び、実験して質問に答えましょう。
fsyncとは何ですか、どこで使用されますか
ドライブでの作業を高速化するために、データはバッファリングされます。つまり、バッファの内容をドライブに保存する便利な機会が現れるまで、揮発性メモリに保存されます。 「機会」の基準は、オペレーティングシステムとドライブの特性によって決まります。電源障害が発生すると、バッファ内のすべてのデータが失われます。
ファイルの変更が中間バッファーではなくドライブに書き込まれることを確認する必要があるタスクがいくつかあります。この信頼性は、POSIX準拠のfsyncシステム呼び出しを使用することで取得できます。 fsync呼び出しは、バッファーからドライブへの強制書き込みを開始します。
短いCプログラムの形で、人工的な例を使用してバッファーの効果を示しましょう。
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(void) {
/* answer.txt , -- */
int fd = open("answer.txt", O_WRONLY | O_CREAT);
/* */
write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
/* , 10 */
sleep(10);
/* */
write(fd, "42\n", 3);
return 0;
}
コメントは、プログラムの一連のアクションをよく説明しています。 「生命、宇宙、その他すべての主な質問への回答」というテキストはオペレーティングシステムによってバッファリングされ、「計算」中にリセットボタンを押してサーバーを再起動すると、ファイルは空になります。この例では、テキストの損失は問題ではないため、fsyncは必要ありません。データベースはこの楽観主義を共有していません。
データベースは、多くのファイルを同時に処理する複雑なプログラムです。データベース内のデータの一貫性はドライブに依存するため、データベースは、書き込むデータがドライブに保存されることを確認する必要があります。データベースは、完了したすべてのトランザクションを記録し、いつでも停電に備えるように設計されています。この動作により、fsyncを常に大量に使用する必要があります。
Fsyncの頻繁な使用が影響するもの
通常のI / Oでは、外部ドライブがメモリ階層で最も遅いため、オペレーティングシステムはディスクとの通信を最適化しようとします。したがって、オペレーティングシステムは、ドライブへの1回の呼び出しで可能な限り多くのデータを書き込もうとします。
特定の例を使用して、fsyncを使用した場合の影響を示しましょう。テスト対象として次のSSDがあります。
- Intel®DCSSDS4500480 GB、SATA 3.2経由で接続、6 Gb / s;
- Samsung 970 EVO Plus 500GB、PCIe 3.0 x4、〜31Gbps。
テストは、Ubuntu20.04を実行しているIntel®Xeon®W-2255で実施されます。Sysbench 1.0.18は、ディスクのテストに使用されます。ドライブ上に1つのパーティションが作成され、ext4としてフォーマットされます。テストの準備は、100GBのファイルを作成することで構成されます。
sysbench --test=fileio --file-total-size=100G prepare
テストの実行:
# fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run
# fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 run
テスト結果を表に示します。
テスト | Intel®S4500 | サムスン970EVO + |
fsync、MiB / sなしで読み取る | 5734.89 | 9028.86 |
fsync、MiB / sなしでの録音 | 3823.26 | 6019.24 |
fsync、MiB / sで読み取る | 37.76 | 3.27 |
Fsync記録、MiB / s | 25.17 | 2.18 |
- fsyncを使用しないテストで、読み取り速度が物理帯域幅を超えるのはなぜですか?
- サーバー側のSSDが多数のfsync要求の処理に優れているのはなぜですか?
最初の質問に対する答えは簡単です。sysbenchはゼロで満たされたファイルを生成します。したがって、テストは100ギガバイトのゼロを超えて実行されました。データは非常に単調で予測可能であるため、さまざまなOS最適化が機能し、実行が大幅に高速化されます。
すべてのsysbenchの結果に疑問がある場合は、fioを使用できます。
# fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb
# fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdb
テスト | Intel®S4500 | サムスン970EVO + |
fsync、MiB / sなしで読み取る | 45.5 | 178 |
fsync、MiB / sなしでの録音 | 30.4 | 119 |
fsync、MiB / sで読み取る | 32.6 | 20.9 |
Fsync記録、MiB / s | 21.7 | 13.9 |
最適化またはブラフ
先ほど、データはバッファに保存されると言いましたが、重要ではないため、どちらを指定しませんでした。ここでは、オペレーティングシステムの複雑さについては深く掘り下げず、2つの一般的なタイプのバッファを選び出します。
- プログラム;
- ハードウェア。
ソフトウェアバッファはオペレーティングシステムにあるバッファを指し、ハードウェアバッファはディスクコントローラの揮発性メモリを指します。fsyncシステム呼び出しは、ドライブにコマンドを送信して、バッファーからメインストレージにデータを書き込みますが、コマンド実行の正確さを制御することはできません。
SSDのパフォーマンスは優れているため、次の2つの前提が考えられます。
- ディスクはそのような負荷用に設計されています。
- ディスクはブラフし、コマンドを無視します。
電源障害テストを実行すると、ドライブの不正な動作を確認できます。これは、2005年に作成されたdiskchecker.plスクリプトを使用して確認できます。 このスクリプトには、「サーバー」と「クライアント」の2つの物理マシンが必要です。クライアントは、テスト対象のディスクに少量のデータを書き込み、fsyncを呼び出し、書き込まれた内容に関する情報をサーバーに送信します。
#
./diskchecker.pl -l [port]
#
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>
スクリプトを実行した後、「クライアント」の電源を切り、数分間電源を戻さないようにする必要があります。ハードシャットダウンを実行するだけでなく、テスト対象の人を電気から切り離すことが重要です。しばらくすると、サーバーに接続してOSにロードできるようになります。OSの起動後、diskchecker.plを再度実行する必要がありますが、verify引数を使用します。
./diskchecker.pl -s <server[:port]> verify <file>
チェックの最後に、エラーの数が表示されます。0の場合、ディスクはテストに合格しました。ディスクで成功した状況の組み合わせを除外するために、実験を数回繰り返すことができます。
私たちのS4500は電力損失エラーを示さなかったので、多くのfsync呼び出しを伴うロードの準備ができていると主張することができます。
結論
ディスクまたは完全な既製の構成を選択するときは、解決する必要のあるタスクの詳細を覚えておく必要があります。一見したところ、NVMe、つまりPCIeインターフェイスを備えたSSDは、「クラシック」なSATASSDよりも高速であることが明らかです。ただし、今日理解したように、特定の条件および特定のタスクでは、これが当てはまらない場合があります。
IaaSプロバイダーからレンタルする場合、サーバーコンポーネントをどのようにテストしますか?
コメントでお待ちしております。
