Sysbench ile çok kıyaslama yaptıktan sonra şu sonuca vardım:
Hayatta kalmak için (performans açısından) bir durum
- kötü bir kopyalama işlemi kirli sayfaları siler
- ve donanım yazma önbelleği var (muhtemelen bu olmadan da)
- ve saniyede senkronize okuma veya yazma (IOPS) çok önemlidir
sadece tüm asansörleri, kuyrukları ve kirli sayfa önbelleklerini boşaltın. Kirli sayfalar için doğru yer o donanım yazma önbelleğinin RAM'inde bulunur.
Dirty_ratio'yu (veya yeni dirty_bytes) olabildiğince düşük olarak ayarlayın, ancak sıralı verime dikkat edin. Benim özel durumumda, 15 MB optimum idi ( echo 15000000 > dirty_bytes
).
Bu, bir çözümden çok bir hack, çünkü RAM gigabaytları artık yalnızca kirli önbellek yerine okuma önbelleği için kullanılıyor. Kirli önbelleğin bu durumda iyi çalışması için, Linux çekirdeği arka plan temizleyicisinin, temel alınan aygıtın istekleri kabul ettiği hızda ortalama alması ve arka plandaki temizlemeyi buna göre ayarlaması gerekir. Kolay değil.
Karşılaştırma için özellikler ve kriterler:
dd
Diske sıfırlar yapılırken test edilen sysbench , fsync yazarken 10 iş parçacığını 16 kB'de 33 ila 700 IOPS (boşta sınırı: 1500 IOPS) ve tek iş parçacığı 8 ila 400 IOPS arasında arttırırken büyük başarı gösterdi .
Yük olmadan, IOPS etkilenmedi (~ 1500) ve verim biraz azaltıldı (251 MB / s'den 216 MB / s'ye).
dd
aramak:
dd if=/dev/zero of=dumpfile bs=1024 count=20485672
sysbench için, test_dosyası.0 aşağıdakilerle birlikte görülmemiş şekilde hazırlanmıştır:
dd if=/dev/zero of=test_file.0 bs=1024 count=10485672
10 konu için sysbench çağrısı:
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
Bir iş parçacığı için sysbench çağrısı:
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
Küçük blok boyutları daha sert rakamlar gösterdi.
--file-block-size = 4096, 1 GB dirty_bytes ile:
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 ile 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 boşta sistemde 15 MB dirty_bayt ile:
sysbench 0.4.12: çok iş parçacıklı sistem değerlendirme testi
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
Deneme sistemi:
- Adaptec 5405Z (korumalı 512 MB yazma önbelleği)
- Intel Xeon L5520
- 1066 MHz'de 6 GiB RAM
- Anakart Supermicro X8DTN (5520 yongaseti)
- 12 Seagate Barracuda 1 TB diskleri
- 10 Linux yazılımında RAID 10
- Çekirdek 2.6.32
- Dosya sistemi xfs
- Debian kararsız
Özetle, artık bu konfigürasyonun, sıralı trafikten dolayı aç bırakılacak olan veritabanı trafiği için boşta, yüksek yükte ve hatta tam yük durumlarında iyi performans göstereceğinden eminim. Sıralı verim yine de iki gigabit bağlantısının verebileceğinden daha yüksektir, bu yüzden onu biraz azaltmakta sorun yoktur.