2014-10-16 17 views
13

Binlerce eşzamanlı web soketi bağlantısı kullanan bir web sunucusu çalıştırıyorum. Bunun mümkün olması için, Debian linux (temel resmim google/debian: wheezy, GCE'de çalışıyor), varsayılan açık dosyaların sayısı 1000 olarak ayarlandığında, genellikle ulimit'i istenen sayıya ayarladım (64,000) .Docker limits.conf'u yok sayıyor ("çok fazla açık dosya" hatasını çözmeye çalışıyor)

Bu benim harika bir uygulama, benim uygulamamı teslim ettiğimde ve konuşlandırdığımda - docker'ın sınır tanımlarını yok saydığını öğrendim.

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf" 
: İnsanların yaparak benzer bir sorunu çözmek mümkün olduğunu gördük

MAX=64000 
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile" 
ulimit -c $MAX 

bazı araştırma yaptıktan sonra: Ben (değil konteynerin üzerine, ana makinede tümü) aşağıdaki denedi

ve docker servisini yeniden başlatın/yeniden başlatın.

Ancak, yukarıdakilerin tümü başarısız oluyor: Uygulamam kapsayıcıda çalıştığında "çok fazla açık dosya" hatası alıyorum (docker olmadan aşağıdakileri yapmak sorunu çözer).

Ulimit kurulumunun çalışıp çalışmadığı konusunda bir gösterge almak için kapsayıcının içinde ulimit -a'u çalıştırmayı denedim, ancak bunu yapmak, PATH'nin bir parçası olan yürütülebilir bir program olmadığında bir hata atar.

Bunu yapan herkes ve/veya docker'ın limitleri tanıması için bir yol önerebilir mi?

cevap

9

aşağıdaki yapılandırma ile bu sorunu mitgiate başardı:

Ben 14.04 linux liman işçisi makine ve ana makine için ubuntu kullanılır. içerecek şekilde

  • güncelleme /etc/security/limits.conf: * - nofile 64000
  • sizin /etc/sysctl.conf eklemek: fs.file-max = 64000
  • Buna gerek konak makinede

  • restart sysctl: sudo sysctl -p
+4

Docker daemon servisini de tekrar başlattığınızdan emin olun! – cgp

1

Docker bileşeniyle, ulimiteyi yapılandırabilirsiniz.

https://docs.docker.com/compose/compose-file/#ulimits

Bir haritalama gibi yumuşak/sert sınırları ekleyebilirsiniz.

Eğer ayrıcalıklı seçeneğiyle kabı çalıştırabilir İdeal olmasa da
ulimits: 
    nproc: 65535 
    nofile: 
    soft: 20000 
    hard: 40000 

(güvenlik sözkonusu olduğunda Çoğunlukla bir Dev ortamı için hızlı bir optimal olmayan bir çözüm için, tavsiye edilmez).

docker run --privileged 

bakınız:

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

+0

Bu çok kötü bir fikir. –

2

Konteyneri çalıştırırken sınırı argüman olarak iletebilirsiniz. Bu şekilde ana makinenin sınırlarını değiştirmek ve konteynere çok fazla güç vermek zorunda kalmazsınız.İşte nasıl:

docker run --ulimit nofile=5000:5000 <image-tag> 
İlgili konular