GNU/Linux >> Tutoriels Linux >  >> Linux

Limiter le vidage en arrière-plan de Linux (pages sales)

Solution 1 :

Après de nombreuses analyses comparatives avec sysbench, j'arrive à cette conclusion :

Pour survivre (en termes de performances) à une situation où

  • un processus de copie malveillant inonde les pages sales
  • et le cache en écriture matériel est présent (peut-être aussi sans cela)
  • et les lectures ou écritures synchrones par seconde (IOPS) sont essentielles

videz simplement tous les ascenseurs, les files d'attente et les caches de pages sales. Le bon endroit pour les pages modifiées est dans la RAM de ce cache d'écriture matériel.

Ajustez dirty_ratio (ou new dirty_bytes) aussi bas que possible, mais gardez un œil sur le débit séquentiel. Dans mon cas particulier, 15 Mo étaient optimaux (echo 15000000 > dirty_bytes ).

Il s'agit plus d'un piratage que d'une solution, car des gigaoctets de RAM sont désormais utilisés pour la mise en cache en lecture uniquement au lieu du cache sale. Pour que le cache sale fonctionne bien dans cette situation, le vidage d'arrière-plan du noyau Linux devrait calculer la vitesse moyenne à laquelle le périphérique sous-jacent accepte les requêtes et ajuster le vidage d'arrière-plan en conséquence. Pas facile.

Spécifications et points de comparaison :

Testé en dd En mettant des zéros sur le disque, sysbench a connu un énorme succès , boostant les écritures fsync de 10 threads à 16 Ko de 33 à 700 IOPS (limite d'inactivité :1 500 IOPS) et un seul thread de 8 à 400 IOPS.

Sans charge, les IOPS n'étaient pas affectées (~1 500) et le débit était légèrement réduit (de 251 Mo/s à 216 Mo/s).

dd appeler :

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

pour sysbench, le test_file.0 a été préparé pour être clair avec :

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

appel sysbench pour 10 threads :

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

appel sysbench pour un thread :

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

Les tailles de bloc plus petites ont montré des nombres encore plus drastiques.

--file-block-size=4096 avec 1 Go d'octets sales :

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 avec 15 Mo d'octets sales :

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 avec 15 Mo d'octets sales sur le système inactif :

sysbench 0.4.12 :benchmark d'évaluation de système multithread

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

Système de test :

  • Adaptec 5405Z (c'est-à-dire 512 Mo de cache en écriture avec protection)
  • Intel Xeon L5520
  • 6 Gio de RAM à 1 066 MHz
  • Carte mère Supermicro X8DTN (chipset 5520)
  • 12 disques Seagate Barracuda 1 To
    • 10 en RAID logiciel Linux 10
  • Noyau 2.6.32
  • Système de fichiers xfs
  • Debian instable

En résumé, je suis maintenant sûr que cette configuration fonctionnera bien dans des situations d'inactivité, de charge élevée et même de charge complète pour le trafic de base de données qui, autrement, aurait été affamé par le trafic séquentiel. Le débit séquentiel est supérieur à ce que deux liaisons gigabit peuvent fournir de toute façon, donc pas de problème pour le réduire un peu.

Solution 2 :

Même si le réglage des paramètres du noyau a résolu le problème, il est en fait possible que vos problèmes de performances soient le résultat d'un bogue sur le contrôleur Adaptec 5405Z qui a été corrigé dans une mise à jour du micrologiciel du 1er février 2012. Les notes de version indiquent "Correction d'un problème où le micrologiciel pouvait se bloquer lors d'un stress d'E/S élevé". Peut-être qu'étaler les E/S comme vous l'avez fait était suffisant pour empêcher le déclenchement de ce bogue, mais ce n'est qu'une supposition.

Voici les notes de version :http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf

Même si ce n'était pas le cas pour votre situation particulière, j'ai pensé que cela pourrait profiter aux utilisateurs qui rencontreraient ce message à l'avenir. Nous avons vu des messages comme celui-ci dans notre sortie dmesg qui nous a finalement conduit à la mise à jour du firmware :

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

Voici les numéros de modèle des contrôleurs RAID Adaptec qui sont répertoriés dans les notes de version du micrologiciel qui a le correctif de blocage d'E/S élevé :2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.


Linux
  1. Remplacer les pages de manuel par Tealdeer sous Linux

  2. Comment limiter l'utilisation du processeur d'un processus sous Linux

  3. Comment surveiller l'activité des utilisateurs sous Linux

  4. Que sont les pages sales sous Linux

  5. Comment lire les pages de manuel Linux ?

Comment limiter la bande passante réseau sous Linux à l'aide de Wondershaper

Apprenez à utiliser efficacement les pages de manuel sous Linux

Comment effacer ou vider le cache DNS sous Linux

Comment installer des pages de manuel dans Alpine Linux

Comment vider le cache DNS sous Linux

Comment vider le cache DNS sous Linux ?