Linux'ta izin verilen en fazla açık dosya sayısı


10

Linux'ta maksimum açık dosya sayısını ne kadar yapılandırabileceğiniz konusunda (teknik veya pratik) bir sınır var mı? Çok fazla sayıda (örneğin 1-100M) yapılandırırsanız bazı olumsuz etkiler var mı?

Burada sunucu kullanımını düşünüyorum, gömülü sistemleri değil. Çok miktarda açık dosya kullanan programlar elbette hafızayı yiyebilir ve yavaş olabilir, ancak sınır gerekenden çok daha büyük yapılandırılmışsa (örneğin sadece yapılandırma tarafından tüketilen hafıza) olumsuz etkilerle ilgileniyorum.


Teorik olarak, kullanılabilir bellek ve her bir fd'nin 1K bellek kullandığı iddiasına bağlı olarak sisteminizin kaç dosya tanımlayıcısını işleyebileceğini hesaplayabilirsiniz: serverfault.com/questions/330795/…
Alastair McCormack

Yanıtlar:


10

Sınırın ana nedeninin aşırı bellek tüketiminden kaçınmak olduğundan şüpheleniyorum (her bir açık dosya tanımlayıcısı çekirdek belleği kullanıyor). Ayrıca, dosya tanımlayıcılarını sızdıran ve sistem kaynaklarını tüketen buggy uygulamalarına karşı bir koruma görevi görür.

Ancak modern sistemlerin 10 yıl önceki sistemlerle karşılaştırıldığında ne kadar saçma bir RAM olduğunu düşünürsek, bugünkü varsayılanların oldukça düşük olduğunu düşünüyorum.

2011'de Linux'ta dosya tanımlayıcıları için varsayılan sabit sınır 1024'ten 4096'ya yükseltildi .

Bazı yazılımlar (örn. MongoDB), varsayılan sınırdan çok daha fazla dosya tanımlayıcı kullanır. MongoDB halkı bu sınırı 64.000'e çıkarmanızı tavsiye ediyor . rlimit_nofileBelirli uygulamalar için 300.000’i kullandım .

Yumuşak sınırı varsayılan (1024) konumunda tuttuğunuz sürece, sabit sınırı artırmak muhtemelen oldukça güvenlidir. Programlar setrlimit()sınırlarını yumuşak sınırın üzerine çıkarmak için çağırmalıdır ve yine de sınırlama ile sınırlıdır.

Ayrıca ilgili bazı sorulara bakın:


6
Bu aslında soruyu cevaplamadı, bu da zor limiti ne kadar yüksek ayarlayabileceğine dair teknik veya pratik bir sınır olup olmadığını sordu . Var, ama bu cevap hiç bahsetmiyor.
JdeBP

Limiti yaklaşık 1 milyonun üzerine çıkarmanın imkansız olduğunu düşünüyorum. Bence çekirdekte kodlanmış olabilir, çünkü birçok konfigürasyonu değiştirmeme rağmen bunun ötesine geçemem. superuser.com/questions/1468436/…
Pavel Komarov

3

Etki normalde gözlemlenebilir olmaz, ancak çekirdeğin IO modülü tüm bu açık dosya tanımlayıcılarıyla ilgilenmek zorunda kalacak ve ayrıca önbellek verimliliği üzerinde de etkisi olabilir.

Bu sınırlar, kullanıcıyı kendi (veya üçüncü tarafların) hatalarından koruma avantajına sahiptir. Örneğin, süresiz olarak çatallanan küçük bir program veya komut dosyası çalıştırırsanız, en sonunda ulimits'den birini engeller ve bu nedenle daha yoğun (muhtemelen kurtarılamaz) bir bilgisayarın donmasını önler.

Bu sınırlardan herhangi birini artırmak için kesin nedenleriniz olmadıkça, bundan kaçınmalı ve daha iyi uymalısınız.


2

Teknik olarak imzasız uzun (C Lang) maksimum değeri ile sınırlıdır, yani 4,294,967,295

Referans: fs.hdosya

/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
  unsigned long nr_files;   /* read only */
  unsigned long nr_free_files;  /* read only */
  unsigned long max_files;    /* tunable THIS IS OUR VALUE */
};

2
Bunun için referansınız var mı?
Tim

Ayrıca 32 bit işaretli tam sayı için maksimum değer, 32 bit işaretsiz tam sayı maksimum değeri 4.294.967.295'dir.
Sampo

Haklısın Sampo. Benim hatam.
Leonard T

0

Endişenizin anlaşılabilir olduğunu düşünüyorum, ancak büyük olasılıkla Linux yapılandırılmış (ancak kullanılan dosya tanımlayıcıları değil) için çok fazla bellek tüketmeyecek :)

Son 10 yıldır mesleki kariyerimde böyle bir problemi hatırlayamıyorum.

Saygılarımızla.


0

Sessiz geç ama bu herkesin bu sorunun cevabını almasına yardımcı olmalı. Linux'ta açık dosya sayısı için pratik sınır, bir işlemin açabileceği maksimum dosya tanımlayıcı sayısı kullanılarak da sayılabilir.

Limitlerin sistemden sisteme değiştiğini gördüm. Gönderen getlimit adam sayfasında bunu görebilirsiniz RLIMIT_NOFILE-1dahili belirtir sınırları.

RLIMIT_NOFILE değerini kontrol etmek için aşağıdaki ifadeyi kullanarak bir demet alabilirsiniz

python -c "import resource; print(resource.getrlimit(resource.RLIMIT_NOFILE))"

Tuple sonuçları (Soflimit, hardlimit) olarak döndürür. Benim için birden fazla sistemde çalışan sonuçlar aşağıdaki gibidir

(1024, 1048576) # on UBUNTU linux 
(65536, 65536)  # on amazon linux 
(1024, 9223372036854775807) # on macos 

Not: 9223372036854775807 bu sayı sadece sonsuzluk anlamına gelir. Buna çarpmadan önce her zaman diğer kaynak sınırlarına ulaşacaksınız. Bir sistemdeki donanım sınırını olduğundan daha fazla değiştirdiyseniz, çekirdek parametrelerini değiştirmeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.