Sì, il kernel di Linux fornisce un meccanismo per questo:notifica della pressione della memoria . Questo è documentato in https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt, sezione Memory Pressure .
In breve, registri un descrittore di file eventfd in /sys/fs/cgroup/memory/memory.pressure_level
su cui vuoi ricevere le notifiche. Queste notifiche possono essere low
, medium
o critical
. Un tipico caso d'uso sarebbe quello di liberare alcune o tutte le cache interne nel tuo processo quando ricevi una notifica, al fine di prevenire un'imminente uccisione di OOM.
Quello che stai chiedendo è, fondamentalmente, un callback basato sul kernel su una condizione di memoria insufficiente, giusto? Se è così, credo fermamente che il kernel non lo faccia fornire tale meccanismo, e per una buona ragione: essendo a corto di memoria, dovrebbe eseguire immediatamente l'unica cosa che può liberare memoria:il killer OOM. Qualsiasi altro programma può arrestare la macchina.
Ad ogni modo, puoi eseguire una semplice soluzione di monitoraggio nello spazio utente. In passato avevo lo stesso requisito di debug/azione con poca memoria e ho scritto una semplice bash che ha fatto quanto segue:
-
monitor per una filigrana morbida: se l'utilizzo della memoria è superiore a questa soglia, raccogliere alcune statistiche (processi, memoria libera/utilizzata, ecc.) e inviare un'e-mail di avviso;
-
monitor per una filigrana reale: se l'utilizzo della memoria è superiore a questa soglia, raccogli alcune statistiche e interrompi i processi che consumano più memoria (o meno importanti), quindi invia un'e-mail di avviso.
Uno script di questo tipo sarebbe molto leggero e può eseguire il polling della macchina a piccoli intervalli (ad esempio:15 secondi)