Le vidage en arrière-plan sur Linux se produit lorsque trop de données écrites sont en attente (réglables via / proc / sys / vm / dirty_background_ratio) ou qu'un délai d'attente pour les écritures en attente est atteint (/ proc / sys / vm / dirty_expire_centisecs). À moins qu'une autre limite ne soit atteinte (/ proc / sys / vm / dirty_ratio), davantage de données écrites peuvent être mises en cache. D'autres écritures se bloqueront.
En théorie, cela devrait créer un processus d'arrière-plan pour écrire des pages sales sans perturber les autres processus. En pratique, cela perturbe tout processus effectuant une lecture non mise en cache ou une écriture synchrone. Mal. Cela est dû au fait que le vidage d'arrière-plan écrit en fait à 100% de la vitesse du périphérique et que toute autre demande de périphérique à ce moment sera retardée (car toutes les files d'attente et les caches d'écriture sur la route sont remplis).
Existe-t-il un moyen de limiter le nombre de demandes par seconde effectuées par le processus de vidage, ou de hiérarchiser efficacement les autres E / S de périphérique?
la source
Réponses:
Après de nombreuses analyses comparatives avec sysbench, j'arrive à cette conclusion:
Pour survivre (en termes de performances) à une situation où
il suffit de vider tous les ascenseurs, les files d'attente et les caches de pages sales. L'endroit correct pour les pages sales est dans la RAM de ce cache d'écriture matériel.
Ajustez dirty_ratio (ou les nouveaux 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 hack que d'une solution car des gigaoctets de RAM sont désormais utilisés uniquement pour la mise en cache de lecture au lieu de cache sale. Pour que le cache sale fonctionne bien dans cette situation, le nettoyeur d'arrière-plan du noyau Linux devrait faire la moyenne de la vitesse à laquelle le périphérique sous-jacent accepte les demandes et ajuster le vidage d'arrière-plan en conséquence. Pas facile.
Spécifications et repères de comparaison:
Testé lors de l'utilisation
dd
de zéros sur le disque, sysbench a connu un énorme succès , augmentant 10 threads d'écriture fsync à 16 Ko de 33 à 700 IOPS (limite d'inactivité: 1500 IOPS) et un thread unique de 8 à 400 IOPS.Sans charge, les IOPS n'étaient pas affectés (~ 1500) et le débit était légèrement réduit (de 251 Mo / s à 216 Mo / s).
dd
appel:pour sysbench, le test_file.0 a été préparé pour ne pas être analysé avec:
appel sysbench pour 10 threads:
appel sysbench pour un thread:
De plus petites tailles de blocs ont montré des nombres encore plus drastiques.
--file-block-size = 4096 avec 1 Go dirty_bytes:
--file-block-size = 4096 avec 15 Mo dirty_bytes:
--file-block-size = 4096 avec 15 Mo dirty_bytes sur le système inactif:
sysbench 0.4.12: benchmark d'évaluation de système multi-thread
Système de test:
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 pleine charge 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 gigabits peuvent fournir de toute façon, donc pas de problème à le réduire un peu.
la source
dirty_bytes
devrait être à peine suffisamment élevé pour ne pas bloquer les processeurs pendant l'écriture des processus si le processus écrit en moyenne avec le débit du périphérique. Si votre code d'application effectue des cycles de calcul énorme suivis par l'écriture d'une énorme quantité de données, il sera très difficile à optimiser car les moyennes à court terme diffèrent considérablement des moyennes à long terme. La bonne solution serait d'ajuster ledirty_bytes
paramètre spécifique au processus , mais Linux ne prend pas en charge une telle chose pour autant que je sache.Même si le réglage des paramètres du noyau a arrêté le problème, il est 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'une forte contrainte d'E / S." Peut-être que répartir les E / S comme vous l'avez fait était suffisant pour empêcher ce bug de se déclencher, 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 bénéficier aux utilisateurs qui rencontreront ce message à l'avenir. Nous avons vu des messages comme les suivants dans notre sortie dmesg qui nous ont finalement conduit à la mise à jour du firmware:
Voici les numéros de modèle des contrôleurs RAID Adaptec répertoriés dans les notes de mise à jour du micrologiciel doté du correctif de blocage d'E / S élevé: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.
la source
Un noyau qui inclut "WBT":
WBT ne nécessite pas de basculer vers la nouvelle couche de blocs blk-mq. Cela dit, cela ne fonctionne pas avec les planificateurs d'E / S CFQ ou BFQ. Vous pouvez utiliser WBT avec les programmateurs de délai / mq-date limite / noop / aucun. Je crois que cela fonctionne également avec le nouveau planificateur d'E / S "kyber".
Outre la mise à l'échelle de la taille de la file d'attente pour contrôler la latence, le code WBT limite le nombre de demandes de réécriture en arrière-plan en proportion de la limite de file d'attente calculée.
La configuration d'exécution est en cours
/sys/class/block/*/queue/wbt_lat_usec
.Les options de configuration de construction à rechercher sont
Votre énoncé de problème est confirmé à 100% par l'auteur de WBT - bravo :-).
la source
Quelle est votre moyenne pour Dirty in / proc / meminfo? Cela ne devrait normalement pas dépasser votre / proc / sys / vm / dirty_ratio. Sur un serveur de fichiers dédié, j'ai dirty_ratio réglé sur un pourcentage de mémoire très élevé (90), car je ne le dépasserai jamais. Votre dirty_ration est trop bas, quand vous le frappez, tout craque, élevez-le.
la source