Como verificar o uso de ulimit

29

Existe alguma maneira de verificar o uso dos ulimits para um determinado usuário? Eu sei que você pode alterar ulimits para um único processo ao inicializá-lo ou para um único shell durante a execução, mas eu quero poder "monitorar" o quão perto um usuário está de atingir seus limites. Estou pensando em escrever um bashscript que reportará de volta a statsd a porcentagem de uso atual. Especificamente, eu quero acompanhar:

  1. abrir arquivos ( ulimit -n)
  2. processos máximos de usuários ( ulimit -u)
  3. sinais pendentes ( ulimit -i)

O que eu quero é a porcentagem de uso (0-100).

hazmat
fonte
se você tiver a contabilidade de processos ativada em seu kernel, poderá coletar estatísticas detalhadas de uso sobre seus usuários.
Casey
Como você ativa a contabilidade de processos?
hazmat
E quanto custa isso acrescenta?
hazmat

Respostas:

22

Talvez isso ajude na primeira pergunta:

Se você conhece os IDs do processo (PID) do usuário específico, pode obter os limites de cada processo com:

cat /proc/<PID>/limits

Você pode obter o número de arquivos abertos para cada PID com:

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

E então basta comparar o valor de Max open filescom o número de descritores de arquivos abertos do segundo comando para obter uma porcentagem.

m13r
fonte
8

Gera a porcentagem atual de arquivos abertos, proc e sinais pendentes do usuário, por vários métodos inconvenientes e ferramentas padrão:

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

Saída no meu sistema:

59%
9%
0%

Supondo que esses números sejam bons, o que esta resposta mostra é que isso pode ser feito no shell, mas provavelmente não deveria, a menos que haja métodos shell muito melhores. Em vez disso, esse Q seria melhor feito com gcc, ou python, etc.

agc
fonte
-4

Ulimits são propriedades de processos e são herdados para processos filhos.

Você não pode obter os limites para outro processo.

esperto
fonte
2
Absurdo. man lsof, man ps, ...
Gilles 'stop SO estar mal'
1
Você parece entender mal como o UNIX funciona e como lsof obtém seus resultados. lsof lê a memória do kernel para obter valores; não há uma interface documentada usada pelo lsof; portanto, o lsof falhará caso sejam feitas pequenas alterações nas estruturas internas de dados do kernel.
schily 18/09/2015
2
Isso é uma dor de cabeça para o lsofmantenedor, com certeza. Mas não é relevante para o usuário final. Também incorreto no contexto desta pergunta, pois está perguntando especificamente sobre o Linux, que possui interfaces documentadas ( man proc).
Gilles 'SO- stop be evil'
Você está falando de interfaces não documentadas que estão sujeitas a alterações sem aviso prévio neste caso.
schily 18/09/2015
1
Eu não posso rebaixar essa causa do meu representante baixo, então vou apenas comentar-1
Zun