sysbenchで多くのベンチマークを行った後、次の結論に達しました。
(パフォーマンス面で)状況を生き残るために
- 邪悪なコピープロセスがダーティページをあふれさせる
- ハードウェア書き込みキャッシュが存在します(おそらくそれもありません)
- 同期読み取りまたは書き込み/秒(IOPS)が重要です
エレベータ、キュー、ダーティページキャッシュをすべてダンプするだけです。ダーティページの正しい場所は、そのハードウェア書き込みキャッシュのRAMです。
dirty_ratio(または新しいdirty_bytes)をできる限り低く調整しますが、シーケンシャルスループットに注意してください。私の場合、15 MBが最適でした(echo 15000000 > dirty_bytes
)。
ダーティキャッシュではなく、ギガバイトのRAMが読み取りキャッシュにのみ使用されるようになったため、これはソリューションというよりはハックです。この状況でダーティキャッシュが適切に機能するためには、Linuxカーネルバックグラウンドフラッシャーは、基になるデバイスが要求を受け入れる速度で平均化し、それに応じてバックグラウンドフラッシュを調整する必要があります。簡単ではありません。
比較のための仕様とベンチマーク:
ながら試験dd
ディスクにゼロをINGの」sysbenchを示した大成功を 8から400までの単一スレッドIOPS:33から700 IOPS(1500 IOPSアイドル限界)に16キロバイトで書き込みFSYNC 10個のスレッドを高めます。
負荷がなければ、IOPSは影響を受けず(〜1500)、スループットはわずかに低下しました(251 MB / sから216 MB / sへ)。
dd
コール:
dd if=/dev/zero of=dumpfile bs=1024 count=20485672
sysbenchの場合、test_file.0は次のようにスパースされないように準備されました。
dd if=/dev/zero of=test_file.0 bs=1024 count=10485672
10スレッドのsysbench呼び出し:
sysbench --test=fileio --file-num=1 --num-threads=10 --file-total-size=10G --file-fsync-all=on --file-test-mode=rndwr --max-time=30 --file-block-size=16384 --max-requests=0 run
1つのスレッドのsysbench呼び出し:
sysbench --test=fileio --file-num=1 --num-threads=1 --file-total-size=10G --file-fsync-all=on --file-test-mode=rndwr --max-time=30 --file-block-size=16384 --max-requests=0 run
ブロックサイズを小さくすると、さらに劇的な数値が示されました。
--file-block-size = 4096、1 GBのdirty_bytes:
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Extra file open flags: 0
1 files, 10Gb each
10Gb total file size
Block size 4Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Calling fsync() after each write operation.
Using synchronous I/O mode
Doing random write test
Threads started!
Time limit exceeded, exiting...
Done.
Operations performed: 0 Read, 30 Write, 30 Other = 60 Total
Read 0b Written 120Kb Total transferred 120Kb (3.939Kb/sec)
0.98 Requests/sec executed
Test execution summary:
total time: 30.4642s
total number of events: 30
total time taken by event execution: 30.4639
per-request statistics:
min: 94.36ms
avg: 1015.46ms
max: 1591.95ms
approx. 95 percentile: 1591.30ms
Threads fairness:
events (avg/stddev): 30.0000/0.00
execution time (avg/stddev): 30.4639/0.00
--file-block-size = 4096、15 MBのdirty_bytes:
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Extra file open flags: 0
1 files, 10Gb each
10Gb total file size
Block size 4Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Calling fsync() after each write operation.
Using synchronous I/O mode
Doing random write test
Threads started!
Time limit exceeded, exiting...
Done.
Operations performed: 0 Read, 13524 Write, 13524 Other = 27048 Total
Read 0b Written 52.828Mb Total transferred 52.828Mb (1.7608Mb/sec)
450.75 Requests/sec executed
Test execution summary:
total time: 30.0032s
total number of events: 13524
total time taken by event execution: 29.9921
per-request statistics:
min: 0.10ms
avg: 2.22ms
max: 145.75ms
approx. 95 percentile: 12.35ms
Threads fairness:
events (avg/stddev): 13524.0000/0.00
execution time (avg/stddev): 29.9921/0.00
--file-block-size = 4096、アイドルシステム上の15 MBのdirty_bytes:
sysbench 0.4.12:マルチスレッドシステム評価ベンチマーク
Running the test with following options:
Number of threads: 1
Extra file open flags: 0
1 files, 10Gb each
10Gb total file size
Block size 4Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Calling fsync() after each write operation.
Using synchronous I/O mode
Doing random write test
Threads started!
Time limit exceeded, exiting...
Done.
Operations performed: 0 Read, 43801 Write, 43801 Other = 87602 Total
Read 0b Written 171.1Mb Total transferred 171.1Mb (5.7032Mb/sec)
1460.02 Requests/sec executed
Test execution summary:
total time: 30.0004s
total number of events: 43801
total time taken by event execution: 29.9662
per-request statistics:
min: 0.10ms
avg: 0.68ms
max: 275.50ms
approx. 95 percentile: 3.28ms
Threads fairness:
events (avg/stddev): 43801.0000/0.00
execution time (avg/stddev): 29.9662/0.00
テストシステム:
- Adaptec 5405Z(保護付きの512 MB書き込みキャッシュ)
- Intel Xeon L5520
- 6 GiB RAM @ 1066 MHz
- マザーボードSupermicro X8DTN(5520チップセット)
- Seagate Barracuda 1 TBディスク12個
- カーネル2.6.32
- ファイルシステムxfs
- Debian不安定版
要約すると、この構成は、そうでなければシーケンシャルトラフィックによって枯渇してしまうデータベーストラフィックのアイドル、高負荷、さらには全負荷の状況でも良好に機能するはずです。とにかく2つのギガビットリンクが提供できるシーケンシャルスループットよりも高いので、少しでも問題はありません。