Too many open files: keď službe dôjdu deskriptory súborov
Server má voľnú pamäť aj disk, no služba zlyháva. Ako preveriť deskriptory súborov, skutočné limity procesu a príčinu ich rastúcej spotreby.

Web prestane prijímať časť požiadaviek a v logu sa objaví Too many open files. Voľný disk pritom vyzerá v poriadku. Názov chyby môže zvádzať k hľadaniu veľkého počtu dokumentov, ale deskriptory sa používajú aj pri socketoch a rúrach. Nové sieťové spojenie tiež potrebuje deskriptor. Nasledujúci postup sa venuje Linuxu; príklady nastavenia služby predpokladajú priamy štart cez systemd.
Zistite presnú chybu aj proces, ktorý ju hlási
Pri otvorení súboru EMFILE označuje vyčerpaný limit deskriptorov procesu. ENFILE znamená dosiahnutie celosystémového limitu otvorených súborov. Rozdiel si overte v podrobnostiach chyby. Rovnaký zásah nemusí riešiť oba prípady. K záznamu priraďte čas, PID, názov služby a operáciu, ktorá zlyhala; samotný text z používateľského rozhrania môže podstatný detail vynechať.
Pri službe spúšťanej systemd poskytne systemctl show --property=MainPID web.service identifikátor hlavného procesu. web.service je príklad názvu jednotky. Ak požiadavky obsluhujú workery, nájdite aj konkrétny zlyhávajúci proces. Pri čítaní /proc používajte PID v rovnakom priestore procesov. Výpis z iného procesu alebo z novej inštancie po reštarte vám stav pôvodného incidentu nenahradí.
Čítajte limity bežiaceho procesu
Otvorte cat /proc/PID/limits a PID nahraďte skutočným identifikátorom. V riadku Max open files porovnajte soft a hard limit. Soft limit je vynucovaná hodnota; hard limit tvorí jeho hornú hranicu pre neprivilegovaný proces. Zaznamenajte ich spolu s časom merania. Vysoký hard limit sám nepotvrdzuje, že proces aktuálne používa rovnako vysoký soft limit.
Príkaz ulimit -n v administrátorskom shelli opisuje jeho vlastný kontext. Potomkovia dedia limity pri vytvorení a tie sa zachovajú aj cez execve(). Zmena v tomto termináli preto spätne neupraví už bežiacu službu. Pri viacerých procesoch kontrolujte dotknuté PID samostatne. Ak aplikácia upravuje vlastné limity, porovnajte konfiguráciu štartu so skutočným stavom po inicializácii.
Sledujte, čo deskriptory drží otvorené
Výpis ls -l /proc/PID/fd ukáže položky pomenované číslami deskriptorov a ich symbolické odkazy. Pri socketoch a rúrach uvidíte aj typ a inode. Obsah môže byť obmedzený oprávneniami; chýbajúci prístup nie je nulová spotreba. Pri odovzdávaní výpisu obmedzte zdieľané údaje, pretože názvy ciest môžu prezradiť internú štruktúru služby.
Porovnajte opakované snímky pri podobnej záťaži a po dokončení práce. Rastúci počet môže súvisieť s väčším súbehom, zámerne držaným poolom alebo chýbajúcim uzatvorením zdroja. Jedna snímka únik nepotvrdzuje. V aplikácii preverte uvoľnenie súborov a spojení aj pri chybe či zrušení operácie. close() uvoľní deskriptor na opätovné použitie; správu zdrojov však riešte cez mechanizmus príslušného runtime.
Zmenu limitu overte spolu so správaním aplikácie
Pri priamom štarte služby cez systemd sa limit nastavuje cez LimitNOFILE=; dvojica soft:hard odlišuje obe hodnoty. Pred zvýšením overte kompatibilitu aplikácie: select() na Linuxe nevie pracovať s deskriptormi nad 1023. Potrebnú rezervu určte zo súbehu a merania. Vyšší limit môže byť primeraná kapacitná zmena, ale nevysvetlí, prečo spotreba bez očakávaného dôvodu ďalej rastie.
Samotný systemctl daemon-reload načíta konfiguráciu správcu, nereštartuje službu. Zmenu preto naplánujte podľa jej spôsobu štartu a dostupnosti. Po riadenom reštarte overte /proc/PID/limits nových procesov a zopakujte pôvodne zlyhávajúcu operáciu pod porovnateľnou záťažou. Sledujte chyby aj trend deskriptorov. Upozornenie naviažte na rezervu do vynucovaného limitu; pri ENFILE rozšírte diagnostiku na celý hostiteľ.
- Rozlíšte EMFILE a ENFILE a nájdite správne PID.
- Overte soft a hard limit bežiaceho procesu.
- Porovnajte spotrebu počas záťaže aj po dokončení práce.
- Po zmene zopakujte operáciu a sledujte ďalší vývoj.
Čo si odniesť
Pri chybe Too many open files začnite pri konkrétnom procese a jeho skutočných limitoch. Zmerajte, čo drží otvorené, a odlíšte očakávaný súbeh od chyby správy zdrojov. Opravu potvrďte dokončením používateľskej operácie a stabilným správaním pri zodpovedajúcej záťaži.
Dokumentácia a ďalšie čítanie
- Linux man-pages: open(2), EMFILE and ENFILE
- Linux man-pages: accept(2), connections and descriptors
- systemd: systemctl, MainPID and daemon-reload
- Linux man-pages: proc_pid_limits(5)
- Linux man-pages: getrlimit(2), soft/hard limits and inheritance
- Linux man-pages: proc_pid_fd(5)
- Linux man-pages: close(2)
- systemd: systemd.exec, LimitNOFILE and select compatibility
- Linux man-pages: pid_namespaces(7), process identifiers and proc


