V systému Linux opravujeme chybu „Příliš mnoho otevřených souborů“

Při práci na silně načtených serverech Linux se mohou velmi často vyskytnout chyby “příliš mnoho otevřených souborůs ". To znamená, že program otevřel příliš mnoho souborů (čtení popisovačů souborů) a nemůže otevřít nové. V systému Linux jsou ve výchozím nastavení pro každý proces a uživatele nastavena omezení„ maximálního limitu otevřeného souboru “a nejsou příliš vysoká..

V tomto článku se podíváme na to, jak zkontrolovat aktuální omezení počtu otevřených souborů, jak změnit toto nastavení pro celý server, pro jednotlivé služby a pro relaci..

Obsah:

  • Chyba: Příliš mnoho otevřených souborů a omezení počtu otevřených souborů v systému Linux
  • Omezte nastavení limitů pro počet současně otevřených souborů v Linuxu
  • Zvyšte limit otevřených popisovačů souborů pro jednu službu
  • Zvýšení maximálního počtu otevřených souborů pro Nginx a Apache
  • Limity maximálního počtu souborů pro aktuální relaci

Chyba: Příliš mnoho otevřených souborů a omezení počtu otevřených souborů v systému Linux

Nejprve pojďme zjistit, kde můžeme pozorovat chybu „příliš mnoho otevřených souborů“. Tato chyba se nejčastěji vyskytuje na serverech s nainstalovanými webovými servery NGINX / httpd, databázovým serverem (MySQL / MariaDB / PostgreSQL), při čtení velkého počtu protokolů. Pokud například webový server Nginx nemá dostatečný limit pro otevírání souborů, zobrazí se chybová zpráva:

socket () se nezdařil (24: Příliš mnoho otevřených souborů) při připojování k upstream

Maximální počet deskriptorů souborů, které lze ve vašem systému otevřít, lze zjistit takto:

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

Limit počtu otevřených souborů pro aktuálního uživatele je 1024. Můžete to zkontrolovat:

# ulimit -n

Existují dva typy omezení: Těžké a Měkké. Uživatel může změnit limit pro soft limit (ale soft hodnota nesmí překročit tvrdě). Tvrdé omezení lze změnit pouze jako privilegovaný uživatel.

Chcete-li zobrazit Soft-restrikce, proveďte následující kroky:

# ulimit -nS

Výstup tvrdého omezení:

# ulimit -nH

Omezte nastavení limitů pro počet současně otevřených souborů v Linuxu

Chcete-li povolit všem službám otevírat více souborů, můžete změnit limity na úrovni celého operačního systému Linux. Aby nová nastavení fungovala nepřetržitě a nebyla obnovena při restartování serveru nebo relace, musíte opravit soubor /etc/security/limits.conf. Přidat řádky:

* tvrdý nofile 97816 * měkký nofile 97816

Pokud používáte Ubuntu, musíte napsat řádek:

relace vyžaduje pam_limits.so

Tento parametr přidává možnost načíst omezení během autorizace uživatele..

Po provedení změn restartujte terminál a zkontrolujte mezní hodnotu max_open_files:

[root @ server ~] # ulimit -n

97816

Zvyšte limit otevřených popisovačů souborů pro jednu službu

Můžete změnit limit počtu popisovačů otevřených souborů pro konkrétní službu, nikoli pro celý systém. Jako příklad zvažte apache. Chcete-li změnit hodnoty, otevřete nastavení služby pomocí systemctl: # systemctl editovat httpd.service Přidejte potřebné limity, například:

[Služba] LimitNOFILE = 16000 LimitNOFILESoft = 16000

Po změně je třeba aktualizovat konfiguraci služby a restartovat ji:

# systemctl daemon-reload
# systemctl restart httpd.service

Chcete-li zkontrolovat, zda se hodnoty změnily, musíte získat servisní PID:

# systemctl status httpd.service

Například jste definovali službu PID 32724:

# cat / proc / 32724 / limity | grep "Max otevřené soubory"

Změnili jste tedy hodnoty Max otevřených souborů pro konkrétní službu.

Zvýšení maximálního počtu otevřených souborů pro Nginx a Apache

Pokud změníte limit počtu otevřených souborů pro webový server, musíte také opravit konfigurační soubor služby. Například pro Nginx v konfiguračním souboru /etc/nginx/nginx.conf, je třeba zaregistrovat / změnit hodnotu ve směrnici:

worker_rlimit_nofile 16000
Při konfiguraci Nginx na silně načteném 8jádrovém serveru s pracovními připojeními 8192 zadejte 8192 * 2 * 8 (vCPU) = 131072 v souboru worker_rlimit_nofile.

Poté restartujte Nginx.

Pro apache musíte vytvořit adresář:

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

Poté vytvořte soubor limit_nofile.conf:

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

A přidat k tomu:

[Service] LimitNOFILE = 16000

Nezapomeňte restartovat službu httpd.

Limity maximálního počtu souborů pro aktuální relaci

Chcete-li změnit limity otevřených souborů v relaci terminálu, spusťte příkaz:

# ulimit -n 3000

Při zavření terminálu a vytvoření nové relace se limity vrátí na původní hodnoty uvedené v souboru /etc/security/limits.conf.

Chcete-li změnit celkovou hodnotu v systému / proc / sys / fs / file-max, změňte hodnotu fs.file-max v /etc/sysctl.conf:

fs.file-max = 100000

A platí:

# sysctl -p

V tomto článku jsme zjistili, jak vyřešit problém s nedostatečným limitem pro otevřené popisovače souborů v Linuxu a prozkoumali jsme několik možností pro změnu limitů na serveru..