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 16000Př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..