Performance

Qu'est-ce que vm.min_free_kbytes et comment le régler?

Qu'est-ce que vm.min_free_kbytes et comment le régler?
Qu'est-ce que vm.min_free_kbytes sysctl accordable pour le noyau Linux et à quelle valeur doit-il être défini?  Nous étudierons ce paramètre et son impact sur un système Linux en cours d'exécution dans cet article.  Nous allons tester son impact sur le cache des pages du système d'exploitation et sur les mallocs et ce que la commande system free montre lorsque ce paramètre est défini.  Nous ferons quelques suppositions éclairées sur les valeurs idéales pour ce paramètre et nous montrerons comment définir vm.min_free_kbytes en permanence pour survivre aux redémarrages.  Alors allons-y.

Comment vm.min_free_kbytes fonctionne

Des allocations de mémoire peuvent être nécessaires par le système afin d'assurer le bon fonctionnement du système lui-même.  Si le noyau permet à toute la mémoire d'être allouée, il peut avoir des difficultés à avoir besoin de mémoire pour des opérations régulières afin que le système d'exploitation continue de fonctionner correctement.  C'est pourquoi le noyau fournit le vm accordable.min_free_kbytes.  L'accordable forcera le gestionnaire de mémoire du noyau à conserver au moins X quantité de mémoire libre.   Voici la définition officielle du documentation du noyau Linux: "Ceci est utilisé pour forcer la machine virtuelle Linux à garder un nombre minimum de kilo-octets libres.  La VM utilise ce nombre pour calculer une valeur de filigrane[WMARK_MIN] pour chaque zone lowmem du système. Chaque zone lowmem obtient un nombre de pages gratuites réservées en fonction de sa taille. Une quantité minimale de mémoire est nécessaire pour satisfaire les allocations PF_MEMALLOC ; si vous le définissez sur une valeur inférieure à 1024 Ko, votre système deviendra subtilement cassé et sujet aux blocages sous des charges élevées. Un réglage trop élevé OOM votre machine instantanément."

Validation de la machine virtuelle.min_free_kbytes Fonctionne

Afin de tester que le paramètre de min_free_kbytes fonctionne comme prévu, j'ai créé une instance virtuelle Linux avec seulement 3.75 Go de RAM.  Utilisez la commande gratuite ci-dessous pour analyser le système :

# libre -m

En regardant l'utilitaire de mémoire libre ci-dessus en utilisant l'indicateur -m pour que les valeurs soient imprimées en Mo.  La mémoire totale est de 3.5 à 3.75 Go de mémoire.  121 Mo de mémoire sont utilisés, 3.3 Go de mémoire sont libres, 251 Mo sont utilisés par le cache tampon.  Et 3.3 Go de mémoire sont disponibles.

Maintenant, nous allons changer la valeur de vm.min_free_kbytes et voyez quel est l'impact sur la mémoire système.  Nous ferons écho à la nouvelle valeur dans le système de fichiers virtuel proc pour modifier la valeur du paramètre du noyau comme ci-dessous :

# echo 1500000 > /proc/sys/vm/min_free_kbytes
# sysctl vm.min_free_kbytes

Vous pouvez voir que le paramètre a été changé à 1.5 Go environ et a pris effet.  Utilisons maintenant le libre commande à nouveau pour voir les changements reconnus par le système.

# libre -m

La mémoire libre et le cache tampon sont inchangés par la commande, mais la quantité de mémoire affichée comme disponible a été réduit de 3327 à 1222 Mo.  Ce qui est une réduction approximative de la variation du paramètre à 1.5 Go minimum de mémoire libre.

Créons maintenant un fichier de données de 2 Go, puis voyons ce que la lecture de ce fichier dans le cache tampon fait aux valeurs.  Voici comment créer un fichier de données de 2 Go en 2 lignes de script bash ci-dessous.  Le script générera un fichier aléatoire de 35 Mo à l'aide de la commande dd, puis le copiera 70 fois dans un nouveau fichier de données production:

# dd if=/dev/random of=/root/d1.nombre de txt=1000000
# pour i dans 'seq 1 70'; faire écho $i; chat /racine/d1.txt >> /root/data_file; Fini

Lisons le fichier et ignorons le contenu en lisant et en redirigeant le fichier vers /dev/null comme ci-dessous :

# fichier_données cat > /dev/null

Ok, qu'est-il arrivé à notre mémoire système avec cet ensemble de manœuvres, vérifions-le maintenant :

# libre -m

Analyser les résultats ci-dessus.  Nous en avons encore 1.8 Go de mémoire libre, le noyau a donc protégé une grande partie de la mémoire comme réservée à cause de notre paramètre min_free_kbytes.  Le cache tampon a utilisé 1691 Mo, ce qui est inférieur à la taille totale de notre fichier de données qui est de 2.3 Go.  Apparemment l'ensemble fichier de données n'a pas pu être stocké dans le cache en raison du manque de mémoire disponible à utiliser pour le cache tampon.  Nous pouvons valider que l'intégralité du fichier n'est pas stocké en cache mais chronométrer les tentatives répétées de lecture du fichier. S'il était mis en cache, il faudrait une fraction de seconde pour lire le fichier.  Essayons.

# time cat data_file > /dev/null
# time cat data_file > /dev/null

La lecture du fichier a pris près de 20 secondes, ce qui implique qu'il n'est presque certainement pas tout mis en cache.

Comme dernière validation, réduisons la vm.min_free_kbytes pour permettre au cache de la page d'avoir plus d'espace pour fonctionner et nous pouvons nous attendre à voir le cache fonctionner et la lecture du fichier beaucoup plus rapide.

# echo 67584 > /proc/sys/vm/min_free_kbytes
# time cat data_file > /dev/null
# time cat data_file > /dev/null

Avec la mémoire supplémentaire disponible pour la mise en cache, le temps de lecture du fichier est passé de 20 secondes avant à .364 secondes avec tout en cache.

Je suis curieux de faire une autre expérience.  Que se passe-t-il avec les appels malloc pour allouer de la mémoire à partir d'un programme C face à cette machine virtuelle vraiment élevée.paramètre min_free_kbytes.  Va-t-il échouer le malloc?  Le système va-t-il mourir?  Réinitialisez d'abord la vm.min_free_kbytes sur la valeur très élevée pour reprendre nos expériences :

# echo 1500000 > /proc/sys/vm/min_free_kbytes

Regardons à nouveau notre mémoire libre :

Théoriquement on a 1.9 Go gratuits et 515 Mo disponibles.  Utilisons un programme de test de stress appelé stress-ng afin d'utiliser de la mémoire et de voir où nous échouons.  Nous allons utiliser le testeur vm et essayer d'allouer 1 Go de mémoire.  Comme nous n'avons réservé qu'1.5 Go sur un 3.Système de 75 Go, je suppose que cela devrait fonctionner.

# stress-ng --vm 1 --vm-bytes 1G --timeout 60s
stress-ng : info :  [17537] expédition de porcs : 1 VM
stress-ng : info :  [17537] allocation de cache : taille de cache par défaut : 46080 K
stress-ng : info :  [17537] exécution réussie terminée en 60.09s (1 min, 0.09 secondes)
# stress-ng --vm 2 --vm-bytes 1G --timeout 60s
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Essayons à nouveau avec plus de travailleurs, nous pouvons essayer 1, 2, 3, 4 travailleurs et à un moment donné, cela devrait échouer.  Dans mon test, il a réussi avec 1 et 2 travailleurs mais a échoué avec 3 travailleurs.

Réinitialisons la machine virtuelle.min_free_kbytes à un nombre faible et voyez si cela nous aide à exécuter 3 stresseurs de mémoire avec 1 Go chacun sur un 3.Système 75 Go.

# echo 67584 > /proc/sys/vm/min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Cette fois, il a fonctionné avec succès sans erreur, je l'ai essayé deux fois sans problème.  Je peux donc conclure qu'il y a une différence de comportement d'avoir plus de mémoire disponible pour malloc, lorsque le vm.la valeur min_free_kbytes est définie sur une valeur inférieure.

Paramètre par défaut pour vm.min_free_kbytes

La valeur par défaut du paramètre sur mon système est 67584, ce qui correspond à environ 1.8% de RAM sur le système ou 64 Mo. Pour des raisons de sécurité sur un système fortement sollicité, j'aurais tendance à l'augmenter un peu peut-être à 128 Mo pour permettre plus de mémoire libre réservée, mais pour une utilisation moyenne, la valeur par défaut semble assez raisonnable.  La documentation officielle met en garde contre une valeur trop élevée.  Le définir sur 5 ou 10 % de la RAM système n'est probablement pas l'utilisation prévue du paramètre et est trop élevé.

Configuration de la machine virtuelle.min_free_kbytes pour survivre aux redémarrages

Afin de vous assurer que le paramètre peut survivre aux redémarrages et n'est pas restauré aux valeurs par défaut lors du redémarrage, assurez-vous de rendre le paramètre sysctl persistant en mettant la nouvelle valeur souhaitée dans le fichier /etc/sysctl.fichier de configuration.

Conclusion

Nous avons vu que le vm.min_free_kbytes linux kernel tunable peut être modifié et peut réserver de la mémoire sur le système afin de garantir que le système est plus stable, en particulier lors d'une utilisation intensive et d'allocations de mémoire importantes.  Les paramètres par défaut peuvent être un peu trop bas, en particulier sur les systèmes à mémoire élevée et doivent être considérés comme étant augmentés avec précaution.  Nous avons vu que la mémoire réservée par cet accordable empêche le cache du système d'exploitation d'utiliser toute la mémoire et empêche également certaines opérations malloc d'utiliser également toute la mémoire.

Ports Open Source des moteurs de jeux commerciaux
Les récréations de moteur de jeu gratuites, open source et multiplateformes peuvent être utilisées pour jouer à d'anciens ainsi qu'à certains des titr...
Meilleurs jeux de ligne de commande pour Linux
La ligne de commande n'est pas seulement votre plus grand allié lorsque vous utilisez Linux, elle peut également être une source de divertissement car...
Meilleures applications de mappage de manette de jeu pour Linux
Si vous aimez jouer à des jeux sur Linux avec une manette de jeu au lieu d'un système de saisie clavier et souris typique, il existe des applications ...