Jak sprawdzić użycie ulimit

29

Czy jest jakiś sposób, aby sprawdzić wykorzystanie ulimits dla danego użytkownika? Wiem, że możesz zmienić limity dla pojedynczego procesu podczas uruchamiania lub dla pojedynczej powłoki podczas działania, ale chcę być w stanie „monitorować”, jak blisko użytkownik osiąga swoje limity. bashPlanuję napisać skrypt, który zgłosi statsd bieżący procent wykorzystania. W szczególności chcę śledzić:

  1. otwórz pliki ( ulimit -n)
  2. maksymalna liczba procesów użytkownika ( ulimit -u)
  3. oczekujące sygnały ( ulimit -i)

To, czego chcę, to procent użytkowania (0-100).

hazmat
źródło
jeśli masz włączone rozliczanie procesów w jądrze, możesz zbierać szczegółowe statystyki użytkowania dotyczące twoich użytkowników.
Casey
Jak włączyć rozliczanie procesów?
hazmat
A ile to narzut?
hazmat

Odpowiedzi:

22

Może to pomaga w pierwszym pytaniu:

Jeśli znasz identyfikatory procesu (PID) konkretnego użytkownika, możesz uzyskać limity dla każdego procesu za pomocą:

cat /proc/<PID>/limits

Możesz uzyskać liczbę otwartych plików dla każdego PID za pomocą:

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

A następnie po prostu porównaj wartość Max open filesz liczbą otwartych deskryptorów plików z drugiego polecenia, aby uzyskać wartość procentową.

m13r
źródło
8

Wysyła procent bieżącego użytkownika do otwartych plików, proc i oczekujących sygnałów, za pomocą kilku niewygodnych metod i standardowych narzędzi:

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

Dane wyjściowe w moim systemie:

59%
9%
0%

Zakładając, że te liczby są dobre, ta odpowiedź pokazuje, że można to zrobić w powłoce, ale prawdopodobnie nie powinno, chyba że istnieją znacznie lepsze metody powłoki. Przeciwnie, to Q lepiej byłoby zrobić z gcc, lub python, etc.

agc
źródło
-4

Ograniczenia są właściwościami procesów i są dziedziczone po procesach potomnych.

Nie można uzyskać limitów dla innego procesu.

schily
źródło
2
Nonsens. man lsof, man ps...
Gilles 'SO- przestać być zła'
1
Wydaje się, że nie rozumiesz, jak działa UNIX i jak lsof uzyskuje jego wyniki. lsof odczytuje pamięć jądra, aby uzyskać wartości, nie ma udokumentowanego interfejsu, który byłby używany przez lsof, więc lsof zawiedzie w przypadku, gdy zostaną wprowadzone nawet niewielkie zmiany w wewnętrznych strukturach danych jądra.
schily
2
To jest ból głowy dla lsofopiekuna, jasne. Ale nie dotyczy użytkownika końcowego. Również niepoprawny w kontekście tego pytania, ponieważ pyta konkretnie o Linuksa, który ma udokumentowane interfejsy ( man proc).
Gilles „SO- przestań być zły”
Mówisz o nieudokumentowanych interfejsach, które mogą ulec zmianie bez powiadomienia w tym przypadku.
schily
1
Nie mogę downvote tę przyczynę mojego niskiego rep więc będę tylko komentować-1
ZUN