Si j'ai bien compris, lorsque le système est presque vide, le noyau devrait commencer à tuer les processus pour récupérer de la mémoire. Mais dans mon système, cela ne se produit pas du tout.
Supposons un script simple qui alloue beaucoup plus de mémoire que ce qui est disponible dans le système (un tableau contenant des millions de chaînes, par exemple). Si j’exécute un script comme celui-ci (en tant qu’utilisateur normal), il n’obtient que toute la mémoire jusqu’à ce que le système se bloque complètement (seul SysRQ REISUB fonctionne).
La partie étrange ici est que lorsque l'ordinateur se bloque, le voyant du disque dur s'allume et reste ainsi jusqu'à ce que l'ordinateur soit redémarré, que je dispose ou non d'une partition de swap montée!
Donc mes questions sont:
- Ce comportement est-il normal? Il est étrange qu'une application exécutée en tant qu'utilisateur normal puisse planter le système de cette manière ...
- Puis-je faire en sorte qu'Ubuntu supprime automatiquement ces applications lorsqu'elles ont trop (ou plus) de mémoire?
Information additionnelle
- Ubuntu 12.04.3
- Noyau 3.5.0-44
RAM: ~ 3,7 Go à partir de 4 Go (partagé avec la carte graphique). *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
tail -n+1 /proc/sys/vm/overcommit_*
ajouter la sortie. Voir aussi ici: Comment configurer oom-killerAllocation failed
). Mais sans échange cela ne fait que figer l'ordinateur. Est-il censé fonctionner de cette façon (tuer seulement en utilisant swap)?Réponses:
De la documentation officielle
/proc/sys/vm/*
:Pour résumer, lorsqu’il est configuré
oom_kill_allocating_task
sur1
, au lieu d’analyser votre système à la recherche de processus à tuer, ce qui est une tâche coûteuse et lente, le noyau va juste tuer le processus qui a causé la perte de mémoire du système.D'après mes propres expériences, quand un MOO est déclenché, le noyau n'a plus assez de "force" pour effectuer une telle analyse, ce qui rend le système totalement inutilisable.
En outre, il serait plus évident de simplement supprimer la tâche à l'origine du problème. Je ne comprends donc pas pourquoi cette
0
option est définie par défaut.Pour le test, vous pouvez simplement écrire dans le pseudo-fichier approprié
/proc/sys/vm/
, qui sera annulé lors du prochain redémarrage:Pour un correctif permanent, écrivez ce qui suit dans
/etc/sysctl.conf
ou dans un nouveau fichier sous/etc/sysctl.d/
, avec une.conf
extension (/etc/sysctl.d/local.conf
par exemple):la source
0
par défaut." - parce que le processus qui a demandé de la mémoire n'est pas nécessairement celui qui a "causé le problème". Si le processus A exploite 99% de la mémoire du système, mais que le processus B, qui utilise 0,9%, est celui qui déclenche le tueur de MOO par malchance, B n'a pas "causé le problème" et cela n'a aucun sens de kill B. Si cette stratégie est mise en œuvre, des processus sans mémoire insuffisante risquent d'être tués par hasard en raison de l'utilisation effrénée de la mémoire par un processus différent .vm.admin_reserve_kbytes
passe à 128 Mo, par exemple . Le réglagevm.oom_kill_allocating_task = 1
semble résoudre le problème mais ne le résout pas vraiment (et Ubuntu gère déjà les bombes fourchettes par défaut).sudo sysctl -w vm.oom_kill_allocating_task=1
Mise à jour: le bogue est corrigé.
La réponse de Teresa est suffisante pour résoudre le problème et est bonne.
De plus, j'ai déposé un rapport de bogue parce que c'est définitivement un comportement cassé.
la source
Vous pouvez essayer earlyoom , un tueur de MOO qui opère dans l'espace utilisateur et tente de tuer le processus le plus important dans une situation de MOO.
la source
Tout d'abord, je recommande la mise à jour vers 13.10 (nouvelle installation, sauvegardez vos données).
Si vous ne souhaitez pas mettre à jour, remplacez vm.swappiness par 10 et si vous rencontrez des problèmes avec votre RAM, installez zRAM.
la source
vm.swappiness
fait plus de mal que de bien, encore plus sur les systèmes souffrant de problèmes de mémoire insuffisante.