Neden Linux'ta açık dosya sayısı sınırlı?


136

Şu anda nasıl yapılacağını biliyorum:

  • İşlem başına açık dosya limitini bulmak: ulimit -n
  • tüm açık dosyaları tüm işlemlere göre say: lsof | wc -l
  • izin verilen maksimum açık dosya sayısını edinin: cat /proc/sys/fs/file-max

Sorum şu: Neden Linux'ta açık dosya sınırı var?


2
@Rob Googled biraz ve bunun bir çatal bomba olduğunu , açık dosya limitini açıklamak için kullanılabilir mi?
xanpeng

6
Peki, işlem limitleri ve dosya limitleri önemlidir, bu nedenle çatal bombalar gibi şeyler tüm kullanıcılar için bir sunucu / bilgisayarı bozmaz, yalnızca bunu yapan kullanıcı ve yalnızca geçici olarak. Aksi takdirde, paylaşılan bir sunucudaki bir kişi bir çatal tahtasını başlatabilir ve yalnızca kendileri için değil tüm kullanıcılar için tamamen durdurabilir.
Rob,

3
Güzel bir komut bazı çok yararlı komutları özetliyor! : +1:
Joshua Pinter

7
@Rob, bir çatal bomba, dosya sınırı işlem başına olduğundan ve her çatalı yeni bir dosya tanıtıcısı açmadığından, onunla hiçbir ilgisi yoktur.
psusi,

Yanıtlar:


86

Bunun nedeni, işletim sisteminin her bir açık dosyayı yönetmek için belleğe ihtiyaç duymasıdır ve bellek, özellikle gömülü sistemlerde sınırlı bir kaynaktır.

Kök kullanıcı olarak, işlem başına (yoluyla ulimit -n) ve sistem başına (örneğin echo 800000 > /proc/sys/fs/file-max) açık dosya sayısının maksimum değerini değiştirebilirsiniz .


21
Ayrıca bir güvenlik nedeni de var: eğer bir sınırlama olmasaydı, bir kullanıcı yazılımı bir yazılım tamamen sunucu kapanana kadar dosya oluşturabilecekti.
Coren

15
@Coren Burada tartışılan sınırlar sadece açık dosya işleyicilerinin sayısı içindir. Bir program dosya işleyicileri de kapatabildiğinden, kullanılabilir tüm disk alanı dolana kadar istediği kadar dosya oluşturabilir ve istediğiniz kadar büyük oluşturabilir. Bunu önlemek için, disk kotalarını veya ayrılmış bölümleri kullanabilirsiniz. Güvenlik açısından bir yönden kaynağın tükenmesini önlediğini anlamıyorsunuz - bunun için de sınırlar var.
jofel

1
@jofel Teşekkürler. Sanırım açılan dosya tanıtıcıları yapısal dosya örnekleri ile temsil ediliyor ve bu yapının boyutu oldukça küçük (bayt düzeyinde), bu yüzden /.../file-maxbellek kullanılmadığı sürece oldukça büyük bir değer ayarlayabilir miyim ?
xanpeng

7
@xanpeng Ben bir çekirdek uzmanı değilim ama görebildiğim kadarıyla, varsayılan değer RAM'in 10k'a file-maxbölünmesi gibi görünüyor. Dosya işleyicisi başına kullanılan gerçek bellek çok daha küçük olması gerektiğinden (boyutu struct fileartı bazı sürücüye bağlı bellek), bu oldukça muhafazakar bir sınır gibi görünüyor.
jofel

63

Lütfen lsof | wc -lbirçok yinelenen girişin toplandığını unutmayın (çatallı işlemler dosya tutamaçlarını vb. Paylaşabilir). Bu sayı, belirlenen limitten çok daha yüksek olabilir /proc/sys/fs/file-max.

Geçerli açık dosya sayısını Linux çekirdeğinin bakış açısından almak için şunu yapın:

cat /proc/sys/fs/file-nr

Örnek: lsof çok daha büyük bir sayı bildirmesine rağmen, bu sunucu maksimum 65536 açık dosyadan 40096'sı var:

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504

1
Gibi lsofiki kez ya da daha fazla, örneğin kadar dosya rapor verecek /dev/null, sizinle en iyi tahminde deneyebilirsiniz:lsof|awk '{print $9}'|sort|uniq|wc -l
Yvan

lsof|awk '!a[$NF]++{c++}END{print c}'yinelenmeyen açık dosya sayısını almak için kullanabilirsiniz .
P ....

18

Bence bu büyük ölçüde tarihsel nedenlerden dolayı.

Bir Unix Dosya tanıtıcı bir küçük intgibi işlevler tarafından döndürülen değer, openve creat, ve geçmişlerdir read, write, closeve benzeri.

En azından Unix'in ilk sürümlerinde, bir dosya tanıtıcısı, her bir yapının açık bir dosya hakkında bilgi içerdiği, sabit boyutlu bir işlem başına yapı dizisine bir dizindi. Doğru hatırlıyorsam, bazı eski sistemler bu tablonun boyutunu 20 ya da öylesine sınırladı.

Daha modern sistemler daha yüksek limitlere sahiptir, ancak aynı genel düzeni, büyük ölçüde ataletten uzak tutmuştur.


1
20, C dili FILE veri yapıları için Solaris limitiydi. Dosya tanıtıcı sayısı her zaman daha büyüktü.
Lothar

@ Lothar: İlginç. Limitlerin neden farklı olacağını merak ediyorum. filenoVe fdopenfonksiyonları göz önüne alındığında, neredeyse birbirlerinin yerine geçmelerini bekliyorum.
Keith Thompson,

Bir unix dosyası döndürülen dosya tanıtıcısından (int) daha fazlasıdır. Disk arabellekleri ve mevcut dosya ofsetini, dosya sahibini, izinleri,
inode'u

@ChuckCottrill: Evet, elbette. Ancak bu bilgilerin çoğunun bir dosyaya inttanımlayıcı veya a FILE*. Üzerinden 20'den fazla açık dosya varsa open(), fdopen()başarısız olur mu?
Keith Thompson
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.