Come controllare l'utilizzo di ulimit


29

Esiste un modo per verificare l'utilizzo degli ulimits per un determinato utente? So che puoi cambiare le ulimits per un singolo processo quando lo avvii o per una singola shell durante l'esecuzione, ma voglio essere in grado di "monitorare" quanto vicino è un utente a raggiungere i propri limiti. Sto programmando di scrivere uno bashscript che riporti alle statistiche l'attuale percentuale di utilizzo. In particolare, voglio monitorare:

  1. file aperti ( ulimit -n)
  2. max processi utente ( ulimit -u)
  3. segnali in sospeso ( ulimit -i)

Quello che voglio è la percentuale di utilizzo (0-100).


se hai attivato la contabilità di processo nel tuo kernel, puoi raccogliere statistiche dettagliate sull'utilizzo dei tuoi utenti.
Casey,

Come si attiva la contabilità di processo?
Hazmat,

E quanto sovraccarico aggiunge?
Hazmat,

Risposte:


22

Forse questo aiuta per la prima domanda:

Se si conoscono gli ID di processo (PID) dell'utente specifico, è possibile ottenere i limiti per ciascun processo con:

cat /proc/<PID>/limits

È possibile ottenere il numero di file aperti per ciascun PID con:

ls -1 /proc/<PID>/fd | wc -l

E quindi confronta il valore di Max open filescon il numero di descrittori di file aperti dal secondo comando per ottenere una percentuale.


8

Visualizza la percentuale attuale di file aperti, proc e segnali in sospeso, con diversi metodi e strumenti standard scomodi:

paste <(grep 'open files\|processes\|pending signals' /proc/self/limits | 
        cut -c27-38) \
      <(i=`whoami` ; lsof -u $i | tail -n +2 | awk {'print $9'} | wc -l; 
                     ps --no-headers -U $i -u $i u | wc -l ; 
                     ps -u $i -o pid= | xargs printf "/proc/%s/status\n" |
                                        xargs grep -s 'SigPnd' |
                                        sed 's/.*\t//' | paste -sd+ | bc ; ) |
while read a b ; do echo $((${b}00/a))%; done

Uscita sul mio sistema:

59%
9%
0%

Supponendo che quei numeri siano buoni, ciò che questa risposta mostra è che può essere fatto in shell, ma probabilmente non dovrebbe, a meno che non ci siano metodi di shell molto migliori. Piuttosto, questa Q sarebbe meglio con gcc, o python, ecc.


-4

Gli ulimit sono proprietà dei processi e sono ereditati dai processi figlio.

Non è possibile ottenere i limiti per un altro processo.


2
Senza senso. man lsof, man ps, ...
Gilles 'stop SO-essere male'

1
Sembra che tu capisca male come funziona UNIX e come lsof ottiene i suoi risultati. lsof legge la memoria del kernel per ottenere valori, non esiste un'interfaccia documentata utilizzata da lsof, quindi lsof fallirà nel caso in cui siano state apportate anche piccole modifiche alle strutture interne dei dati del kernel.
schily

2
Questo è un mal di testa per il lsofmanutentore, certo. Ma non pertinente per l'utente finale. Anche errato nel contesto di questa domanda, dal momento che si sta chiedendo specificamente su Linux, che ha documentato interfacce ( man proc).
Gilles 'SO- smetti di essere malvagio' il

Stai parlando di interfacce non documentate che sono soggette a modifiche senza preavviso in questo caso.
schily,

1
Non posso sottovalutare questa causa del mio basso rappresentante quindi commenterò-1
Zun
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.