Deskryptory plików i ich limity na przykładzie Nginx

Categories DevOps, Linux

Aby zrozumieć ideę deskryptorów plików postaram się maksymalnie ominąć ogólnodostępną definicję poszczególnych elementów ale bardziej skupić się na praktycznym przedstawieniu zagadnienia. W tym celu posłużę się prostymi przykładami programów w  Pythonie oraz działającym serwerem Nginx, który musi obsługiwać bardzo dużą liczbę żądań.

Deskryptory plików

W systemach Linux każdy nowy proces automatycznie posiada trzy domyślne deskryptory plików:

0 – STDIN – standardowe wejście
1 – STDOUT – standardowe wyjście
2 – STDERR – standardowe wyjście diagnostyczne (głównie w przypadku błędów)

aby sprawdzić co to dokładnie znaczy, posłużę się prostym skryptem w Pythonie:

prosta, nieskończona pętla wypisująca proste komunikaty na standardowe wyjście czyli w oknie terminala w którym go uruchomimy:

kolejnym krokiem jest sprawdzenie identyfikatora nowo powstałego procesu:

znając PID możemy zajrzeć do wirtualnego systemu plików oferującego informacje o uruchomionych procesach:

jak widać, nasz proces o PID 1059 posiada aktualnie trzy otwarte deskryptory zgodnie z tym co było wspomniane na początku.

Aby dowiedzieć się więcej na temat katalogu /proc oraz jego struktury polecam zapoznać się z dokumentacją.

Limity deskryptorów pliku (hard oraz soft limit)

Aby sprawdzić systemowe limity nałożone na ilość deskryptorów plików możemy skorzystać z polecenia ulimit:

na powyższym przykładzie widać, że limit otwartych deskryptorów pliku wynosi dla hard-limit: 65536 a dla soft-limit: 1024.

Hard limit stanowi górną granicę, która jest nałożona przez administratora dla aktualnego użytkownika. Jest swojego rodzaju mechanizmem zabezpieczającym i ograniczającym działanie użytkownika. Może zostać mieniony przez administratora dla dowolnego użytkownika poprzez modyfikację wartości w pliku /etc/security/limits.conf (screen poniżej).

Soft limit jest aktualną wartością ustaloną dla użytkownika. Może jednak ona zostać przez niego zmodyfikowana (również ad-hoc), na potrzeby działania aktualnego programu (procesu, wątku), jednak nie może być większa niż zdefiniowany hard limit. Użytkownik może z powodzeniem dokonać zmiany tej wartości: ulimit -Sn 2048.

limits.conf
/etc/security/limits.conf

Deskryptory plików w Nginx

Zobaczmy teraz jak to wygląda w przypadku serwera Nginx. Pierwsze co musimy sprawdzić to PID procesów:

Widać, że uruchomione są cztery procesy obsługujące połączenia przychodzące. Zazwyczaj bezpieczną liczbą jest liczba core’ów procesora. W tym przypadku tak też się dzieje, mój laptop ma cztery rdzenie a więc i uruchomione są cztery procesy Nginx.

Możemy sprawdzić jakie deskryptory są aktualnie otwarte przez jeden z tych procesów:

Lub sprawdzić łączną liczbę deskryptorów otwartych przez wszystkie workery Nginx:

warto pamiętać, że limit nałożony jest per worker a nie pulę workerów.

Co powoduje otwarcie nowego deskryptora w przypadku Nginx:

  • każde jedno aktywne połączenie od klienta
  • otwarty socket (zarówno do zasobów zewnętrznych jak i lokalnych) przy użyciu z proxy_pass do obsłużenia połączenia
  • serwowanie statycznego pliku przez serwer

W momencie gdy pojedynczy worker osiągnie limit deskryptorów plików możliwy do otwarcia pojawią się błędy zgłaszane przez serwer

co wcale nie musi oznaczać problemów wydajnościowych z kodem naszej aplikacji.

Aby temu zaradzić wystarczy zwiększyć soft-limit dla pojedynczego workera (pamiętając o ograniczeniu hard-limit). W tym celu wystarczy zmodyfikować konfigurację Nginx a dokładniej plik nginx.conf (lub konkretnego vhosta) i zmienić wartość limitu za pomocą parametru worker_rlimit_nofile:

w znaczący sposób unikniemy problemów związanych z limitem deskryptorów pliku w kontekście serwera Nginx.

Podobne limity możemy napotkać przy przeprowadzaniu testów wydajnościowych np. za pomocą Locust, wówczas w podobny sposób można zwiększyć ten limit:

Więcej informacji

  1. How To Optimize Nginx Configuration (DigitalOcean)
  2. Nginx: 24: Too Many Open Files Error And Solution (nixCraft)
  3. Quickie tutorial: ulimit, soft limits, hard limits, soft stack, hard stack (geekswing.com)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*