Linux'ta "Çok Fazla Açık Dosya" Hatası Nasıl Çözülür?

Yayınlanan: 2022-06-29
Bir bash istemi gösteren Linux dizüstü bilgisayar
fatmawati achmad zaenuri/Shutterstock.com

Linux bilgisayarlarda sistem kaynakları kullanıcılar arasında paylaşılır. Adil payınızdan fazlasını kullanmaya çalışın ve bir üst sınıra ulaşacaksınız. Ayrıca diğer kullanıcılara veya işlemlere de darboğaz yapabilirsiniz.

Paylaşılan Sistem Kaynakları

Diğer milyonlarca işi arasında, bir Linux bilgisayarın çekirdeği, RAM ve CPU döngüleri gibi sonlu sistem kaynaklarından kaç tanesini kimin kullandığını izlemekle her zaman meşguldür. Çok kullanıcılı bir sistem, insanların ve süreçlerin belirli bir sistem kaynağından uygun olandan daha fazlasını kullanmadığından emin olmak için sürekli dikkat gerektirir.

Örneğin, birinin bilgisayarı diğer herkes için yavaş hissedecek kadar çok CPU zamanı harcaması adil değil. Linux bilgisayarınızı kullanan tek kişi siz olsanız bile, süreçlerinizin kullanabileceği kaynaklar için belirlenmiş sınırlar vardır. Sonuçta, hala başka bir kullanıcısınız.

RAM Nedir? Bilmen gereken her şey
İLGİLİ RAM Nedir? Bilmen gereken her şey

RAM, CPU döngüleri ve sabit disk alanı gibi bazı sistem kaynakları iyi bilinir ve açıktır. Ancak, izlenen ve her kullanıcının -ya da her kullanıcıya ait sürecin- belirlenmiş bir üst sınırı olan çok, çok daha fazla kaynak vardır. Bunlardan biri, bir işlemin aynı anda açabileceği dosya sayısıdır.

Bir terminal penceresinde "Çok fazla dosya açık" hata mesajını gördüyseniz veya bunu sistem günlüklerinizde bulduysanız, bu, üst sınıra ulaşıldığı ve işlemin daha fazla dosya açmasına izin verilmediği anlamına gelir.

Sadece Açtığınız Dosyalar Değil

Linux'un işleyebileceği açık dosya sayısının sistem genelinde bir sınırı vardır. Göreceğimiz gibi bu çok büyük bir sayı, ama yine de bir sınır var. Her kullanıcı işleminin kullanabilecekleri bir tahsisi vardır. Her biri kendilerine tahsis edilen sistem toplamından küçük bir pay alırlar.

Aslında tahsis edilen şey, bir dizi dosya tanıtıcısıdır . Açılan her dosya bir tanıtıcı gerektirir. Oldukça cömert tahsislerle bile, sistem genelinde dosya tanıtıcıları, ilk başta hayal edebileceğinizden daha hızlı tükenebilir.

Linux'ta "Her Şey Bir Dosyadır" Ne Demektir?
İLGİLİ "Her Şey Bir Dosyadır" Linux'ta Ne Anlama Gelir?

Linux, neredeyse her şeyi bir dosyaymış gibi görünecek şekilde soyutlar. Bazen sadece bu kadar, düz eski dosyalar olacaklar. Ancak bir dizini açmak gibi diğer eylemler de bir dosya tanıtıcısı kullanır. Linux, donanım aygıtları için bir tür sürücü olarak blok özel dosyaları kullanır. Karakter özel dosyaları çok benzerdir, ancak daha çok borular ve seri bağlantı noktaları gibi çıktı kavramına sahip aygıtlarla kullanılırlar.

Blok özel dosyaları bir seferde veri bloklarını işler ve karakter özel dosyaları her karakteri ayrı ayrı işler. Bu özel dosyaların her ikisine de yalnızca dosya tanıtıcıları kullanılarak erişilebilir. Bir program tarafından kullanılan kitaplıklar bir dosya tanıtıcısı kullanır, akışlar dosya tanıtıcılarını kullanır ve ağ bağlantıları dosya tanıtıcılarını kullanır.

Tüm bu farklı gereksinimlerin dosya olarak görünecek şekilde soyutlanması, bunlarla arabirim oluşturmayı basitleştirir ve borulama ve akış gibi şeylerin çalışmasına izin verir.

Perde arkasında Linux'un dosyaları açtığını ve yalnızca kendini çalıştırmak için dosya tanıtıcılarını kullandığını görebilirsiniz - kullanıcı işlemlerini boşverin. Açık dosyaların sayısı, yalnızca açtığınız dosya sayısı değildir. İşletim sistemindeki hemen hemen her şey dosya tanıtıcılarını kullanıyor.

Dosya Tutamaç Sınırları

Bu komutla sistem genelindeki maksimum dosya tutamacı sayısı görülebilir.

 cat /proc/sys/fs/file-max 

Açık dosyalar için sistem maksimumunu bulma

Bu, akıl almaz derecede fazla sayıda 9.2 kentilyon verir. Teorik sistem maksimumu budur. 64 bit işaretli bir tamsayıda tutabileceğiniz mümkün olan en büyük değerdir. Zavallı bilgisayarınızın aynı anda açılan bu kadar çok dosyayla gerçekten başa çıkıp çıkamayacağı tamamen başka bir konudur.

Kullanıcı düzeyinde, sahip olabileceğiniz maksimum açık dosya sayısı için kesin bir değer yoktur. Ama kabaca çözebiliriz. İşlemlerinizden birinin açabileceği maksimum dosya sayısını bulmak için -n (dosyaları aç) seçeneği ile ulimit komutunu kullanabiliriz.

 ulimit -n 

Bir işlemin kaç dosya açabileceğini bulma

Ve bir kullanıcının sahip olabileceği maksimum işlem sayısını bulmak için -u (kullanıcı işlemleri) seçeneğiyle ulimit kullanacağız.

 ulimit -u 

Bir kullanıcının sahip olabileceği işlem sayısını bulma

1024 ve 7640'ı çarpmak bize 7.823.360'ı verir. Tabii ki, bu işlemlerin çoğu, masaüstü ortamınız ve diğer arka plan işlemleriniz tarafından zaten kullanılacaktır. Yani bu başka bir teorik maksimum ve asla gerçekçi olarak ulaşamayacağınız bir değer.

Önemli olan, bir işlemin açabileceği dosya sayısıdır. Varsayılan olarak, bu 1024'tür. Aynı dosyayı aynı anda 1024 kez açmak, aynı anda 1024 farklı dosyayı açmakla aynı şeydir. Tüm dosya tanıtıcılarınızı kullandıktan sonra işiniz bitti.

Bir işlemin açabileceği dosya sayısını ayarlamak mümkündür. Bu sayıyı ayarlarken dikkate alınması gereken iki değer vardır. Biri, şu anda ayarlandığı veya ayarlamaya çalıştığınız değerdir. Buna yumuşak limit denir. Sert bir sınır da vardır ve bu, yumuşak sınırı yükseltebileceğiniz en yüksek değerdir.

Bunu düşünmenin yolu, yumuşak limitin gerçekten “akım değeri” olduğu ve üst limitin mevcut değerin ulaşabileceği en yüksek değer olduğudur. Normal, root olmayan bir kullanıcı, soft limitini, hard limitine kadar herhangi bir değere yükseltebilir. Kök kullanıcı, sabit limitlerini artırabilir.

Mevcut yazılım ve donanım sınırlarını görmek için ulimit -S (yumuşak) ve -H (zor) seçenekleriyle ve -n (dosyaları aç) seçeneğiyle birlikte kullanın.

 ulimit -Sn
 ulimit -Hn 

İşlem dosyası tutamaçları için yumuşak ve sert sınırı bulma

Yumuşak sınırın uygulandığını görebileceğimiz bir durum yaratmak için, başarısız olana kadar dosyaları art arda açan bir program oluşturduk. Ardından, kullandığı tüm dosya tanıtıcılarından vazgeçmeden önce bir tuş vuruşunu bekler. Programa open-files denir.

 ./dosyaları aç 

Açık dosyalar programı, 1024'ün yumuşak sınırına ulaşıyor

1021 dosya açar ve 1022 dosyasını açmaya çalışırken başarısız olur.

1024 eksi 1021 3. Diğer üç dosya tanıtıcısına ne oldu? STDIN , STDOUT ve STDERR akışları için kullanıldılar. Her işlem için otomatik olarak oluşturulurlar. Bunlar her zaman 0, 1 ve 2 dosya tanımlayıcı değerlerine sahiptir.

İLGİLİ: Linux lsof Komutu Nasıl Kullanılır

Bunları -p (işlem) seçeneği ile lsof komutunu ve open-files programının işlem kimliğini kullanarak görebiliriz. Kolayca, işlem kimliğini terminal penceresine yazdırır.

 lsof -p 11038 

lsof komut çıktısındaki stdin, stdout ve stderr akışları ve dosya tanıtıcıları

Tabii ki, gerçek dünya durumunda, hangi işlemin tüm dosya tanıtıcılarını silip süpürdüğünü bilemeyebilirsiniz. Araştırmanızı başlatmak için bu sıralı komut dizisini kullanabilirsiniz. Size bilgisayarınızdaki en üretken on beş dosya tanıtıcı kullanıcısını söyleyecektir.

 lsof | awk '{ print $1 " " $2; }' | sırala -rn | tek -c | sırala -rn | kafa -15 

En çok dosya tanıtıcısını kullanan işlemleri görme

Daha fazla veya daha az giriş görmek için -15 parametresini head komutuna ayarlayın. Süreci tanımladıktan sonra, hileli olup olmadığını ve kontrolden çıktığı için çok fazla dosya açıp açmadığını veya gerçekten bu dosyalara ihtiyacı olup olmadığını anlamanız gerekir. Onlara ihtiyacı varsa, dosya tanıtıcı sınırını artırmanız gerekir.

Yumuşak Limiti Artırma

Soft limiti arttırıp programımızı tekrar çalıştırırsak daha fazla dosya açtığını görmeliyiz. ulimit komutunu ve 2048 sayısal değeriyle -n (dosyaları aç) seçeneğini kullanacağız. Bu yeni yumuşak sınır olacaktır.

 üst sınır -n 2048 

İşlemler için yeni bir dosya tanıtıcı yumuşak sınırı ayarlama

Bu sefer 2045 dosyayı başarıyla açtık. Beklendiği gibi bu, STDIN , STDOUT ve STDERR için kullanılan dosya tanıtıcıları nedeniyle 2048'den üç eksiktir.

Kalıcı Değişiklikler Yapmak

Yumuşak limitin arttırılması yalnızca mevcut kabuğu etkiler. Yeni bir terminal penceresi açın ve yumuşak limiti kontrol edin. Bunun eski varsayılan değer olduğunu göreceksiniz. Ancak, bir işlemin sahip olabileceği, kalıcı olan ve yeniden başlatmalardan kurtulan maksimum açık dosya sayısı için küresel olarak yeni bir varsayılan değer belirlemenin bir yolu vardır.

Eski tavsiyeler genellikle “/etc/sysctl.conf” ve “/etc/security/limits.conf” gibi dosyaları düzenlemenizi önerir. Ancak, sistem tabanlı dağıtımlarda bu düzenlemeler, özellikle grafiksel oturum açma oturumları için tutarlı bir şekilde çalışmaz.

Burada gösterilen teknik, bunu systemd tabanlı dağıtımlarda yapmanın yoludur. Çalışmamız gereken iki dosya var. Birincisi “/etc/systemd/system.conf” dosyasıdır. sudo kullanmamız gerekecek.

 sudo gedit /etc/systemd/system.conf 

system.conf dosyasını düzenleme

“DefaultLimitNOFILE” dizesini içeren satırı arayın. Satırın başlangıcından “#” karmasını kaldırın ve ilk sayıyı, işlemler için yeni yumuşak limitinizin ne olmasını istiyorsanız ona göre düzenleyin. 4096'yı seçtik. Bu satırdaki ikinci sayı sabit sınırdır. Bunu biz ayarlamadık.

system.conf dosyasındaki DefaultLimitNOFILE değeri

Dosyayı kaydedin ve düzenleyiciyi kapatın.

Bu işlemi “/etc/systemd/user.conf” dosyası üzerinde tekrarlamamız gerekiyor.

 sudo gedit /etc/systemd/user.conf 

user.conf dosyasını düzenleme

"DefaultLimitNOFILE" dizesini içeren satırda aynı ayarlamaları yapın.

user.conf dosyasındaki DefaultLimitNOFILE değeri

Dosyayı kaydedin ve düzenleyiciyi kapatın. systemd yeniden çalıştırılması ve yeni ayarları alması için bilgisayarınızı yeniden başlatmanız veya daemon-reexec seçeneğiyle systemctl komutunu kullanmanız gerekir.

 sudo systemctl arka plan programı-reexec 

systemd yeniden başlatılıyor

Bir terminal penceresi açmak ve yeni limiti kontrol etmek, ayarladığınız yeni değeri göstermelidir. Bizim durumumuzda bu 4096 idi.

 ulimit -n 

ulimit -n ile yeni yumuşak limiti kontrol etme

Dosya açgözlü programımızı yeniden çalıştırarak bunun canlı, operasyonel bir değer olduğunu test edebiliriz.

 ./dosyaları aç 

Açık dosyalar programıyla yeni yumuşak sınırı kontrol etme

Program 4094 numaralı dosyayı açamıyor, yani 4093 dosya açıldı. Bu bizim beklenen değerimiz, 4096'dan 3 eksik.

Her şey bir Dosyadır

Linux'un dosya tanıtıcılarına bu kadar bağımlı olmasının nedeni budur. Şimdi, bunları tüketmeye başlarsanız, kotanızı nasıl artıracağınızı biliyorsunuz.

İLGİLİ: Linux'ta stdin, stdout ve stderr nedir?