web-dev-qa-db-fra.com

vm / min_free_kbytes - Pourquoi conserver la mémoire minimale réservée?

Selon cela article :

/ proc/sys/vm/min_free_kbytes: Ceci contrôle la quantité de mémoire qui est gardée libre pour être utilisée par les réserves spéciales, y compris les allocations "atomiques" (celles qui ne peuvent pas attendre la récupération)

Ma question est que qu'est-ce que cela signifie par "ceux qui ne peuvent pas attendre la récupération"? En d'autres termes, j'aimerais comprendre pourquoi il est nécessaire de dire au système de toujours garder une certaine quantité minimale de mémoire libre et dans quelles circonstances cette mémoire sera-t-elle utilisée? [Il doit être utilisé par quelque chose; ne vois pas le besoin autrement]

Ma deuxième question: la définition de cette mémoire à quelque chose de plus de 4 Mo (sur mon système) conduit-elle à de meilleures performances? Nous avons un serveur qui présente parfois de très mauvaises performances Shell (par exemple, ls -l prend 10 à 15 secondes pour s'exécuter) lorsque certains processus démarrent et si la définition de ce nombre sur quelque chose de plus élevé entraînera de meilleures performances Shell?

19
user3063877

(le lien est mort, on dirait que c'est maintenant ici )

Ce texte fait référence aux allocations atomiques, qui sont des demandes de mémoire qui doivent être satisfaites sans abandonner le contrôle (c'est-à-dire que le thread actuel ne peut pas être suspendu). Cela se produit le plus souvent dans les routines d'interruption, mais cela s'applique à tous les cas où la mémoire est nécessaire tout en maintenant un verrou essentiel. Ces allocations doivent être immédiates, car vous ne pouvez pas vous permettre d'attendre que le swapper libère de la mémoire.

Voir Linux-MM pour une explication plus approfondie, mais voici le processus d'allocation de mémoire en bref:

  • _alloc_pages itère d'abord sur chaque zone mémoire en recherchant la première qui contient des pages gratuites éligibles
  • _alloc_pages réveille ensuite la tâche kswapd [..à ..] puisez dans les pools de mémoire de réserve maintenus pour chaque zone.
  • Si l'allocation de mémoire échoue toujours, les pages _alloc abandonneront [..] Dans ce processus, _alloc_pages exécute un cond_resched () qui peut provoquer un sommeil, c'est pourquoi cette branche est interdite aux allocations avec GFP_ATOMIC .

min_free_kbytes est peu susceptible d'aider beaucoup avec le "ls -l décrit prend 10-15 secondes à exécuter"; cela est probablement dû à la pression de la mémoire générale et à l'échange plutôt qu'à l'épuisement de la zone. Le paramètre min_free_kbytes n'a besoin que d'autoriser suffisamment de pages libres pour traiter les demandes immédiates. Dès que le fonctionnement normal reprend, le processus de permutation peut être exécuté pour rééquilibrer les zones de mémoire. La seule fois où j'ai eu à augmenter min_free_kbytes, c'est après avoir activé les trames jumbo sur une carte réseau qui ne supportait pas la diffusion dma.

Pour développer un peu votre deuxième question, vous obtiendrez de meilleurs résultats en ajustant vm.swappiness et les ratios sales mentionnés dans l'article lié. Cependant, sachez que l'optimisation des performances "ls -l" peut ralentir d'autres processus. N'optimisez jamais pour un cas d'utilisation non principal.

12
Arno

Tous les systèmes Linux tenteront d'utiliser toute la mémoire physique disponible pour le système, souvent en créant un cache de tampon de système de fichiers, qui est simplement un tampon d'E/S pour aider à améliorer les performances du système. Techniquement, cette mémoire est pas utilisée, même si elle est allouée pour la mise en cache.

"attendre la récupération", dans votre question, fait référence au processus de récupération de la mémoire cache qui n'est "pas utilisée" afin qu'elle puisse être allouée à un processus. Cela est censé être transparent, mais dans le monde réel, de nombreux processus n'attendent pas que cette mémoire soit disponible. Java est un bon exemple, en particulier lorsqu'une grande taille de segment de mémoire minimale a été définie. Le processus essaie d'allouer la mémoire et si elle n'est pas instantanément disponible dans un grand bloc contigu (atomique?), le processus meurt.

Réserver une certaine quantité de mémoire avec min_free_kbytes permet à cette mémoire d'être disponible instantanément et réduit la pression de la mémoire lorsque de nouveaux processus doivent démarrer, s'exécuter et se terminer alors qu'il y a une charge de mémoire élevée et un cache tampon complet.

4 Mo semblent plutôt faibles car si le cache de tampon est plein, tout processus qui souhaite une allocation immédiate de plus de 4 Mo échouera probablement. Le paramètre est très réglable et spécifique au système, mais si vous disposez de quelques Go de mémoire, cela ne peut pas nuire à augmenter la mémoire de réserve à 128 Mo. Je ne sais pas quel effet cela aura sur l'interactivité de Shell, mais probablement positif.

7
Shaun Dewberry

Cette mémoire n'est pas utilisée par les processus normaux. Comme @Arno l'a mentionné, les processus spéciaux qui peuvent s'exécuter incluent des routines d'interruption, qui doivent être exécutées maintenant (car c'est une interruption) et se terminer avant que tout autre processus puisse s'exécuter (atomique). Cela peut inclure des choses comme l'échange de mémoire sur le disque lorsque la mémoire est pleine.

Si la mémoire est remplie, un processus d'interruption (gestion de la mémoire) s'exécute pour échanger de la mémoire sur le disque afin qu'il puisse libérer de la mémoire pour une utilisation par des processus normaux. Mais si vm.min_free_kbytes est trop petit pour fonctionner, puis il verrouille le système. En effet, ce processus d'interruption doit d'abord s'exécuter pour libérer de la mémoire afin que d'autres puissent s'exécuter, mais il est ensuite bloqué car il n'a pas assez de mémoire réservée vm.min_free_kbytes pour accomplir sa tâche entraînant un blocage.

Regarde aussi:

6
pd12