V Linuxu odpravimo napako Preveč odprtih datotek

Zelo pogosto se lahko pojavijo napake pri delu na močno naloženih strežnikih Linux "preveč odprte datotekes ". To pomeni, da je program odprl preveč datotek (beri deskriptorje datotek) in ne more odpreti novih. V Linuxu so omejitve za" največjo dovoljeno odprtost datotek "privzeto določene za vsak postopek in uporabnika in niso previsoke.

V tem članku bomo pogledali, kako preveriti trenutne omejitve števila odprtih datotek, kako spremeniti to nastavitev za celoten strežnik, za posamezne storitve in za sejo..

Vsebina:

  • Napaka: Preveč odprtih datotek in omejitev števila odprtih datotek v Linuxu
  • Omejite nastavitve za omejitve števila hkrati odprtih datotek v Linuxu
  • Povečajte omejitev deskriptorjev odprtih datotek za eno storitev
  • Povečanje največjega števila odprtih datotek za Nginx in Apache
  • Omejitve največje datoteke za trenutno sejo

Napaka: Preveč odprtih datotek in omejitev števila odprtih datotek v Linuxu

Najprej ugotovimo, kje lahko opazimo napako »preveč odprtih datotek«. Najpogosteje se ta napaka pojavi pri strežnikih z nameščenimi spletnimi strežniki NGINX / httpd, strežnikom baz podatkov (MySQL / MariaDB / PostgreSQL), ko beremo večje število dnevnikov. Na primer, ko spletni strežnik Nginx nima dovolj omejitev za odpiranje datotek, se prikaže napaka:

socket () ni uspel (24: Preveč odprtih datotek) med povezavo z zgornjim tokom

Največje število deskriptorjev datotek, ki jih je mogoče odpreti v vašem sistemu, lahko ugotovite na naslednji način:

# mačka / proc / sys / fs / datoteka-maks

Omejitev števila odprtih datotek za trenutnega uporabnika je 1024. To lahko preverite:

# ulimit -n

Obstajata dve vrsti omejitev: Težko in Mehko. Uporabnik lahko spremeni mejo mehke meje (vendar mehka vrednost ne more preseči trde). Trde omejitve lahko spremenite le kot privilegirani uporabnik.

Za prikaz mehke omejitve izvedite:

# ulimit -nS

Za izdajo trde omejitve:

# ulimit -nH

Omejite nastavitve za omejitve števila hkrati odprtih datotek v Linuxu

Če želite vsem storitvam omogočiti odpiranje več datotek, lahko spremenite omejitve na ravni celotnega sistema Linux. Če želite, da nove nastavitve nenehno delujejo in se ob ponovnem zagonu strežnika ali seje ne morejo ponastaviti, je treba datoteko /etc/security/limits.conf popraviti. Dodaj vrstice:

* trdi nofile 97816 * soft nofile 97816

Če uporabljate Ubuntu, morate napisati vrstico:

zahtevana seja pam_limits.so

Ta parameter doda možnost nalaganja omejitev med avtorizacijo uporabnika..

Po spremembah znova zaženite terminal in preverite mejno vrednost max_open_files:

[root @ server ~] # ulimit -n

97816

Povečajte omejitev deskriptorjev odprtih datotek za eno storitev

Omejitev števila odprtih deskriptorjev datotek lahko spremenite za določeno storitev in ne za celoten sistem. Kot primer si oglejte apache. Če želite spremeniti vrednosti, odprite nastavitve storitev prek systemctl: # systemctl urejanje httpd.service Dodajte potrebne omejitve, na primer:

[Service] LimitNOFILE = 16000 LimitNOFILESoft = 16000

Po spremembi morate posodobiti konfiguracijo storitve in jo znova zagnati:

# systemctl daemon-reload
# systemctl znova zaženite httpd.service

Če želite preveriti, ali so se vrednosti spremenile, morate dobiti storitev PID:

# statusctl status httpd.service

Na primer, definirali ste storitev PID 32724:

# mačka / proc / 32724 / omejitve | grep "Največje odprte datoteke"

Torej ste spremenili vrednosti Max open datotek za določeno storitev.

Povečanje največjega števila odprtih datotek za Nginx in Apache

Če spremenite omejitev števila odprtih datotek spletnega strežnika, morate popraviti tudi konfiguracijsko datoteko storitve. Na primer za Nginx v konfiguracijski datoteki /etc/nginx/nginx.conf, registrirati / spremeniti vrednost v direktivi:

delav_rlimit_nofile 16000
Ko konfigurirate Nginx na močno naloženem 8-jedrnem strežniku z delav_connections 8192, v delav_rlimit_nofile navedite 8192 * 2 * 8 (vCPU) = 131072.

Nato znova zaženite Nginx.

Za apache morate ustvariti imenik:

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

Po tem ustvarite datoteko limit_nofile.conf:

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

In dodajte:

[Storitev] LimitNOFILE = 16000

Ne pozabite znova zagnati storitve httpd.

Omejitve največje datoteke za trenutno sejo

Če želite spremeniti omejitve odprtih datotek znotraj terminalske seje, zaženite ukaz:

# ulimit -n 3000

Ko zaprete terminal in ustvarite novo sejo, se omejitve vrnejo na začetne vrednosti, ki so določene v datoteki /etc/security/limits.conf.

Če želite spremeniti skupno vrednost v sistemu / proc / sys / fs / datoteka-maks, spremenite vrednost fs.file-max v /etc/sysctl.conf:

fs.file-max = 100000

In velja:

# sysctl -p

V tem članku smo ugotovili, kako rešiti težavo z nezadostno omejitvijo za deskriptorje odprtih datotek v Linuxu in preučili več možnosti za spreminjanje omejitev strežnika.