Qu'est-ce que la machine virtuelle.min_free_kbytes et comment le régler?

Qu'est-ce que la machine virtuelle.min_free_kbytes et comment le régler?
Qu'est-ce que la machine virtuelle.min_free_kbytes sysctl accordable pour le noyau Linux et quelle valeur devrait-elle être définie pour? Nous étudierons ce paramètre et comment il a un impact sur un système Linux en cours d'exécution dans cet article. Nous allons tester son impact sur le cache de la page OS et sur Mallocs et ce que la commande System Free montre lorsque ce paramètre est défini. Nous ferons des suppositions éduquées sur les valeurs idéales pour ce réglable 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

Le système peut être nécessaire de la mémoire 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 lutter contre la mémoire pour des opérations régulières pour que le système d'exploitation fonctionne en douceur. C'est pourquoi le noyau fournit la machine virtuelle réglable.min_free_kbytes. L'accordable obligera le gestionnaire de mémoire du noyau à conserver au moins x quantité de mémoire libre. Voici la définition officielle de la documentation du noyau Linux: «Ceci est utilisé pour forcer la machine virtuelle Linux à garder un nombre minimum de kilo-kilo-kilo-kilo. La machine virtuelle utilise ce nombre pour calculer une valeur de filigrane [wmark_min] pour chaque zone lowmem dans le système. Chaque zone LowMem obtient un certain nombre de pages libres réservées basées sur sa taille. Une quantité minimale de mémoire est nécessaire pour satisfaire les allocations PF_MEMALLOC; Si vous définissez ceci sur inférieur à 1024 Ko, votre système deviendra subtilement brisé et sujette à une impasse sous des charges élevées. Le réglage trop haut sera instantanément votre machine."

Valider la machine virtuelle.min_free_kbytes fonctionne

Afin de tester que le réglage de min_free_kbytes fonctionne comme conçu, j'ai créé une instance virtuelle Linux avec seulement 3.75 Go de RAM. Utilisez la commande libre ci-dessous pour analyser le système:

# gratuit -m

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

Maintenant, nous allons modifier la valeur de la machine virtuelle.min_free_kbytes et voyez quel est l'impact sur la mémoire du système. Nous ferons écho à la nouvelle valeur au système de fichiers virtuel Proc pour modifier la valeur du paramètre du noyau selon:

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

Vous pouvez voir que le paramètre a été changé en 1.5 Go approximativement et a pris effet. Maintenant utilisons le gratuit commande à nouveau pour voir des modifications reconnues par le système.

# gratuit -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. Qui est une réduction approximative du changement du paramètre à 1.Mémoire libre de 5 Go min.

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 dans 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 sortir:

# dd if = / dev / aléatoire de = / root / d1.Count txt = 1000000
# pour i dans 'seq 1 70'; faire écho $ i; chat / racine / d1.txt >> / root / data_file; fait

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

# Cat Data_file> / dev / null

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

# gratuit -m

Analyser les résultats ci-dessus. Nous avons encore 1.8 Go de mémoire libre afin que le noyau ait protégé un grand morceau de mémoire comme réservé en raison 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 2.3 Go. Apparemment tout le monde fichier de données ne pouvait pas être stocké dans le cache en raison du manque de mémoire disponible à utiliser pour le cache tampon. Nous pouvons valider que l'ensemble du fichier n'est pas stocké dans Cache mais chronométrant les tentatives répétées pour lire le 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

Le fichier lu a pris près de 20 secondes, ce qui implique que ce n'est certainement pas tout mis en cache.

Comme une dernière validation, réduisons la machine virtuelle.min_free_kbytes permettre au cache de page d'avoir plus d'espace pour fonctionner et nous pouvons nous attendre à voir le cache fonctionner et le fichier Lire de plus en plus rapidement.

# 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 la mémoire d'un programme C face à cette machine virtuelle vraiment élevée.Paramètre MIN_FREE_KBYTE. Est-ce que cela échouera au malloc? Le système mourra-t-il? Réinitialisez d'abord la machine virtuelle.MIN_FREE_KBYTES Réglage à la valeur vraiment élevée pour reprendre nos expériences:

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

Regardons à nouveau notre mémoire libre:

Théoriquement nous avons 1.9 Go gratuitement et 515 MB disponibles. Utilisons un programme de test de stress appelé Stress-NG afin d'utiliser une certaine mémoire et de voir où nous échouons. Nous utiliserons le testeur VM et essaierons d'allouer 1 Go de mémoire. Puisque nous n'avons réservé que 1.5 Go sur un 3.Système de 75 Go, je suppose que cela devrait fonctionner.

# stress-ng --vm 1 --vm-octets 1g - Timeout 60s
Stress-NG: Info: [17537] Discatting Hogs: 1 VM
Stress-NG: Info: [17537] Alloue du cache: Taille du cache par défaut: 46080K
Stress-ng: info: [17537] Une course réussie terminée en 60.09S (1 min, 0.09 Secs)
# stress-ng --vm 2 --vm-octets 1g - Timeout 60s
# stress-ng --vm 3 --vm-octets 1g - Timeout 60s

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

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

# echo 67584> / proc / sys / vm / min_free_kbytes
# stress-ng --vm 3 --vm-octets 1g - Timeout 60s

Cette fois, il a fonctionné avec succès sans erreur, je l'ai essayé deux fois sans problèmes. Je peux donc conclure qu'il existe une différence comportementale d'avoir plus de mémoire disponible pour Malloc, lorsque la machine virtuelle.min_free_kbytes La valeur est définie sur une valeur inférieure.

Paramètre par défaut pour la machine virtuelle.min_free_kbytes

La valeur par défaut du paramètre sur mon système est de 67584, soit environ 1.8% de RAM sur le système ou 64 Mo. Pour des raisons de sécurité sur un système fortement battu, j'aurais tendance à l'augmenter un peu peut-être à 128 Mo pour permettre une mémoire libre plus réservée, mais pour l'utilisation moyenne, la valeur par défaut semble suffisamment sensée. La documentation officielle prévient de rendre la valeur trop élevée. Le régler à 5 ou 10% du système RAM n'est probablement pas l'utilisation prévue du réglage et est trop élevée.

Définition de la machine virtuelle.min_free_kbytes pour survivre les redémarrages

Afin de s'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 / etc / sysctl.fichier de confr.

Conclusion

Nous avons vu que la machine virtuelle.min_free_kbytes Linux Le noyau réglable peut être modifié et peut réserver la mémoire sur le système afin de s'assurer que le système est plus stable, en particulier pendant une utilisation intensive et des allocations de mémoire lourde. Les paramètres par défaut peuvent être un peu trop faibles, en particulier sur les systèmes de mémoire élevée et doivent être considérés comme augmentés soigneusement. Nous avons vu que la mémoire réservée par cet réglable empêche le cache du système d'exploitation d'utiliser toute la mémoire et empêche également certaines opérations de Malloc d'utiliser toute la mémoire aussi.