Ulimit dosya tanıtıcı sınırları belirli bir işlem için uygulanmıyor


14

Son zamanlarda kullanarak uygulanan ulimits için redis süreçlerimizden birini kontrol ettim:

cat /proc/<redis-pid>/limits

Ve düşük varsayılan değerde olduğunu öğrenmek için sürpriz oldu:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Şaşırdım, çünkü aşağıdakileri yapılandırdık:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

Birisi bana artan ulimitin neden tekrar çalışma sürecine uygulanmadığını söyleyebilir mi?

Redis işlemi kullanıcı 'redis' olarak çalışıyor, limitler artırıldığından sunucu yeniden başlatıldı. Debian Squeeze'deyiz.

Yanıtlar:


19

Linux'ta kaynak türleri, gereksinim türüne göre çeşitli yerlerde ayarlanabilir.

  1. /etc/security/limits.conf dosya.
  2. /etc/sysctl.conf dosya.
  3. ulimit komuta

/etc/security/limits.confpam_limits öğesinin bir parçasıdır ve bu nedenle bu dosyada belirlenen limitler giriş oturumları sırasında pam_limits modülü tarafından okunur. Oturum açma oturumu şu sshveya bu şekilde olabilir terminal. Ve pam_limits, burada belirtildiği gibi daemon süreçlerini etkilemez .

/etc/sysctl.confsistem genelinde global bir yapılandırmadır, burada kullanıcıya özel yapılandırma ayarlayamayız. Toplayıcıya konan tüm kullanıcılar / işlemler tarafından kullanılabilecek maksimum kaynak miktarını ayarlar.

ulimitkomutu kabuğun sınırlarını ayarlamak için kullanılır. Ve böylece ulimitbir kabukta bir sınır belirlendiğinde, kabuktan çıkma işlemi özellikleri child processdevralma kuralı nedeniyle de bu değeri alır parent processes.

Ve böylece davanız için , yukarıdakilerin hiçbirinin bir redisparçası olarak başladığı initiçin doğrudan size yardımcı olmayacaktır. Bunu yapmanın uygun yolu ulimit, init betiğinin kendisinde yeni değeri ayarlamak için komutu kullanmanızdır . Senaryoda aşağıdaki gibi,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

Özellik eklemek için istek listesinde zaten bir hata var .ulimitstart-stop-daemon

Ayrıca redis, orada sınır sağlamanın herhangi bir yolu olup olmadığını da yapılandırın.


Büyük özet Kannan! Şimdi ilerledim ve ulimit'i başlangıç ​​komut dosyasına ekledim. Üzücü bir şekilde (çoklu başlatma komut dosyalarımız olduğu için) kullanıcı için sınırı ayarlamanın bir yolu yoktur, ancak bu işe yarar. Teşekkür ederim!
UpTheCreek

Mükemmel cevap. Üst sürecin özelliklerini miras alan alt süreç beni şaşırttı, tüm alt süreçler alt işlemi çalıştıran kullanıcı için doğru görünüyordu, ancak kullanılan üst süreç sahibinin sınırıydı.
senkronize edin

2

Sysctl fs.file-max parametresi geniş küresel sistem sınırıdır, aynı değeri ulimit'te iyi bir fikir ayarı olduğunu düşünmüyorum.

Ulimit 100000 ve sysctl.conf 100000'de ayarladıysanız, bir kullanıcı sistemi engelleyebilir

Herhangi bir şekilde, sorununuz hakkında konuşmak, emin olmak neet, sisteminiz pam_limits kullanın

man pam_limits
grep -i limit /etc/pam.d/*

Teşekkürler - o zaman fs.file-max değerini yükseltmeyi düşüneceğim. Pam ile ilgili olarak - Bunu kullandığımıza inanıyorum (soruya bazı ekstra yapılandırma ekledim). PAM'ı anladığımdan gerçekten emin değilim, çünkü ayarlarımız bu kullanıcı tarafından kullanılmayan SSH ile ilgili görünüyor. Yapılandırmam gereken başka bir dosya var mı? Yeniden başlatma için başlangıç ​​komut dosyalarına her zaman bir ulimit ayarı koyabilirdim, ancak bunu yapmak zorunda kalmazdım.
UpTheCreek

2

Sshd için pam_limits'i etkinleştirdiniz, ancak bu komut bir SSH oturumundan yürütülüyor mu? Aynı satırı /etc/pam.d/loginve / veya /etc/pam.d/suve / veya öğesine eklemeniz gerekebilir /etc/pam.d/sudo.


Teşekkürler. Bunun doğru olmadığından şüphelendim. Süreci init.d komut bu çizgiyi başlatan ediliyor: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. Bu durumda hangi pam uygun olur?
UpTheCreek

senaryonuzda ulimit -n 100000
c4f4t0r

İnit.d komut dosyası su [user] -c, komut dosyasını başka bir kullanıcı olarak başlatmak için bir komut kullanıyor mu veya programınız root olarak çalışıyor mu? Eğer kullanıyorsa su, o zaman içine koyarsınız /etc/pam.d/su. Olarak çalıştırıyorsanız root, c4f4t0r'ın ulimitkomutu başlangıç ​​komut dosyanızda ekleme önerisiyle daha iyi durumdasınızdır . rootistediği limiti ayarlamasına izin verilir, bu yüzden gerçekten bu durum için pam hakkında endişelenmenize gerek yoktur.
Omnipresence

1
Teşekkürler. --chuid redis:redisÜzerinde kullanır start-stop-daemon. Şimdi ulimit'i başlangıç ​​komut dosyasına ekledim.
UpTheCreek
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.