Javítottuk a „Túl sok nyitott fájl” hibát a Linuxban

Nagyon gyakran hibák fordulhatnak elő, ha nagy terhelésű Linux szerverek működnek “túl sok nyitott fájls ". Ez azt jelenti, hogy a program túl sok fájlt nyitott meg (olvasott fájlleírásokat), és nem tud új fájlokat megnyitni. Linuxban a„ maximális nyitott fájlkorlátozás ”korlátozásokat alapértelmezés szerint határozzák meg az egyes folyamatok és felhasználók számára, és nem túl nagyok.

Ebben a cikkben megvizsgáljuk, hogyan lehet ellenőrizni a nyitott fájlok számának jelenlegi korlátozásait, hogyan lehet megváltoztatni ezt a beállítást az egész kiszolgálóra, az egyes szolgáltatásokra és a munkamenetre..

Tartalom:

  • Hiba: Túl sok nyitott fájl és korlátozott a megnyitott fájlok száma Linuxban
  • Korlátozza a Linuxon egyidejűleg megnyitott fájlok számának korlátozását
  • Növelje az egyetlen szolgáltatás nyitott fájlleíróinak korlátját
  • Ninx és Apache maximális megnyitott fájljainak száma
  • Az aktuális munkamenet maximális fájlkorlátjai

Hiba: Túl sok nyitott fájl és korlátozott a megnyitott fájlok száma Linuxban

Először találjuk ki, hol figyelhetjük meg a “túl sok nyitott fájl” hibát. Leggyakrabban ez a hiba telepített NGINX / httpd webszerverekkel rendelkező kiszolgálóknál, adatbázis-kiszolgálón (MySQL / MariaDB / PostgreSQL) jelentkezik, ha sok naplót olvas. Például, ha az Nginx webszervernek nincs elegendő korlátozása a fájlok megnyitásához, egy hibaüzenetet kap:

socket () meghiúsult (24: Túl sok nyitott fájl), miközben csatlakozik az upstream-hez

A rendszerben megnyitható fájlleírók maximális száma a következőképpen olvasható:

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

A jelenlegi felhasználó számára a nyitott fájlok számának korlátozása 1024. Ezt ellenőrizheti:

# ulimit -n

Kétféle korlátozás létezik: kemény és lágy. A felhasználó megváltoztathatja a lágy határértéket (de a lágy érték nem haladhatja meg a kemény értéket). A kemény korlátozást csak privilegizált felhasználóként lehet megváltoztatni.

A lágy korlátozás megjelenítéséhez hajtsa végre a következőt:

# ulimit -nS

Kemény korlátozás kiadása:

# ulimit -nH

Korlátozza a Linuxon egyidejűleg megnyitott fájlok számának korlátozását

Annak érdekében, hogy minden szolgáltatás további fájlokat nyisson meg, megváltoztathatja a korlátozásokat a teljes Linux operációs rendszer szintjén. Annak érdekében, hogy az új beállítások folyamatosan működjenek, és ne kerüljenek visszaállításra a szerver vagy a munkamenet újraindításakor, javítania kell az /etc/security/limits.conf fájlt. Sorok hozzáadása:

* kemény nofile 97816 * puha nofile 97816

Ha Ubuntut használ, akkor be kell írnia a sort:

ülés szükséges pam_limits.so

Ez a paraméter hozzáadja a korlátozások betöltésének a képességét a felhasználói engedélyeztetés során..

A változtatások után indítsa újra a terminált és ellenőrizze a max_open_files határértéket:

[root @ szerver ~] # ulimit -n

97816

Növelje az egyetlen szolgáltatás nyitott fájlleíróinak korlátját

Meg lehet változtatni a nyitott fájlleírások számának korlátozását egy adott szolgáltatás, és nem a teljes rendszer számára. Tekintsünk példaként az apachet Az értékek megváltoztatásához nyissa meg a szolgáltatás beállításait a systemctl segítségével: # systemctl szerkeszti a httpd.service szolgáltatást Adja hozzá a szükséges korlátokat, például:

[Szolgáltatás] LimitNOFILE = 16000 LimitNOFILESoft = 16000

A változtatás után frissítenie kell a szolgáltatás konfigurációját, és újra kell indítania:

# systemctl démon-újratöltés
# systemctl indítsa újra a httpd.service szolgáltatást

Annak ellenőrzéséhez, hogy az értékek megváltoztak-e, be kell szereznie a szolgáltatás PID-jét:

# systemctl status httpd.service

Például meghatározta a PID 32724 szolgáltatást:

# cat / proc / 32724 / limits | grep "Max nyitott fájlok"

Tehát megváltoztatta egy adott szolgáltatás Max nyitott fájljainak értékét.

Ninx és Apache maximális megnyitott fájljainak száma

Ha megváltoztatja a megnyitott fájlok számának korlátozását egy webszerver számára, akkor a szolgáltatás konfigurációs fájlját is ki kell javítania. Például az Nginx esetében a konfigurációs fájlban /etc/nginx/nginx.conf, regisztrálni / megváltoztatni az értéket az irányelvben:

worker_rlimit_nofile 16000
Az Nginx konfigurálásakor egy erősen betöltött nyolcmagos szerverre, amelyen 8192-es világszintű kapcsolódások vannak, adja meg a 8192 * 2 * 8 (vCPU) = 131072-et a worker_rlimit_nofile fájlban..

Ezután indítsa újra az Nginx-et.

Az apache-hoz létre kell hoznia egy könyvtárat:

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

Ezután hozza létre a limit_nofile.conf fájlt:

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

És adjuk hozzá:

[Szolgáltatás] LimitNOFILE = 16000

Ne felejtse el újraindítani a httpd szolgáltatást.

Az aktuális munkamenet maximális fájlkorlátjai

A terminál-munkameneten belüli nyitott fájlok korlátozásának megváltoztatásához futtassa a következő parancsot:

# ulimit -n 3000

A terminál bezárásakor és új munkamenet létrehozásakor a korlátok visszatérnek a fájlban megadott kezdeti értékekhez /etc/security/limits.conf.

A rendszer általános értékének megváltoztatása / proc / sys / fs / file-max, módosítsa az fs.file-max értékét az /etc/sysctl.conf fájlban:

fs.file-max = 100000

És alkalmazza:

# sysctl -p

Ebben a cikkben kitaláltuk, hogyan lehet megoldani a problémát a Linux nyitott fájlleíróinak korlátozása nélkül, és megvizsgáltunk számos lehetőséget a kiszolgáló korlátozásainak megváltoztatására..