Est-il possible de déclencher OOM-killer lors d'un échange forcé?

26

Est-il possible que le système permute de manière préventive les pages inactives ( vm.swappiness), mais invoque le tueur à gages lorsque le système manque de RAM (par opposition à manquer de mémoire) et est forcé de permuter?

Le but ultime est d'empêcher le système de s'arrêter lorsqu'il commence à écraser le disque en raison de défauts de page majeurs, tout en laissant les pages inactives permutées.

Un autre souhait serait de configurer la quantité de mémoire d'échange que le système est obligé d'utiliser avant le déclenchement de oom-killer. De cette façon, le système peut plonger un peu dans l'échange, tant qu'il ne va pas trop loin. Ou je pourrais définir un tel seuil pour déclencher oom-killer avant d'utiliser toute la RAM afin qu'il y ait toujours de la place pour le cache du système de fichiers (et ainsi éviter plus de thrash de disque).

Il ne semble pas que ce soit si difficile à faire. Il semble que vous puissiez simplement dire au tueur d'oom de se déclencher lorsque le système a X ram utilisé / libre. Mais c'est pourquoi je demande; Je ne sais pas.

Pour plus de précision, je ne cherche pas à désactiver le swap ou à ajuster le vm.swappinessparamètre

Patrick
la source
3
Chose intéressante, cela se produit même en l'absence de fichier d'échange. Apparemment, les fichiers mappés en mémoire seule (comme les exécutables, les bibliothèques, peut-être les ressources graphiques) sont à la place échangés.
WGH
L' OMD de Facebook est un démon de l'espace utilisateur conçu pour tuer les processus basés sur le débit global du système (c'est-à-dire uniquement lors du thrashing). Mais cela semble assez compliqué à configurer pour les postes de travail / postes de travail (qui ne mettent probablement pas les tâches dans des groupes de contrôle ou des conteneurs).
Jeffrey Bosboom

Réponses:

22

J'ai également eu du mal avec ce problème. Je veux juste que mon système reste réactif, quoi qu'il arrive, et je préfère perdre des processus à attendre quelques minutes. Il semble qu'il n'y ait aucun moyen d'y parvenir en utilisant le kernel oom killer.

Cependant, dans l'espace utilisateur, nous pouvons faire ce que nous voulons. J'ai donc écrit le premier démon OOM ( https://github.com/rfjakob/earlyoom ) qui tuera le plus gros processus (par RSS) une fois que la RAM disponible sera inférieure à 10%.

Sans earlyoom, il a été facile de verrouiller ma machine (8 Go de RAM) en démarrant http://www.unrealengine.com/html5/ plusieurs fois. Maintenant, les onglets du navigateur coupable sont tués avant que les choses ne dégénèrent.

Jakob
la source
1
Merci, c'est exactement ce que je cherchais. Je peux maintenant continuer à courir column -t -s,sur d'énormes fichiers csv et laisser le earlyoomtuer quand ce n'est pas possible, avant de remarquer une absence de réponse.
henfiber
4

Cela ressemble à une solution trop élaborée. Je suggérerais (et je le fais sur des machines que j'ai configurées qui n'ont pas besoin d'hiberner) d'allouer simplement une petite quantité d'espace de swap (128-256MiB). De cette façon, le noyau peut échanger certaines pages, mais le tueur OOM est invoqué avant que les choses ne tournent mal.

Si vous voulez vraiment faire cela, je pense que vous devrez écrire votre propre script / programme qui surveille l'utilisation du swap et invoque le tueur OOM en utilisant la clé Magic SysReq (ce qui peut être fait par programmation en écrivant à /proc/sysrq-trigger).

mgorven
la source
1
Je dirais qu'avoir un petit échange n'est pas une solution très élégante. Vous finissez par limiter l'utilité de votre échange. Que se passe-t-il si vous avez beaucoup de pages inactives et que vous auriez avantage à avoir 10 Go de swap autour? J'ai des boîtes avec environ 100 Go de RAM, où 10 Go de swap ne sont pas une idée farfelue. Et l'écriture d'une application pour le faire dans l'espace utilisateur est juste ouverte à des problèmes (par rapport à nativement dans le noyau).
Patrick
Parce qu'alors, vous avez essentiellement besoin d'un mécanisme pour distinguer le «bon échange» du «mauvais échange», et c'est un algorithme difficile à concevoir. La quantité de swap qui est appropriée dépend évidemment de la quantité de RAM et de la charge de travail que vous exécutez, donc si 10 Go sont appropriés pour vos machines
allouez
Pourquoi serait-ce difficile? Il n'y a que 2 types de swap, le swap préemptif dû au swap vm.swappinesset le swap forcé dû au manque de RAM. Tout ce qui doit arriver, c'est quand le noyau est obligé de permuter, pour déclencher oom-killer. Et 10 Go laisse également des tonnes d'espace pour un échange forcé afin de battre le disque.
Patrick