Linux'ta "Çok Fazla Açık Dosya" Hatası Nasıl Çözülür?
Yayınlanan: 2022-06-29Linux 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, 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, 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
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
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
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
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ç
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
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
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
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
“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.
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
"DefaultLimitNOFILE" dizesini içeren satırda aynı ayarlamaları yapın.
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
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
Dosya açgözlü programımızı yeniden çalıştırarak bunun canlı, operasyonel bir değer olduğunu test edebiliriz.
./dosyaları aç
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?