Opravíme chybu „Príliš veľa otvorených súborov“ v systéme Linux

Pri práci na silne zaťažených serveroch Linux sa môžu veľmi často vyskytnúť chyby “príliš veľa otvoreného súboruTo znamená, že program otvoril príliš veľa súborov (prečítané deskriptory súborov) a nemôže otvárať nové. V systéme Linux sú obmedzenia „maximálneho počtu otvorených súborov“ predvolene nastavené pre každý proces a používateľa a nie sú príliš vysoké..

V tomto článku sa zameriame na to, ako skontrolovať súčasné obmedzenia počtu otvorených súborov, ako zmeniť toto nastavenie pre celý server, pre jednotlivé služby a pre reláciu..

obsah:

  • Chyba: Príliš veľa otvorených súborov a limity počtu otvorených súborov v systéme Linux
  • Obmedzte nastavenia pre limity počtu súčasne otvorených súborov v systéme Linux
  • Zvýšte limit deskriptorov otvoreného súboru pre jednu službu
  • Zvýšenie maximálneho počtu otvorených súborov pre Nginx a Apache
  • Limity maximálneho súboru pre aktuálnu reláciu

Chyba: Príliš veľa otvorených súborov a limity počtu otvorených súborov v systéme Linux

Najprv zistime, kde môžeme pozorovať chybu „príliš veľa otvorených súborov“. Táto chyba sa najčastejšie vyskytuje na serveroch s nainštalovanými webovými servermi NGINX / httpd, databázovým serverom (MySQL / MariaDB / PostgreSQL), keď čítate veľké množstvo protokolov. Napríklad, ak webový server Nginx nemá dostatočný limit na otváranie súborov, zobrazí sa chyba:

socket () zlyhal (24: Príliš veľa otvorených súborov) počas pripájania k prúdu

Maximálny počet deskriptorov súborov, ktoré sa dajú otvoriť vo vašom systéme, je nasledovný:

# cat / proc / sys / fs / file-max

Limit počtu otvorených súborov pre aktuálneho používateľa je 1024. Môžete skontrolovať toto:

# ulimit -n

Existujú dva typy obmedzení: usilovne a mäkký. Užívateľ môže zmeniť limit pre soft limit (ale soft hodnota nemôže prekročiť tvrdo). Tvrdé obmedzenie je možné zmeniť iba ako privilegovaný používateľ.

Ak chcete zobraziť softvérové ​​obmedzenie, vykonajte:

# ulimit -nS

Výstup tvrdého obmedzenia:

# ulimit -nH

Obmedzte nastavenia pre limity počtu súčasne otvorených súborov v systéme Linux

Ak chcete povoliť všetkým službám otvárať viac súborov, môžete zmeniť limity na úrovni celého operačného systému Linux. Aby nové nastavenia fungovali nepretržite a aby sa po reštarte servera alebo relácie neobnovovali, musíte opraviť súbor /etc/security/limits.conf. Pridať riadky:

* tvrdý nofile 97816 * mäkký nofile 97816

Ak používate Ubuntu, musíte napísať riadok:

relácia vyžaduje pam_limits.so

Tento parameter pridáva schopnosť načítať obmedzenia počas autorizácie užívateľa..

Po vykonaní zmien reštartujte terminál a skontrolujte limitnú hodnotu max_open_files:

[root @ server ~] # ulimit -n

97816

Zvýšte limit deskriptorov otvoreného súboru pre jednu službu

Môžete zmeniť limit počtu otvorených deskriptorov súborov pre konkrétnu službu, a nie pre celý systém. Ako príklad uvážte apache. Ak chcete zmeniť hodnoty, otvorte nastavenia služby prostredníctvom systemctl: # systemctl edit httpd.service Pridajte potrebné limity, napríklad:

[Služba] LimitNOFILE = 16000 LimitNOFILESoft = 16000

Po zmene musíte aktualizovať konfiguráciu služby a reštartovať ju:

# systemctl daemon-reload
# systemctl restart httpd.service

Ak chcete skontrolovať, či sa hodnoty zmenili, musíte získať servisný PID:

# systemctl status httpd.service

Napríklad ste definovali službu PID 32724:

# cat / proc / 32724 / limity grep „Max otvorené súbory“

Takže ste zmenili hodnoty Max otvorených súborov pre konkrétnu službu.

Zvýšenie maximálneho počtu otvorených súborov pre Nginx a Apache

Ak zmeníte limit počtu otvorených súborov pre webový server, musíte tiež opraviť konfiguračný súbor služby. Napríklad pre Nginx v konfiguračnom súbore /etc/nginx/nginx.conf, je potrebné zaregistrovať / zmeniť hodnotu v smernici:

worker_rlimit_nofile 16000
Pri konfigurácii Nginx na silne načítanom 8-jadrovom serveri s pracovnými pripojeniami 8192 zadajte 8192 * 2 * 8 (vCPU) = 131072 v súbore worker_rlimit_nofile..

Potom reštartujte Nginx.

Pre apache musíte vytvoriť adresár:

# mkdir /lib/systemd/system/httpd.service.d/

Potom vytvorte súbor limit_nofile.conf:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

A pridať k tomu:

[Služba] LimitNOFILE = 16000

Nezabudnite reštartovať službu httpd.

Limity maximálneho súboru pre aktuálnu reláciu

Ak chcete zmeniť limity otvorených súborov v rámci vašej terminálovej relácie, spustite príkaz:

# ulimit -n 3000

Pri zatváraní terminálu a vytváraní novej relácie sa limity vrátia na počiatočné hodnoty uvedené v súbore /etc/security/limits.conf.

Zmena celkovej hodnoty v systéme / proc / sys / fs / file-max, zmeňte hodnotu fs.file-max v /etc/sysctl.conf:

fs.file-max = 100000

A platí:

# sysctl -p

V tomto článku sme prišli na to, ako vyriešiť problém s nedostatočným limitom pre otvorené deskriptory súborov v systéme Linux a preskúmali sme niekoľko možností zmeny limitov na serveri..