Exécuter Ubuntu sur un noyau 2.6.31-302 x86-64. Le problème global est que j'ai de la mémoire dans la catégorie «mise en cache» qui continue d'augmenter et ne sera pas libérée ou utilisée même lorsque notre application en aura besoin.
Voici donc ce que je retire de la commande «libre». Rien de tout cela ne sort de l'ordinaire à première vue.
# free
total used free shared buffers cached
Mem: 7358492 5750320 1608172 0 7848 1443820
-/+ buffers/cache: 4298652 3059840
Swap: 0 0 0
La première chose que quelqu'un va dire est "Ne vous inquiétez pas, Linux gère cette mémoire automatiquement." Oui, je sais comment le gestionnaire de mémoire est censé fonctionner; le problème est qu'il ne fait pas la bonne chose. Les 1,4 Go «mis en cache» semblent ici réservés et inutilisables.
Ma connaissance de Linux me dit que 3 Go sont "gratuits"; mais le comportement du système dit le contraire. Lorsque les 1,6 Go de mémoire libre réelle sont utilisés pendant une utilisation maximale, dès que davantage de mémoire est demandée (et que le «libre» dans la première colonne approche 0), le tueur OOM est appelé, les processus sont tués et des problèmes commencent à survenir même si le «libre» dans la ligne - / + tampons / cache a toujours environ 1,4 Go «libre».
J'ai réglé les valeurs oom_adj sur les processus clés pour ne pas mettre le système à genoux, mais même alors, les processus importants seront tués, et nous ne voulons jamais atteindre ce point. Surtout quand, théoriquement, 1,4 Go est toujours "libre" si cela n'évincerait que le cache disque.
Quelqu'un a-t-il une idée de ce qui se passe ici? Internet est inondé de questions stupides sur la commande «libre» de Linux et «pourquoi n'ai-je pas de mémoire libre» et je ne trouve rien à propos de ce problème à cause de cela.
La première chose qui me vient à l'esprit est que l'échange est désactivé. Nous avons un administrateur système qui est catégorique à ce sujet; Je suis ouvert aux explications si elles sont sauvegardées. Cela pourrait-il causer des problèmes?
Voici gratuit après l'exécution echo 3 > /proc/sys/vm/drop_caches
:
# free
total used free shared buffers cached
Mem: 7358492 5731688 1626804 0 524 1406000
-/+ buffers/cache: 4325164 3033328
Swap: 0 0 0
Comme vous pouvez le voir, une quantité minuscule de cache est effectivement libérée, mais environ 1,4 Go semble être «bloqué». L'autre problème est que cette valeur semble augmenter avec le temps. Sur un autre serveur, 2,0 Go sont bloqués.
J'aimerais vraiment retrouver ce souvenir ... toute aide serait très appréciée.
Voici cat /proc/meminfo
si ça vaut quelque chose:
# cat /proc/meminfo
MemTotal: 7358492 kB
MemFree: 1472180 kB
Buffers: 5328 kB
Cached: 1435456 kB
SwapCached: 0 kB
Active: 5524644 kB
Inactive: 41380 kB
Active(anon): 5492108 kB
Inactive(anon): 0 kB
Active(file): 32536 kB
Inactive(file): 41380 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 320 kB
Writeback: 0 kB
AnonPages: 4125252 kB
Mapped: 42536 kB
Slab: 29432 kB
SReclaimable: 13872 kB
SUnreclaim: 15560 kB
PageTables: 0 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3679244 kB
Committed_AS: 7223012 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 7696 kB
VmallocChunk: 34359729675 kB
DirectMap4k: 7340032 kB
DirectMap2M: 0 kB
la source
Réponses:
J'ai découvert la réponse à ma propre question - grâce à l'aide de womble (soumettez une réponse si vous le souhaitez).
lsof -s
montre les descripteurs de fichiers en cours d'utilisation et il s'avère que plusieurs gigaoctets de fichiers journaux mmap prenaient le cache.L'implémentation d'un logrotate devrait résoudre complètement le problème et me permettre de profiter de plus de mémoire.
Je vais également réactiver le swap afin que nous n'ayons aucun problème avec le tueur OOM à l'avenir. Merci.
la source
lsof -s
ne montre aucune utilisation inhabituelle. Cependant, j'utilise un ramfs comme vous l'avez dit [et le noyau 2.6.10, qui n'a pas la fonction drop_caches]. Selon vous, quel est le suspect probable?lsof -s | sort -rnk 7 | less
à ma boîte à outils maintenant. Une note pour les autres lecteurs: cela peut sembler de grandes entrées/proc/net/rpc/nfs4.nametoid/channel
, mais ils ne se sont pas révélés être les coupables dans mon cas./proc/meminfo
regardant les pages "Unvictable".Apparemment, les postgres
shared_buffers
peuvent apparaîtrecached
, sans être facilement jetables ... Voir MOO malgré la mémoire disponible (cache)la source