È 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.