Linux ne libère pas de cache de disque volumineux lorsque la demande de mémoire augmente

24

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/meminfosi ç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
trisweb
la source
3
Je n'ai aucune explication pour votre cache (bien que je soupçonne que des fichiers mmap y entrent probablement), mais pour le bien de l'humanité, prenez une pelle et de la chaux vive et débarrassez-vous du "vous n'avez pas besoin de swap" si vous avez beaucoup de RAM! " booster. Ils sont immunisés contre les discussions rationnelles et ils ont dangereusement tort. Le fait que le tueur OOM vous traque n'est qu'un symptôme de cela.
womble
Mes pensées exactement. Merci pour le conseil. Connaissez-vous d'autres bons articles ou arguments sur les raisons pour lesquelles l'échange est nécessaire?
trisweb
6
Parce que si vous n'avez pas d'échange, des choses comme ça se produisent. Mais ne vous embêtez pas à essayer de discuter avec votre négationniste; soit éclatez la chaux vive ou dites "si vous ne voulez pas échanger ici, vous corrigez ce désordre que vous avez insisté pour créer". Ils finiront par changer d'idée eux-mêmes ou ils mourront en essayant. Problème résolu de toute façon.
womble
Excellent, merci pour les conseils. Soit dit en passant, vous aviez raison sur les fichiers mmap - un rapide lsof montrait des morceaux de fichiers journaux occupant la mémoire. Les effacer a résolu le problème.
trisweb
Le problème est que sans swap, une sur-validation entraîne l'exécution du tueur OOM et une sur-validation ne se traduit pas par un système qui ne peut pas lancer de processus. Vous avez besoin de swap pour utiliser efficacement la RAM.
David Schwartz

Réponses:

8

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.

trisweb
la source
2
les pages mmap'd sont jetables, ce qui ne devrait pas provoquer l'épinglage du cache. Utilisez-vous un ramfs?
psusi
Salut, désolé de déterrer un ancien fil, mais je suis confronté au même problème actuellement et lsof -sne 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?
Ram
1
Merci pour le conseil! J'ajoute 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.
Nickolay
assurez-vous que vos fichiers ou programmes volumineux n'utilisent pas mlock. en /proc/meminforegardant les pages "Unvictable".
Michael Martinez