Oui, le noyau Linux fournit un mécanisme pour cela :notification de pression de mémoire . Ceci est documenté dans https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt, section Memory Pressure .
En bref, vous enregistrez un descripteur de fichier eventfd dans /sys/fs/cgroup/memory/memory.pressure_level
sur lequel vous souhaitez recevoir des notifications. Ces notifications peuvent être low
, medium
, ou critical
. Un cas d'utilisation typique consisterait à libérer tout ou partie des caches internes de votre processus lorsque vous recevez une notification, afin d'éviter une mise à mort imminente du MOO.
Ce que vous demandez est, en gros, un rappel basé sur le noyau sur une condition de mémoire insuffisante, n'est-ce pas ? Si c'est le cas, je crois fermement que le noyau ne le fait pas fournir un tel mécanisme, et pour une bonne raison : étant à court de mémoire, il devrait immédiatement exécuter la seule chose qui peut libérer de la mémoire - le tueur OOM. Tout autre programme peut arrêter la machine.
Quoi qu'il en soit, vous pouvez exécuter une solution de surveillance simple dans l'espace utilisateur. J'avais la même exigence de débogage/action à faible mémoire dans le passé, et j'ai écrit un bash simple qui a fait ce qui suit :
-
surveiller un filigrane souple : si l'utilisation de la mémoire est supérieure à ce seuil, collecter des statistiques (processus, mémoire libre/utilisée, etc.) et envoyer un e-mail d'avertissement ;
-
surveiller un filigrane dur : si l'utilisation de la mémoire est supérieure à ce seuil, collectez des statistiques et tuez les processus les plus gourmands en mémoire (ou les moins importants), puis envoyez un e-mail d'alerte.
Un tel script serait très léger et pourrait interroger la machine à intervalles rapprochés (c'est-à-dire :15 secondes)