Popravljamo pogrešku Previše otvorenih datoteka u Linuxu

Vrlo često se mogu pojaviti pogreške pri radu na jako učitanim Linux poslužiteljima "previše otvorene datotekes ". To znači da je program otvorio previše datoteka (pročitajte deskriptore datoteka) i ne može otvoriti nove. U Linuxu su ograničenja„ najveće otvorene datoteke “postavljena prema zadanim postavkama za svaki postupak i korisnika i nisu previsoka.

U ovom ćemo članku pogledati kako provjeriti trenutna ograničenja broja otvorenih datoteka, kako promijeniti ovu postavku za cijeli poslužitelj, za pojedinačne usluge i za sesiju..

sadržaj:

  • Pogreška: Previše otvorenih datoteka i ograničenja broja otvorenih datoteka u Linuxu
  • Ograničite postavke za ograničenje broja istovremeno otvorenih datoteka u Linuxu
  • Povećajte ograničenje deskriptora otvorenih datoteka za jednu uslugu
  • Povećanje maksimalnog broja otvorenih datoteka za Nginx i Apache
  • Ograničenje najveće datoteke za trenutnu sesiju

Pogreška: Previše otvorenih datoteka i ograničenja broja otvorenih datoteka u Linuxu

Prvo, shvatimo gdje možemo promatrati pogrešku "previše otvorenih datoteka". Najčešće se ta pogreška pojavljuje na poslužiteljima s instaliranim NGINX / httpd web poslužiteljima, poslužiteljem baze podataka (MySQL / MariaDB / PostgreSQL), prilikom čitanja velikog broja dnevnika. Na primjer, kada web-poslužitelj Nginx nema dovoljno ograničenja za otvaranje datoteka, dobit ćete pogrešku:

socket () nije uspio (24: Previše otvorenih datoteka) dok se povezujete uzvodno

Najveći broj deskriptora datoteka koji se mogu otvoriti na vašem sustavu može se naći na sljedeći način:

# mačka / proc / sys / fs / file-max

Ograničenje broja otvorenih datoteka za trenutnog korisnika je 1024. To možete provjeriti:

# ulimit -n

Postoje dvije vrste ograničenja: teško i mekan. Korisnik može promijeniti ograničenje za soft limit (ali meka vrijednost ne može prijeći tvrdu). Tvrdo ograničenje može se promijeniti samo kao povlašteni korisnik.

Da biste prikazali soft-ograničenje, izvršite:

# ulimit -nS

Za stvaranje tvrdog ograničenja:

# ulimit -nH

Ograničite postavke za ograničenje broja istovremeno otvorenih datoteka u Linuxu

Da biste svim servisima omogućili otvaranje više datoteka, možete promijeniti ograničenja na razini cijelog Linux OS-a. Da bi nove postavke stalno radile i ne bi se mogle resetirati nakon ponovnog pokretanja poslužitelja ili sesije, morate popraviti /etc/security/limits.conf datoteku. Dodajte retke:

* tvrdi nofile 97816 * soft nofile 97816

Ako koristite Ubuntu, morate napisati liniju:

potrebna je sesija pam_limits.so

Ovaj parametar dodaje mogućnost učitavanja ograničenja tijekom autorizacije korisnika..

Nakon promjena, ponovno pokrenite terminal i provjerite graničnu vrijednost max_open_files:

[root @ server ~] # ulimit -n

97.816

Povećajte ograničenje deskriptora otvorenih datoteka za jednu uslugu

Možete ograničiti broj deskriptora otvorenih datoteka za određenu uslugu, a ne za cijeli sustav. Uzmite u obzir apache. Da biste promijenili vrijednosti, otvorite servisne postavke putem systemctl: # systemctl edit httpd.service Dodajte potrebna ograničenja, na primjer:

[Usluga] LimitNOFILE = 16000 LimitNOFILESoft = 16000

Nakon promjene, trebate ažurirati konfiguraciju usluge i ponovo je pokrenuti:

# systemctl ponovno učitavanje demona
# systemctl ponovno pokrenite httpd.service

Da biste provjerili jesu li se vrijednosti promijenile, morate nabaviti PID usluge:

# systemctl status httpd.service

Na primjer, definirali ste uslugu PID 32724:

# mačka / proc / 32724 / ograničenja | grep "Maks. otvaranje datoteka"

Dakle, promijenili ste Max Max vrijednosti datoteka za određenu uslugu.

Povećanje maksimalnog broja otvorenih datoteka za Nginx i Apache

Ako promijenite ograničenje broja otvorenih datoteka za web poslužitelj, morate ispraviti i konfiguracijsku datoteku usluge. Na primjer, za Nginx u konfiguracijskoj datoteci /etc/nginx/nginx.conf, treba registrirati / promijeniti vrijednost u direktivi:

radnika_rlimit_nofile 16000
Pri konfiguriranju Nginx-a na teško učitan 8-jezgreni poslužitelj s radničkim vezama 8192 navedite 8192 * 2 * 8 (vCPU) = 131072 u radnika_rlimit_nofile.

Zatim ponovno pokrenite Nginx.

Za apache morate stvoriti direktorij:

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

Nakon toga stvorite datoteku limit_nofile.conf:

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

I dodajte tome:

[Usluga] LimitNOFILE = 16000

Ne zaboravite ponovo pokrenuti httpd uslugu.

Ograničenje najveće datoteke za trenutnu sesiju

Da biste promijenili ograničenja za otvorene datoteke unutar sesije vašeg terminala, pokrenite naredbu:

# ulimit -n 3000

Pri zatvaranju terminala i stvaranju nove sesije, ograničenja se vraćaju početnim vrijednostima navedenim u datoteci /etc/security/limits.conf.

Za promjenu ukupne vrijednosti u sustavu / proc / sys / fs / file-maks, promijenite vrijednost fs.file-max u /etc/sysctl.conf:

fs.file-max = 100000

I primijenite:

# sysctl -p

U ovom smo članku smislili kako riješiti problem s nedovoljnim ograničenjem za deskriptore otvorenih datoteka u Linuxu i ispitali smo nekoliko opcija za promjenu ograničenja na poslužitelju.