Come limitare l'utilizzo delle risorse per risparmiare CPU + RAM per un determinato processo?


25

Ho un server di sviluppo su cui a sshdvolte smette di funzionare perché la macchina esaurisce la RAM. Sì, stiamo esaurendo la memoria e l'aggiornamento non è una scelta possibile al momento. Quello che voglio fare è dire alla macchina: "Fai quello che vuoi, ma lascia fuori 20 MB e un po 'di CPU sshd!".

Come può essere fatto?


Sshd non dovrebbe esplodere in quel modo, è normalmente un demone molto ben comportato. Assicurati che sia aggiornato all'ultimo / migliore. Che cosa ci fai? Stai eseguendo il piping di dati di massa attraverso di esso?
Marcin,

2
@Marcin Non credo di fare nulla di grosso, la modifica del testo. Anche se sshdsi comporta bene, penso che si bloccherebbe se non ci fosse abbastanza CPU / RAM da usare, no?
phunehehe,

Quando Linux esaurisce la memoria, inizia a uccidere i processi per recuperare la memoria. Potresti vedere OOM in azione (killer della memoria esaurita). Non so perché dovrebbe decidere di uccidere il tuo SSH in modo coerente però. Hai mai visto sshd effettivamente perdere (crescere di dimensioni) in modo orribile, prima che esploda, o funziona bene un momento ed è morto il prossimo?
Marcin,

Le probabilità di @Marcin sono che se è OOM il sistema è impantanato così tanto che non può semplicemente rispondere, non è un problema di sshd ma un problema con il suo carico. Purtroppo non conosco la risposta a questo.
xenoterracide,

@phunehehe sei sicuro che il problema non è memoria per ssh e non il tuo carico è sul tetto? sshd dà errori? qual è il carico sulla scatola? e cosa sta causando l'esaurimento della memoria del sistema.
xenoterracide,

Risposte:


9

Probabilmente puoi ottenere qualcosa del genere utilizzando cgroups con il controller delle risorse di memoria .

Immagino che metteresti tutte le tue attività che consumano risorse in un limitato (CPU e RAM) cgroupe lasceresti sshd"fuori" in modo che non sia limitato.

(L'aggiunta di più swap, anche sotto forma di un file di swap, potrebbe essere una buona opzione.)


Sono ancora titubante, non sembra facile (viziato da Ubuntu).
phunehehe,

oh, certamente non è facile :-) L'aggiunta di swap è di gran lunga più semplice.
Mat

@phunehehe benvenuto per essere un amministratore di sistema, non è facile. Ma ora devi imparare a fare cose non facili.
xenoterracide,

6

Oh, ma i cgroups sono facili :) Installa il pacchetto libcgroup. Creare un /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Inizia il cgconfigprocesso che creerà la gerarchia, i cgroups e imposterà i limiti. Se ciò ha esito positivo, hai due cgroup, entrambi con il 50% della CPU assegnato e 1G di memoria disponibile (non sai quale sia la tua quantità effettiva di memoria disponibile; supponendo che sia 2G in questo esempio). Ora devi solo spostare tutte le attività (cioè tutti i processi in esecuzione sul sistema) dal gruppo radice nel cgroup nosshd:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Quindi devi solo ottenere il PID del sshdprocesso e spostarlo nel file delle attività sshd:

cgroup]# echo $PID >> sshd/tasks

Ta-da, hai finito. Ora puoi essere certo che sshd avrà sempre il 50% della CPU e 1G di memoria.


1

Utilizzare reniceper ottenere una priorità più alta sshdo controllare la contabilità. (acct) -> con questo puoi impostare risorse per gli utenti, quindi esegui sshd con s


Vorrei aggiungere anche ionicea quello, e probabilmente iniziare sshd con bello non rinnegarlo in seguito.
xenoterracide,

1

Una soluzione più generale al problema dell'utilizzo delle risorse delle applicazioni consiste nell'eseguire le applicazioni in un contenitore tramite Docker . È quindi possibile eseguire contenitori con limiti di utilizzo della CPU e della memoria simili ai cgroups.

docker run -c=10 -m=1g my-container
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.