GNU/Linux >> Znalost Linux >  >> Linux

Omezit splachování pozadí Linuxu (špinavé stránky)

Řešení 1:

Po spoustě benchmarkingu se sysbenchem jsem došel k tomuto závěru:

Přežít (výkonnostně) situaci, kdy

  • zlý proces kopírování zaplavuje špinavé stránky
  • a je přítomna hardwarová vyrovnávací paměť pro zápis (možná i bez ní)
  • a synchronní čtení nebo zápis za sekundu (IOPS) jsou kritické

stačí vyhodit všechny výtahy, fronty a špinavé mezipaměti stránek. Správné místo pro nečisté stránky je v paměti RAM dané hardwarové mezipaměti pro zápis.

Upravte dirty_ratio (nebo nové dirty_bytes) co nejníže, ale sledujte sekvenční propustnost. V mém konkrétním případě bylo 15 MB optimální (echo 15000000 > dirty_bytes ).

Toto je spíše hack než řešení, protože gigabajty paměti RAM se nyní používají pouze pro ukládání do mezipaměti pro čtení namísto špinavé mezipaměti. Aby špinavá mezipaměť v této situaci dobře fungovala, musel by proplachovač pozadí linuxového jádra zprůměrovat, jakou rychlostí základní zařízení přijímá požadavky, a podle toho upravit proplachování pozadí. Není to snadné.

Specifikace a benchmarky pro srovnání:

Testováno během dd Když byly na disku nuly, sysbench ukázal obrovský úspěch , zvýšení 10 vláken pro zápis fsync při 16 kB z 33 na 700 IOPS (limit nečinnosti:1500 IOPS) a jedno vlákno z 8 na 400 IOPS.

Bez zátěže nebyly IOPS ovlivněny (~1500) a propustnost byla mírně snížena (z 251 MB/s na 216 MB/s).

dd zavolejte:

dd if=/dev/zero of=dumpfile bs=1024 count=20485672

pro sysbench byl test_file.0 připraven tak, aby byl nesparse s:

dd if=/dev/zero of=test_file.0 bs=1024 count=10485672

volání sysbench pro 10 vláken:

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

volání sysbench pro jedno vlákno:

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

Menší velikosti bloků vykazovaly ještě drastickější čísla.

--file-block-size=4096 s 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 s 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 s 15 MB dirty_bytes na nečinném systému:

sysbench 0.4.12:srovnávací hodnocení vícevláknového systému

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

Testovací systém:

  • Adaptec 5405Z (to je 512 MB mezipaměti pro zápis s ochranou)
  • Intel Xeon L5520
  • 6 GiB RAM @ 1066 MHz
  • Základní deska Supermicro X8DTN (čipset 5520)
  • 12 disků Seagate Barracuda 1 TB
    • 10 v softwaru Linux RAID 10
  • Jádro 2.6.32
  • Systém souborů xfs
  • Debian nestabilní

Stručně řečeno, jsem si nyní jistý, že tato konfigurace bude fungovat dobře v nečinnosti, vysoké zátěži a dokonce i plné zátěži pro databázový provoz, který by jinak byl vyhladověn sekvenčním provozem. Sekvenční propustnost je tak jako tak vyšší, než dokážou poskytnout dvě gigabitové linky, takže není problém ji trochu snížit.

Řešení 2:

I když ladění parametrů jádra problém zastavilo, je ve skutečnosti možné, že vaše problémy s výkonem byly výsledkem chyby na řadiči Adaptec 5405Z, která byla opravena v aktualizaci firmwaru z 1. února 2012. Poznámky k vydání říkají:„Opraven problém, kdy se firmware mohl zablokovat během vysokého I/O stresu.“ Možná, že rozložení I/O, jak jste to udělali vy, stačilo k tomu, aby se zabránilo spuštění této chyby, ale to je jen odhad.

Zde jsou poznámky k vydání:http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf

I když to nebyl případ vaší konkrétní situace, usoudil jsem, že by to mohlo být přínosem pro uživatele, kteří se s tímto příspěvkem setkají v budoucnu. V našem výstupu dmesg jsme viděli několik zpráv, jako jsou následující, které nás nakonec vedly k aktualizaci firmwaru:

aacraid: Host adapter abort request (0,0,0,0)
[above was repeated many times]
AAC: Host adapter BLINK LED 0x62
AAC0: adapter kernel panic'd 62.
sd 0:0:0:0: timing out command, waited 360s
sd 0:0:0:0: Unhandled error code
sd 0:0:0:0: SCSI error: return code = 0x06000000
Result: hostbyte=DID_OK driverbyte=DRIVER_TIMEOUT,SUGGEST_OK
sd 0:0:0:0: timing out command, waited 360s
sd 0:0:0:0: Unhandled error code
sd 0:0:0:0: SCSI error: return code = 0x06000028
Result: hostbyte=DID_OK driverbyte=DRIVER_TIMEOUT,SUGGEST_OK
sd 0:0:0:0: timing out command, waited 360s
sd 0:0:0:0: Unhandled error code
sd 0:0:0:0: SCSI error: return code = 0x06000028

Zde jsou čísla modelů řadičů Adaptec RAID, která jsou uvedena v poznámkách k vydání pro firmware, který má opravu vysokého I/O:2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.


Linux
  1. Jak zvýšit limit počtu otevřených souborů v Linuxu

  2. Jak omezit využití CPU procesu v Linuxu

  3. Jak sledovat aktivitu uživatele v Linuxu

  1. Co jsou špinavé stránky v Linuxu

  2. linux:úkol zabít pozadí

  3. Jak číst manuálové stránky Linuxu?

  1. Nahradit manuálové stránky Tealdeerem v Linuxu

  2. Proces na pozadí v linuxu

  3. Jak omezit uživatelské příkazy v Linuxu