Si të zgjidhni gabimin Shumë skedarë të hapur në Linux


Përmbledhje: Nëse shihni mesazhin e gabimit Shumë skedarë të hapur në Linux, procesi juaj ka arritur kufirin e sipërm të skedarëve që lejohen të hapen, zakonisht 1024. Ju mund ta rritni përkohësisht kufirin në, për shembull, 2048 skedarë, me komandën ulimit -n 2048. Rriteni kufirin përgjithmonë duke redaktuar skedarët e konfigurimit systemd.

Në kompjuterët Linux, burimet e sistemit ndahen midis përdoruesve. Mundohuni të përdorni më shumë se pjesa juaj e drejtë dhe do të arrini një kufi të sipërm. Ju gjithashtu mund të pengoni përdoruesit ose proceset e tjera.

Cili është gabimi i shumë skedarëve të hapur?

Ndër punët e tjera të gazilluara, kerneli i një kompjuteri Linux është gjithmonë i zënë duke parë se kush po përdor sa nga burimet e fundme të sistemit, si ciklet e RAM dhe CPU. Një sistem me shumë përdorues kërkon vëmendje të vazhdueshme për t'u siguruar që njerëzit dhe proceset nuk po përdorin më shumë nga çdo burim i caktuar i sistemit sesa është e përshtatshme.

Nuk është e drejtë, për shembull, që dikush të marrë aq shumë kohë CPU sa që kompjuteri të ndihet i ngadaltë për të gjithë të tjerët. Edhe nëse jeni i vetmi person që përdor kompjuterin tuaj Linux, ka kufizime të përcaktuara për burimet që mund të përdorin proceset tuaja. Në fund të fundit, ju jeni ende një përdorues tjetër.

Disa burime të sistemit janë të njohura dhe të dukshme, si RAM-i, ciklet e CPU-së dhe hapësira e diskut. Por ka shumë e shumë burime të tjera që monitorohen dhe për të cilat çdo përdorues — ose çdo proces në pronësi përdorues — ka një kufi të sipërm të caktuar. Një nga këto është numri i skedarëve që një proces mund të ketë hapur menjëherë.

Nëse e keni parë ndonjëherë mesazhin e gabimit Shumë skedarë të hapur në një dritare terminali ose e keni gjetur atë në regjistrat e sistemit tuaj, kjo do të thotë se kufiri i sipërm është arritur dhe procesi nuk lejohet të hapë më skedarë.

Pse hapen kaq shumë skedarë?

Ekziston një kufi në të gjithë sistemin për numrin e skedarëve të hapur që Linux mund të trajtojë. Është një numër shumë i madh, siç do ta shohim, por ka ende një kufi. Çdo proces përdoruesi ka një alokim që ata mund ta përdorin. Secili prej tyre merr një pjesë të vogël të totalit të sistemit të alokuar për ta.

Ajo që në fakt ndahet është një numër përdorimesh skedarësh. Çdo skedar që hapet kërkon një dorezë. Edhe me alokime mjaft bujare, dorezat e skedarëve në të gjithë sistemin mund të përdoren më shpejt nga sa mund ta imagjinoni fillimisht.

Linux abstrakton pothuajse gjithçka në mënyrë që të duket sikur është një skedar. Ndonjëherë ato do të jenë vetëm kaq, skedarë të thjeshtë të vjetër. Por veprime të tjera si hapja e një drejtorie përdorin gjithashtu një dorezë skedari. Linux përdor bllok skedarë specialë si një lloj drejtuesi për pajisjet harduerike. Skedarët e veçantë të karaktereve janë shumë të ngjashëm, por ato përdoren më shpesh me pajisje që kanë një koncept të xhiros, të tilla si tubat dhe portat serike.

Bllokimi i skedarëve specialë trajton blloqe të dhënash në një kohë dhe skedarët e veçantë të karaktereve trajtojnë çdo karakter veç e veç. Të dy këta skedarë të veçantë mund të aksesohen vetëm duke përdorur dorezat e skedarëve. Bibliotekat e përdorura nga një program përdorin një dorezë skedari, transmetimet përdorin doreza skedarësh dhe lidhjet e rrjetit përdorin doreza skedarësh.

Abstragimi i të gjitha këtyre kërkesave të ndryshme në mënyrë që ato të shfaqen si skedarë thjeshton ndërlidhjen me to dhe lejon funksionimin e gjërave të tilla si tubacionet dhe rrymat.

Ju mund të shihni se Linux në prapaskenë po hap skedarë dhe po përdor dorezat e skedarëve vetëm për të ekzekutuar vetë - mos u shqetësoni për proceset tuaja të përdoruesit. Numri i skedarëve të hapur nuk është vetëm numri i skedarëve që keni hapur. Pothuajse çdo gjë në sistemin operativ përdor dorezat e skedarëve.

Si të kontrolloni kufijtë e dorëzimit të skedarëve

Numri maksimal i dorezave të skedarëve në të gjithë sistemin mund të shihet me këtë komandë.

cat /proc/sys/fs/file-max

Kjo kthen një numër jashtëzakonisht të madh prej 9.2 kuintilionësh. Ky është maksimumi i sistemit teorik. Është vlera më e madhe e mundshme që mund të mbani në një numër të plotë të nënshkruar 64-bit. Nëse kompjuteri juaj i dobët mund të përballet me kaq shumë skedarë të hapur menjëherë, është një çështje krejtësisht tjetër.

Në nivelin e përdoruesit, nuk ka një vlerë të qartë për numrin maksimal të skedarëve të hapur që mund të keni. Por ne mund ta zgjidhim përafërsisht. Për të gjetur numrin maksimal të skedarëve që mund të hapë një nga proceset tuaja, ne mund të përdorim komandën ulimit me opsionin -n (skedarët e hapur).

ulimit -n

Dhe për të gjetur numrin maksimal të proceseve që mund të ketë një përdorues, ne do të përdorim ulimit me opsionin -u (proceset e përdoruesit).

ulimit -u

Shumëzimi i 1024 dhe 7640 na jep 7,823,360. Sigurisht, shumë prej këtyre proceseve do të përdoren tashmë nga mjedisi i desktopit tuaj dhe proceset e tjera të sfondit. Pra, ky është një tjetër maksimum teorik, që nuk do ta arrini kurrë realisht.

Shifra e rëndësishme është numri i skedarëve që një proces mund të hapë. Si parazgjedhje, kjo është 1024. Vlen të përmendet se hapja e të njëjtit skedar 1024 herë njëkohësisht është e njëjtë me hapjen e 1024 skedarëve të ndryshëm njëkohësisht. Pasi të keni përdorur të gjitha dorezat e skedarëve tuaj, keni mbaruar.

Është e mundur të rregulloni numrin e skedarëve që mund të hapë një proces. Në të vërtetë ekzistojnë dy vlera për t'u marrë parasysh kur po rregulloni këtë numër. Njëra është vlera në të cilën është vendosur aktualisht, ose në të cilën po përpiqeni ta vendosni. Ky quhet kufiri i butë. Ekziston gjithashtu një kufi i vështirë dhe kjo është vlera më e lartë që ju mund të ngrini kufirin e butë.

Mënyra për të menduar për këtë është kufiri i butë në të vërtetë është vlera aktuale dhe kufiri i sipërm është vlera më e lartë që mund të arrijë vlera aktuale. Një përdorues i rregullt, jo-root, mund të rrisë kufirin e tij të butë në çdo vlerë deri në kufirin e tij të fortë. Përdoruesi rrënjë mund të rrisë kufirin e tij të vështirë.

Për të parë kufijtë aktualë të butë dhe të fortë, përdorni ulimit me opsionet -S (të buta) dhe -H (të vështira) dhe < opsioni kod>-n (skedarët e hapur).

ulimit -Sn
ulimit -Hn

Për të krijuar një situatë ku mund të shohim zbatimin e kufirit të butë, kemi krijuar një program që hap vazhdimisht skedarë derisa të dështojë. Më pas pret për një shtypje tasti përpara se të heqë dorë nga të gjitha dorezat e skedarëve që ka përdorur. Programi quhet open-files.

./open-Files

Hap 1021 skedarë dhe dështon ndërsa përpiqet të hapë skedarin 1022.

1024 minus 1021 është 3. Çfarë ndodhi me tre dorezat e tjera të skedarëve? Ato u përdorën për transmetimet STDIN, STDOUT dhe STDERR. Ato krijohen automatikisht për çdo proces. Këto gjithmonë kanë vlera të përshkruesit të skedarëve 0, 1 dhe 2.

Ne mund t'i shohim këto duke përdorur komandën lsof me opsionin -p (procesi) dhe ID-në e procesit të programit open-files. Me lehtësi, ai printon ID-në e procesit në dritaren e terminalit.

lsof -p 11038

Sigurisht, në një situatë të botës reale, mund të mos e dini se cili proces sapo ka gëlltitur të gjitha dorezat e skedarëve. Për të filluar hetimin tuaj, mund të përdorni këtë sekuencë komandash me tubacione. Do t'ju tregojë pesëmbëdhjetë përdoruesit më pjellorë të dorezave të skedarëve në kompjuterin tuaj.

lsof | awk '{ print $1 " " $2; }' | sort -rn | uniq -c | sort -rn | head -15

Për të parë më shumë ose më pak hyrje, rregulloni parametrin -15 në komandën head. Pasi të keni identifikuar procesin, duhet të kuptoni nëse ai është bërë mashtrues dhe po hap shumë skedarë sepse është jashtë kontrollit, ose nëse i duhen vërtet ato skedarë. Nëse ka nevojë për to, duhet të rrisni kufirin e dorezës së skedarit.

Si të rritet kufiri i butë

Nëse e rrisim kufirin e butë dhe e ekzekutojmë përsëri programin tonë, duhet ta shohim atë të hapë më shumë skedarë. Do të përdorim komandën ulimit dhe opsionin -n (skedarët e hapur) me vlerë numerike 2048. Ky do të jetë kufiri i ri i butë.

ulimit -n 2048

Këtë herë kemi hapur me sukses 2045 skedarë. Siç pritej, kjo është tre më pak se 2048, për shkak të dorezave të skedarëve të përdorur për STDIN , STDOUT dhe STDERR.

Si të ndryshoni përgjithmonë kufirin e skedarit

Rritja e kufirit të butë ndikon vetëm në guaskën aktuale. Hapni një dritare të re terminali dhe kontrolloni kufirin e butë. Do të shihni se është vlera e vjetër e paracaktuar. Por ekziston një mënyrë për të vendosur globalisht një vlerë të re të paracaktuar për numrin maksimal të skedarëve të hapur që mund të ketë një proces, e cila është e vazhdueshme dhe i mbijeton rindezjes.

Këshillat e vjetruara shpesh ju rekomandojnë të redaktoni skedarë të tillë si /etc/sysctl.conf dhe /etc/security/limits.conf. Sidoqoftë, në shpërndarjet e bazuara në sistem, këto modifikime nuk funksionojnë vazhdimisht, veçanërisht për seancat grafike të hyrjes.

Teknika e treguar këtu është mënyra për ta bërë këtë në shpërndarjet e bazuara në sistem. Ka dy skedarë me të cilët duhet të punojmë. E para është skedari /etc/systemd/system.conf. Do të na duhet të përdorim sudo .

sudo gedit /etc/systemd/system.conf

Kërkoni për rreshtin që përmban vargun DefaultLimitNOFILE. Hiqni hash # nga fillimi i rreshtit dhe modifikoni numrin e parë në çfarëdo që dëshironi të jetë kufiri juaj i ri i butë për proceset. Ne zgjodhëm 4096. Numri i dytë në atë rresht është kufiri i vështirë. Ne nuk e rregulluam këtë.

Ruani skedarin dhe mbyllni redaktorin.

Duhet ta përsërisim atë operacion në skedarin “/etc/systemd/user.conf”.

sudo gedit /etc/systemd/user.conf

Bëni të njëjtat rregullime në rreshtin që përmban vargun DefaultLimitNOFILE.

Ruani skedarin dhe mbyllni redaktorin. Duhet ose të rindizni kompjuterin tuaj ose të përdorni komandën systemctl me opsionin daemon-reexec në mënyrë që systemd të riekzekutohet dhe të gëlltisë cilësimet e reja .

sudo systemctl daemon-reexec

Hapja e një dritareje terminali dhe kontrollimi i kufirit të ri duhet të tregojë vlerën e re që keni vendosur. Në rastin tonë ishte 4096.

ulimit -n

Ne mund të testojmë se kjo është një vlerë e drejtpërdrejtë, operacionale duke ridrejtuar programin tonë të pangopur nga skedarët.

./open-Files

Programi nuk arrin të hapë skedarin numër 4094, që do të thotë se 4093 skedarë u hapën. Kjo është vlera jonë e pritur, 3 më pak se 4096.

Mos harroni se gjithçka është një skedar

Kjo është arsyeja pse Linux është kaq i varur nga dorezat e skedarëve. Tani, nëse filloni t'ju mbarojnë ato, ju e dini se si të rritni kuotën tuaj.