Wyszukiwanie w witrynie

LFCS: Monitoruj wykorzystanie zasobów procesów systemu Linux i ustawiaj limity procesów dla poszczególnych użytkowników — część 14


W związku z ostatnimi zmianami w celach egzaminów certyfikacyjnych LFCS, które obowiązują od 2 lutego 2016, dodajemy potrzebne artykuły do opublikowanej tutaj serii LFCS. Aby przygotować się do tego egzaminu, gorąco zachęcamy do przejścia także serii LFCE.

Każdy administrator systemu Linux musi wiedzieć, jak zweryfikować integralność i dostępność sprzętu, zasobów i kluczowych procesów. Ponadto ustalanie limitów zasobów dla każdego użytkownika musi również należeć do jego umiejętności.

W tym artykule przeanalizujemy kilka sposobów zapewnienia prawidłowego działania zarówno sprzętu, jak i oprogramowania systemu, aby uniknąć potencjalnych problemów, które mogą spowodować nieoczekiwane przestoje w produkcji i straty finansowe.

Statystyki procesorów raportujących dla systemu Linux

Dzięki mpstat możesz przeglądać działania każdego procesora z osobna lub systemu jako całości, zarówno jako jednorazowa migawka, jak i dynamicznie.

Aby korzystać z tego narzędzia, musisz zainstalować sysstat:

yum update && yum install sysstat              [On CentOS based systems]
aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
zypper update && zypper install sysstat        [On openSUSE systems]

Przeczytaj więcej o sysstat i jego narzędziach w Poznaj Sysstat i jego narzędzia mpstat, pidstat, iostat i sar w systemie Linux

Po zainstalowaniu mpstat użyj go do generowania raportów statystyk procesorów.

Aby wyświetlić 3 globalne raporty wykorzystania procesora (-u) dla wszystkich procesorów (jak wskazuje -P ALL) w odstępie 2 sekund , Do:

mpstat -P ALL -u 2 3
Przykładowe wyjście
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

Aby wyświetlić te same statystyki dla konkretnego CPU (w poniższym przykładzie CPU 0), użyj:

mpstat -P 0 -u 2 3
Przykładowe wyjście
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

Dane wyjściowe powyższych poleceń pokazują następujące kolumny:

  1. CPU: numer procesora jako liczba całkowita lub słowo all jako średnia dla wszystkich procesorów.
  2. %usr: Procent wykorzystania procesora podczas uruchamiania aplikacji na poziomie użytkownika.
  3. %nice: To samo co %usr, ale z ładnym priorytetem.
  4. %sys: Procent wykorzystania procesora, który wystąpił podczas wykonywania aplikacji jądra. Nie obejmuje to czasu spędzonego na obsłudze przerwań lub obsłudze sprzętu.
  5. %iowait: Procent czasu, przez jaki dany procesor (lub wszystkie) był bezczynny, podczas którego zaplanowano na tym procesorze operację we/wy wymagającą dużej ilości zasobów. Bardziej szczegółowe wyjaśnienie (z przykładami) można znaleźć tutaj.
  6. %irq: Procent czasu spędzonego na obsłudze przerwań sprzętowych.
  7. %soft: To samo co %irq, ale z przerwaniami programowymi.
  8. %steal: Procent czasu spędzonego na mimowolnym oczekiwaniu (kradzież lub kradzież), gdy maszyna wirtualna jako gość „zdobywa” uwagę hypervisora podczas rywalizacji o procesor(y). Wartość ta powinna być jak najmniejsza. Wysoka wartość w tym polu oznacza, że maszyna wirtualna się zawiesza – lub wkrótce tak się stanie.
  9. %guest: Procent czasu spędzonego na uruchomieniu procesora wirtualnego.
  10. %idle: procent czasu, kiedy procesory nie wykonywały żadnych zadań. Jeśli zaobserwujesz niską wartość w tej kolumnie, oznacza to, że system znajduje się pod dużym obciążeniem. W takim przypadku będziesz musiał przyjrzeć się bliżej liście procesów, co omówimy za chwilę, aby ustalić, co jest przyczyną.

Aby umieścić procesor pod nieco większym obciążeniem, uruchom następujące polecenia, a następnie wykonaj mpstat (jak wskazano) w osobnym terminalu:

dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3

Na koniec porównaj z wynikami mpstat w „normalnych” okolicznościach:

Jak widać na powyższym obrazku, CPU 0 był mocno obciążony w pierwszych dwóch przykładach, co wskazuje kolumna %idle.

W następnej sekcji omówimy, jak zidentyfikować te procesy wymagające dużych zasobów, jak uzyskać o nich więcej informacji i jak podjąć odpowiednie działania.

Raportowanie procesów Linuksa

Aby wyświetlić listę procesów sortujących je według użycia procesora, użyjemy dobrze znanego polecenia ps z -eo (aby wybrać wszystkie procesy w formacie zdefiniowanym przez użytkownika) i --sort (aby określić niestandardową kolejność sortowania), takie jak poniżej:

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

Powyższe polecenie pokaże tylko PID, PPID, polecenie powiązane z procesem oraz procent użycia procesora i pamięci RAM, posortowany według procentu użycia procesora w kolejności malejącej . Po wykonaniu podczas tworzenia pliku .iso oto kilka pierwszych wierszy wyniku:

Po zidentyfikowaniu interesującego nas procesu (np. tego z PID=2822) możemy przejść do /proc/PID (/proc/2822 w tym przypadku) i wykonaj listę katalogów.

W tym katalogu przechowywanych jest kilka plików i podkatalogów ze szczegółowymi informacjami na temat tego konkretnego procesu, gdy jest on uruchomiony.

Na przykład:
  1. /proc/2822/io zawiera statystyki IO dla procesu (liczba znaków i bajtów odczytywanych i zapisywanych m.in. podczas operacji IO).
  2. /proc/2822/attr/current pokazuje aktualne atrybuty bezpieczeństwa procesu SELinux.
  3. /proc/2822/cgroup opisuje grupy kontrolne (w skrócie cgroups), do których należy proces, jeśli włączona jest opcja konfiguracji jądra CONFIG_CGROUPS, co możesz zweryfikować za pomocą:
cat /boot/config-$(uname -r) | grep -i cgroups

Jeżeli opcja jest włączona, powinieneś zobaczyć:

CONFIG_CGROUPS=y

Używając cgroups, możesz zarządzać ilością dozwolonego użycia zasobów w poszczególnych procesach, jak wyjaśniono w rozdziałach 1 do 4 przewodnika po zarządzaniu zasobami Red Hat Enterprise Linux 7, w rozdziale 9 analizy systemu openSUSE i przewodnik dostrajania oraz w sekcji Grupy kontrolne dokumentacji serwera Ubuntu 14.04.

/proc/2822/fd to katalog zawierający jedno dowiązanie symboliczne dla każdego deskryptora pliku otwartego przez proces. Poniższy obraz przedstawia informacje dotyczące procesu rozpoczętego w tty1 (pierwszym terminalu) w celu utworzenia obrazu .iso:

Powyższy obraz pokazuje, że stdin (deskryptor pliku 0), stdout (deskryptor pliku 1) i stderr (deskryptor pliku 2) są mapowane do /dev/zero, /root/test.iso i /dev/tty1.

Więcej informacji na temat /proc można znaleźć w dokumencie „System plików /proc” prowadzonym i utrzymywanym przez Kernel.org oraz w Podręczniku programisty Linuksa.

Ustawianie limitów zasobów dla poszczególnych użytkowników w systemie Linux

Jeśli nie będziesz ostrożny i pozwolisz dowolnemu użytkownikowi na uruchamianie nieograniczonej liczby procesów, możesz w końcu doświadczyć nieoczekiwanego zamknięcia systemu lub zablokowania, gdy system wejdzie w stan nienadający się do użytku. Aby temu zapobiec, należy ograniczyć liczbę procesów, które użytkownicy mogą uruchamiać.

Aby to zrobić, edytuj plik /etc/security/limits.conf i dodaj na dole pliku następujący wiersz, aby ustawić limit:

*   	hard	nproc   10

Pierwszego pola można użyć do wskazania użytkownika, grupy lub wszystkich (*), podczas gdy drugie pole wymusza sztywne ograniczenie liczby procesów (nproc) do 10. Aby zastosować zmiany wystarczy wylogować się i zalogować ponownie.

Zobaczmy zatem, co się stanie, jeśli pewien użytkownik inny niż root (prawdziwy lub nie) spróbuje uruchomić bombę typu Shell Fork. Gdybyśmy nie zaimplementowali limitów, początkowo uruchomiłoby to dwie instancje funkcji, a następnie zduplikowało każdą z nich w niekończącej się pętli. W ten sposób ostatecznie doprowadziłoby to do spowolnienia systemu.

Jednakże, po zastosowaniu powyższego ograniczenia, bomba fork nie powiedzie się, ale użytkownik nadal zostanie zablokowany, dopóki administrator systemu nie zabije powiązanego z nim procesu:

WSKAZÓWKA: Inne możliwe ograniczenia możliwe dzięki ulimit są udokumentowane w pliku limits.conf.

Linux Inne narzędzia do zarządzania procesami

Oprócz narzędzi omówionych wcześniej administrator systemu może również potrzebować:

a) Zmodyfikuj priorytet wykonania (wykorzystanie zasobów systemowych) procesu za pomocą renice. Oznacza to, że jądro przydzieli procesowi więcej lub mniej zasobów systemowych w oparciu o przypisany mu priorytet (liczba powszechnie znana jako „ładność” w zakresie od -20 do 19).

Im niższa wartość, tym większy priorytet wykonania. Zwykli użytkownicy (inni niż root) mogą jedynie modyfikować uprzejmość posiadanych procesów na wyższą wartość (co oznacza niższy priorytet wykonania), podczas gdy root może modyfikować tę wartość dla dowolnego procesu i może ją zwiększać lub zmniejszać.

Podstawowa składnia słowa renice jest następująca:

renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

Jeśli argument po nowej wartości priorytetu nie jest obecny (pusty), domyślnie jest ustawiany na PID. W takim przypadku uprzejmość procesu z PID=identifier jest ustawiona na .

b) W razie potrzeby przerwij normalne wykonywanie procesu. Jest to powszechnie znane jako „zabijanie” procesu. W skrócie oznacza to wysłanie do procesu sygnału, aby poprawnie zakończył jego wykonywanie i zwolnił wszystkie wykorzystane zasoby w uporządkowany sposób.

Aby zakończyć proces, użyj polecenia kill w następujący sposób:

kill PID

Alternatywnie możesz użyć pkill do zakończenia wszystkich procesów danego właściciela (-u), właściciela grupy (-G), a nawet tych procesów, które mają PPID wspólne (-P). Po tych opcjach może następować reprezentacja numeryczna lub rzeczywista nazwa jako identyfikator:

pkill [options] identifier

Na przykład,

pkill -G 1000

zabije wszystkie procesy należące do grupy z GID=1000.

I,

pkill -P 4993 

zabije wszystkie procesy, których PPID wynosi 4993.

Przed uruchomieniem pkill dobrym pomysłem jest najpierw przetestowanie wyników za pomocą pgrep, być może używając również opcji -l w celu wyświetlenia listy nazwy procesów. Wykorzystuje te same opcje, ale zwraca jedynie identyfikatory PID procesów (bez podejmowania dalszych działań), które zostałyby zniszczone w przypadku użycia pkill.

pgrep -l -u gacanepa

Ilustruje to następny obraz:

Streszczenie

W tym artykule omówiliśmy kilka sposobów monitorowania wykorzystania zasobów w celu sprawdzenia integralności i dostępności kluczowych komponentów sprzętu i oprogramowania w systemie Linux.

Nauczyliśmy się także, jak podjąć odpowiednie działania (dostosowując priorytet wykonania danego procesu lub kończąc go) w nietypowych okolicznościach.

Mamy nadzieję, że koncepcje wyjaśnione w tym samouczku okazały się pomocne. Jeśli masz jakieś pytania lub uwagi, skontaktuj się z nami za pomocą poniższego formularza kontaktowego.