È possibile imporre una sorta di limite morbido al consumo di memoria dei processi?


10

Suppongo che non sia un problema così raro: un processo alloca enormi quantità di memoria (sia a causa di un bug di perdita di memoria, perché si tenta di elaborare un file di input di dimensioni impossibili, o altro). La RAM si riempie e ad un certo punto Linux deve passare allo scambio. Bene, a volte questa è solo l'ultima risorsa: se ho un calcolo costoso in corso, non voglio perdere dati se verso la fine esaurisco la RAM.

Piuttosto più spesso comunque (nella mia esperienza), il consumo di memoria è illimitato, da un processo canaglia, forse difettoso. Vale a dire, non finisco solo con alcuni dati meno urgentemente necessari per lo scambio, ma il sistema operativo è costretto a scambiare in modo panico un sacco di dati. E questo purtroppo non solo interrompe pesantemente il processo offensivo, ma può portare l'intero sistema quasi a un punto morto (non è più così male su macchine con SSD, ma OTOH mi fa preoccupare se scrivere gigabyte e gigabyte di dati spazzatura potrebbe a lungo termine danneggiare le celle flash).
Fino a quando non ho notato il problema e ho terminato manualmente il processo (una volta ci sono voluti alcuni minuti prima che mi fossi persino registrato in un terminale virtuale!), Metà della mia sessione di corsa è in scambio e devo aspettare un po 'finché il sistema non funziona senza problemi ancora.

Esiste una soluzione draconica al problema: applicare un limite di memoria rigida. Ma fare questo a livello di sistema a volte ucciderebbe i processi che preferirei ancora, e se devo farlo manualmente ulimitprima di iniziare un processo offensivo ... beh, spesso dimenticherò fino a quando non è troppo tardi.

Possibili tipi di soluzione di cui sarei più felice:

  • Se qualsiasi processo supera un determinato utilizzo della memoria, viene rallentato artificialmente in modo che il resto del sistema rimanga reattivo.
  • Se qualsiasi processo supera un determinato utilizzo della memoria, è SIGSTOPped quindi ho il tempo di capire cosa fare dopo.
  • Se un processo si avvicina al limite della RAM, ricevo un avviso prima che inizi il grande scambio.

C'è un modo per ottenere un simile comportamento o simile?


2
È possibile limitare la quantità di RAM utilizzata da un processo o un gruppo di processi, utilizzando cgroups. stackoverflow.com/questions/3043709/…
Mark Plotnick il

2
Questo è letteralmente il genere esatto di cosa ulimitserve.
DopeGhoti,

1
Ulimit -m sarebbe la cosa da usare, tranne per il fatto che non ha funzionato su Linux dalla 2.4.30, e ha funzionato solo in determinate situazioni prima. unix.stackexchange.com/questions/129587/…
Mark Plotnick,

niceload --noswap yourprg
Ole Tange,

Risposte:


6

niceload --noswap yourprg è fatto proprio per quella situazione: esamina l'attività di scambio:

  • In caso di sostituzione: consentire l'esecuzione del processo
  • In caso di scambio: consentire l'esecuzione del processo
  • Se si scambia dentro e fuori: sospendere il processo fino a quando lo scambio non si interrompe e riprendere il processo al termine dello scambio

Non sospende il processo prima dell'inizio dello scambio, ma consente di eseguire lo scambio per 1 secondo prima di agire.

niceload --mem 1G yourprgfunziona in modo simile: se meno di 1 GB è gratuito, youprg è sospeso. Quando più di 1 GB è gratuito, riprende il tuoprg.


0

Sì. È fatto abbastanza facilmente con praticamente qualsiasi shell moderna.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

È possibile utilizzare l' -lopzione per i limiti di memoria bloccata. Il processo verrà segnalato se viene superato il limite.


-1

Cronjob per cancellare la cache: Come cancellare la cache di memoria in Linux

In realtà ho problemi simili. Ho un sacco di utenti che eseguono i propri script personalizzati e ogni tanto i loro script consumano tutta la memoria disponibile e portano il server Redhat inattivo. Il motivo del consumo di massa di RAM era che i loro script potevano essere eseguiti per giorni solo aspettando un evento, quindi con risorse di risorse quando in realtà non ne utilizzava. Quindi quello che ho fatto è stato semplicemente forzare la pulizia della cache con un cronjob e da allora non ho più avuto problemi.

Semplice e pigro.


Hm. Suggerimento interessante, anche se temo che non faccia nulla per la maggior parte dei problemi che sto riscontrando. Il mio problema principale riguarda i singoli processi (applicazioni scientifiche) che possono allocare rapidamente molti gigabyte di memoria.
circa il

La cancellazione delle cache di solito introduce problemi di prestazioni. Molto occasionalmente risolvono problemi di prestazioni. Ma non renderanno disponibile la memoria quando non è presente.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.