Belirli bir işlemin ulimitini (açık dosyaları) değiştirme


27

Değişmek mümkün mü - yumuşak ve sert limitini a özgü süreç?

Benim durumumda, işlemim mongodve bir çok web kaynağımın basitçe yürütmemi söylediği:

ulimit -n <my new value>

Mevcut düşüncelerim:

  • Komut, değiştireceğim sürecin sınırını nasıl bilecek ? Bu, tüm sistemlerin açık dosya sınırını değiştirmeyecek mi?
  • Bu komutun yalnızca yumuşak sınırı değiştirdiğini tahmin ediyorum. Yani zor sınırı da arttırmanın bir yolu var mı?

Bu değerli bilgiyi okudun mu? docs.mongodb.org/manual/reference/ulimit
tink

Evet, hepsini ezbere öğrendim .. Bir şey kaçırıp kaçırmadığımdan emin değilim ama bu sayfa yalnızca ayrıntıları nasıl görüntüleyeceğinizi anlatıyor. Sadece ulimit -n <değer> ...
test

Yanıtlar:


29

Bir işlem limitlerini setrlimit(2)sistem çağrısı yoluyla değiştirebilir . Koşarken ulimit -nbir sayı görmelisin. Bu, işlem için açık dosya tanıtıcılarının sayısının (dosyalar, soketler, borular vb. Dahil) geçerli sınırıdır. ulimitKomut yürütüldüğünde getrlimit(2)geçerli değer ne olduğunu öğrenmek için sistem çağrısı.

İşte kilit nokta: bir işlem mevcut sınırını üst işleminden devralır. Yani koştuysanız ulimit -n 64, bu kabuğun açık dosya tanımlayıcı sınırını 64 olarak ayarlarsınız. Kabuğun başladığı herhangi bir işlem, yeni işlem setrlimit()uygun şekilde çağırılmadıkça aynı sınıra sahip olur .

mongodb'sAçık dosya tanımlayıcı sınırını değiştirmek ulimit -n 2048için, bir kabuğun içinde (veya çekirdeğinizin izin verdiği büyüklükte) çalıştırırsınız . Daha sonra başlamak için o kabuğu kullandın mongodb. Bir alt süreç olarak, mongodbaçık dosya tanımlayıcıları üzerindeki (büyük) limiti devralır.

Sistemin açık dosya sınırını değiştirmek için, tüm işlemlerin açık dosya tanımlayıcı sınırının toplamına benziyor gibi görünmesi için, modifiye et /etc/sysctl.confve çalıştır gibi bir şey yapmalısınız sysctl -p. İçindeki fs.file-maxparametrenin değerine bakın /etc/sysctl.conf.


Ne güzel bir açıklama! Çok teşekkür ederim. Bunu hemen deneyeceğim!
sınava

Bu cevap bana çok yardımcı oldu, ama şimdi sorun şu ki zor sınır 2048, ve bu benim durumumda yeterli değil. 1) Çekirdeğimin izin verdiği sınırı nasıl bulabilirim? 2) HARD LIMIT'i şimdi değiştirmek mümkün mü? Tekrar teşekkürler!
test edin

test - Asla zor limiti yükseltmedim. Bunu buldum : blog.samat.org/2011/04/05/… ve bu wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Aynı şeyi söylüyorlar.
Bruce Ediger 16:13

18

Çalışan bir işlemin sınırlarını değiştirmek için utility komutunu kullanabilirsiniz prlimit.

prlimit --pid 12345 --nofile=1024:1024

Bunun dahili olarak yaptığı şey aramaktır setrlimit(2). Prlimit'in man sayfası bazı yararlı çağrı örnekleri içermelidir.

Kaynak: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/


Bu günümü kurtardı, teşekkürler. too many files openHata yapan Python işlemlerini çok uzun sürdüm. Cevabınız işlemi durdurmadan sorunumu çözdü.
Visionscaper

1

En azından Linux'ta çoğu dağıtım kimlik doğrulama için pam kullanıyor gibi görünüyor. Pam ile gelen modüllerden biri limit modülüdür. Pam_limits için README'den alıntı:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

Sonuç olarak, her iki kategoride de kullanıcı başına, grup başına ve varsayılan limitleri ayarlayabilirsiniz (kök bunu ayarlar ve işlem daha yüksek talep edemez) ve yumuşak sınırlar. Yumuşak sınırlar tipik olarak sert sınırlardan daha düşük olarak ayarlanır ve uygulama, zor sınırına ulaşana kadar yukarı doğru artırabilir.

Sizin durumunuzda, işlemlerin limitlerini artırmak istediğiniz işlem normal bir kullanıcı olarak çalışıyorsa, o kullanıcı veya grubun limitlerini artırabilirsiniz. Örnek olarak, açılacak ekstra dosya tanıtıcısı gerektiren bazı sunucularda bazı mysql cron işleri var, bu yüzden şunu ayarladım:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

Yeniden başlatılması gereken hiçbir şey yok; Bu kullanıcıya dava açtığınızda, yeni sınırların etkili olduğunu hemen görebilirsiniz.

Tipik bir RedHat türetilmiş sistemindeyseniz yapabileceğiniz bir diğer şey de / etc / sysconfig / $ SERVICE betiğine istediğiniz ulimit çağrısını koymaktır. Örnek olarak, apache'nin init betiği /etc/init.d/httpd olarak adlandırılır ve bulunursa / etc / sysconfig / httpd configuration dosyasını yazar. Ritmi yükseltildiğinde init betiği güncellendiğinden, init betiğinin kendisini düzenlemek yerine bunu yaparak yönetmeyi daha kolay buldum, ancak sysconfig dosyaları yalnızca varsayılandan değiştirilmediklerinde güncellenir.


En iyi ve en pratik çözüm.
nelaaro

0

Komut, değiştireceğim sürecin sınırını nasıl bilecek? Bu, tüm sistemlerin açık dosya sınırını değiştirmeyecek mi?

Komut, geçerli işlem (kabuğunuz) ve herhangi bir alt işlem (daha sonra kabuğundan çalıştığınız herhangi bir şey) için sınırı değiştirir.

İşlemler bir ağaçta düzenlenir. Her sürecin (onu çağıran) bir ebeveyni vardır. 1 numaralı işlem, init, kendi ebeveyni olması için özel bir işlemdir. Htop veya top gibi araçlar, ebeveynlerin ve çocukların bir ağacı olarak görüntülenen işlemleri gösterebilir.

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.