Setelah banyak melakukan benchmark dengan sysbench, saya sampai pada kesimpulan ini:
Untuk bertahan hidup (kinerja-bijaksana) situasi di mana
- proses salinan jahat membanjiri halaman kotor
- dan cache perangkat keras hadir (mungkin juga tanpa itu)
- dan sinkron membaca atau menulis per detik (IOPS) sangat penting
cukup buang semua elevator, antrian, dan cache halaman kotor. Tempat yang benar untuk halaman kotor adalah dalam RAM cache tulis perangkat keras itu.
Sesuaikan dirty_ratio (atau dirty_bytes baru) serendah mungkin, tetapi perhatikan throughput sekuensial. Dalam kasus khusus saya, 15 MB adalah optimal ( echo 15000000 > dirty_bytes
).
Ini lebih merupakan peretasan daripada solusi karena gigabyte RAM sekarang digunakan hanya untuk membaca caching daripada cache kotor. Agar cache kotor dapat bekerja dengan baik dalam situasi ini, flusher latar belakang kernel Linux perlu rata-rata pada kecepatan apa perangkat yang mendasarinya menerima permintaan dan menyesuaikan pembilasan latar belakang yang sesuai. Tidak mudah.
Spesifikasi dan tolok ukur untuk perbandingan:
Diuji sementara dd
nol ke disk, sysbench menunjukkan keberhasilan besar , meningkatkan 10 utas menulis fsync pada 16 kB dari 33 hingga 700 IOPS (batas idle: 1500 IOPS) dan satu utas dari 8 hingga 400 IOPS.
Tanpa beban, IOPS tidak terpengaruh (~ 1500) dan throughput sedikit berkurang (dari 251 MB / dtk menjadi 216 MB / dtk).
dd
panggilan:
dd if=/dev/zero of=dumpfile bs=1024 count=20485672
untuk sysbench, test_file.0 dipersiapkan untuk tidak digunakan dengan:
dd if=/dev/zero of=test_file.0 bs=1024 count=10485672
panggilan sysbench untuk 10 utas:
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
panggilan sysbench untuk satu utas:
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
Ukuran blok yang lebih kecil menunjukkan angka yang lebih drastis.
--file-block-size = 4096 dengan 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 dengan 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 dengan 15 MB dirty_bytes pada sistem idle:
sysbench 0.4.12: tolok ukur evaluasi sistem multi-utas
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
Sistem uji:
- Adaptec 5405Z (itu cache cache 512 MB dengan perlindungan)
- Intel Xeon L5520
- 6 GiB RAM @ 1066 MHz
- Motherboard Supermicro X8DTN (5520 chipset)
- 12 disk Seagate Barracuda 1 TB
- 10 dalam perangkat lunak Linux RAID 10
- Kernel 2.6.32
- Xfs Sistem File
- Debian tidak stabil
Singkatnya, saya sekarang yakin konfigurasi ini akan berkinerja baik dalam situasi siaga, beban tinggi, dan bahkan beban penuh untuk lalu lintas basis data yang jika tidak akan kelaparan oleh lalu lintas berurutan. Throughput sekuensial lebih tinggi dari dua tautan gigabit yang dapat ditayangkan, jadi tidak ada masalah untuk mengurangi sedikit.