OS X'te (10.5) belirtilen varsayılan ulimitler nerede?


26

nofileOS X kullanıcı hesaplarının varsayılan sınırı bugünlerde 256 dosya tanımlayıcısı gibi görünüyor. Aynı anda açıldığından çok daha fazla bağlantı gerektiren bazı yazılımları test etmeye çalışıyorum.

Pam limitleri modülünü çalıştıran tipik bir Debian kutusunda /etc/security/limits.conf, yazılımı çalıştıracak kullanıcı için daha yüksek sınırlar koymak üzere düzenleme yapardım, ancak OS X'te bu limitleri nereye ayarlayacağımı gizlendim.

Bunun için bir yerde bir GUI var mı? Bunun için bir yerde bir config dosyası var mı? OS X'te varsayılan ulimitleri değiştirmenin en kolay yolu nedir?



Yanıtlar:


27

Leopard altında ilk işlemdir launchd. Her işlemin varsayılan ulimits değeri devralınır launchd. Başvuru için varsayılan (derlenmiş) sınırlar

$ sudo launchctl limit
    cpu         unlimited      unlimited      
    filesize    unlimited      unlimited      
    data        6291456        unlimited      
    stack       8388608        67104768       
    core        0              unlimited      
    rss         unlimited      unlimited      
    memlock     unlimited      unlimited      
    maxproc     266            532            
    maxfiles    256            unlimited

Bu sınırların herhangi birini değiştirmek için bir satır ekleyin (önce dosyayı oluşturmanız gerekebilir) /etc/launchd.conf, argümanlar launchctlkomuta iletilenlerle aynıdır . Örneğin

echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf

Ancak launchd, giriş kabuğunuzu zaten başlattığınızdan, bu değişiklikleri yapmanın en kolay yolu makinemizi yeniden başlatmaktır. (/Etc/launchd.conf dosyasına eklemek için >> kullanın.)


2
Bunun için resmi belgelere bir link ekler misiniz?
Glyph

7
Bu eğer Dostum edildi hiçbir yerinde belgelenmiş, bu sayfa gerekli olmaz
Dave Cheney

1
Kar leoparı üzerinde çalışmıyor gibi görünüyor.
ismail

1
Bunun nasıl farklı olduğu hakkında bir fikrin var sysctl.maxfilesmı? (ilgili soru: apple.stackexchange.com/questions/33715/too-many-open-files )
keflavich

2
Küçük düzeltme: echosudo altında çalışıyorsunuz ancak ayrıcalıklı olmayan kabuğunuzun dosyaya eklemesini sağlamaya çalışıyorsunuz. echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.confBunun yerine deneyin .
Vineet

4
sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf

çalışmıyor, çünkü sudo yanlış yerde. Bunu deneyin:

echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf

3
Bu, muhtemelen atıfta bulunduğunuz cevap için “önerilen düzenleme” olarak daha iyi olacaktır.
Chris Johnsen

3

Kabuk sınırları

Kabuk ve süreçlere uygun Kaynakları değiştirilebilir ulimitgibi başlangıç komut dosyaları eklenebilir komutu ~/.bashrcveya ~/.bash_profilebireysel kullanıcılar için veya /etc/bashrctüm kullanıcılar için . Eklenecek örnek satır:

ulimit -Sn 4096 && ulimit -Sl unlimited

Bkz: help ulimitve man bashdaha fazla bilgi için.

Sistem sınırları

Genel olarak, sistem sınırları Launchd çerçevesi tarafından kontrol edilir ve launchctlkomutla değiştirilebilir;

launchctl limit maxfiles 10240 unlimited

Değişiklikleri kalıcı hale getirmek için, başlangıç ​​aracısı görevi gören belirli Başlatma uyumlu klasörlerde bir özellik listesi dosyası oluşturmanız gerekir .

İşte böyle bir başlangıç ​​dosyasını oluşturan örnek komut:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist -c "add Label string com.launchd.maxfiles" -c "add ProgramArguments array" -c "add ProgramArguments: string launchctl" -c "add ProgramArguments: string limit" -c "add ProgramArguments: string maxfiles" -c "add ProgramArguments: string 10240" -c "add ProgramArguments: string unlimited" -c "add RunAtLoad bool true"

Bununla birlikte, dosya elle çalıştırılmak üzere yüklenmek üzere sistem açılışında yüklenir:

sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist

Geçerli limitlerini doğrulamak için çalıştırın: launchctl limit.

Bkz.: Başlatma Görevlisi ve Aracıları Oluşturma .

Çekirdek sınırları

  • Çekirdek sınırları sysctlkomut tarafından kontrol edilir .
  • Geçerli çekirdek sınırlarını görmek için çalıştırın: sysctl -a | grep ^kern.max.
  • Açık, kaçak izin dosyaların maksimum değiştirmek için: sudo sysctl -w kern.maxfiles=20480.
  • Değişiklikleri kalıcı hale getirmek için, özellik listesi dosyasını sistem başlangıç ​​klasöründe oluşturmak üzere yukarıdaki yöntemi kullanın.

İlgili:


Kaldırılan yöntemler

MacOS'un önceki sürümlerinde, bu sınırları /etc/sysctl.confnormalde Unix'te yaptığınız gibi sistem genelinde ayarlayabilirsiniz , ancak desteklenmiyor gibi görünüyor.

Kullanılması ~/.launchd.confveya /etc/launchd.confgöründüğü gibi MacOS'un mevcut sürümlerinde de desteklenmiyor. wiki

/etc/rc.localBaşlangıç ​​dosyası ile aynı , macOS'ta desteklenmiyor.


2
% ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) 6144
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2560
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 266
virtual memory          (kbytes, -v) unlimited
%

Şimdi neden 2 kontrol / ayar limitinin mevcut olduğunu bulmalıyım ....


Tamam - gibi görünüyor ulimitve sysctlaslında bir şeyler yapmak bir yanlış pozitif bir fikir verir - ama bunun yerine göründüğü gibi faydasız . Birisi bunu doğrulayabilir mi?


Tamam, anlamaya başladım. V10.4'ten itibaren, initartık bir işlem yok, bunun yerini launchd1 PID alıyor.

% ps -fu root
  UID   PID  PPID   C     STIME TTY           TIME CMD
    0     1     0   0   0:30.72 ??         0:46.72 /sbin/launchd

Ve tabii ki bahsetmeye değer, ulimitkabuğun yerleşik launchctlolduğu, kabuğundan bağımsız bir programdır.


2

OS X'te, bir arka plan programı veya işlem veya görev için yazılım sınırlarını değiştirmeye çalışıyorsanız, bu yazılım sınırlarını değiştirmenin doğru yolu, tüm işlemler için varsayılan fırlatma yapılandırmasını değiştirerek değil koşmaya çalışıyorum.

Bu işleminiz için launch .plist dosyanızda gerçekleştirilir.

Daha açık dosyalar olması gereken çalışan bir arka planınız veya işleminiz varsa, bunun için bir plist dosyası oluşturun ve aşağıdaki paramları ekleyin:

    <key>SoftResourceLimits</key>
    <dict>
        <key>NumberOfFiles</key>
        <integer>1024</integer>
    </dict>

Mongodb kullanan bir örnek. Org.mongo.mongodb.plist adlı bir .plist dosyası oluşturup /Library/LaunchDaemons/org.mongo.mongodb.plist dosyasına kaydedin. Dosya şöyle görünür:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Disabled</key>
  <false/>
  <key>Label</key>
  <string>org.mongo.mongod</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/lib/mongodb/bin/mongod</string>
    <string>--dbpath</string>
    <string>/Users/Shared/mongodata/</string>
    <string>--logpath</string>
    <string>/var/log/mongodb.log</string>
  </array>
  <key>QueueDirectories</key>
  <array/>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>daemon</string>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
    <key>NumberOfProcesses</key>
    <integer>512</integer>
  </dict>
</dict>
</plist>

Artık, işleminiz, sistemin genel yapılandırmasına uymadan, ihtiyaç duyduğu kaynaklara sahip. Bu yeniden başlatma sırasında otomatik olarak ayarlanacaktır. Veya, yeniden başlatmak istemiyorsanız çalıştırabilirsiniz.

sudo launchctl load /Library/LaunchDaemons/org.mongod.plist

İşleminiz veya göreviniz bir servisten daha fazla bir ajansa, bunun yerine .plist / Library / LaunchAgents öğelerini koyabilirsiniz. Başlatmanın her iki durumda da işleminizi nasıl kontrol edeceği konusunda farklı kurallar uygulanır. LaunchDaemons, başlatılan işlemlerin her zaman yetişmeye çalışacağı süreçler için ayrılmış görünüyor.


1

Aşağıdakiler çoğu çözümü çözmelidir (ve hiyerarşilerine göre sıralanmıştır):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

Notlar:

  1. Bu değişikliklerin etkili olması için yeniden başlatmanız gerekecek.
  2. AFAIK, OS X kapsamında artık 'sınırsız' sınırlarını ayarlayamazsınız.
  3. launchctl maxfiles, sysctl maxfiles tarafından sınırlandırılmıştır ve bu nedenle onları aşamaz.
  4. sysctl, kern.maxfilesperproc dosyasını launchctl maxfiles yazılımından devralmış görünüyor
  5. ulimit, varsayılan olarak launchctl'deki 'open files' değerini devralmış görünüyor
  6. / etc / profile veya ~ / .profile içinde özel bir ulimit ayarlayabilirsiniz; bu gerekli olmasa da bir örnek verdim
  7. Bu değerlerden herhangi birini varsayılan değerlerine kıyasla çok yüksek bir sayıya ayarlarken dikkatli olun - özellikler kararlılık / güvenlik vardır. Makul olduğuna inandığım bu örnek numaraları başka web sitelerinde yazılı olarak aldım.
  8. Launchctl limitleri sysctl sınırlarından düşük olduğunda, ilgili sysctl sınırlarının gereklilikleri karşılamak için otomatik olarak çarpılacağına dair raporlar vardır.

1

Tecrübelerime göre yüksek işlem sayımlı görevim yalnızca şunları başardı:

kern.maxproc=2500  # This is as big as I could set it.

kern.maxprocperuid=2048

ulimit -u 2048

İlk /etc/sysctl.confayar, güvenilir ayar için ulimit değeri launchd.conf dosyasına girebilir.

Tcp / ip benim yaptığım işin bir parçası olduğundan, ayrıca hızlandırmaya ihtiyacım vardı.

kern.ipc.somaxconn=8192

varsayılan 128’inden.

Süreç limitlerini artırmadan önce yeterli kaynak değil "çatal" hataları alıyordum. Kern.ipc.somaxconn yazılımını arttırmadan önce "kırılmış boru" hatalarıyla karşılaşıyordum.

Bu, benim canavar Mac, OS 10.5.7, daha sonra 10.5.8, şimdi 10.6.1'de oldukça fazla sayıda (500-4000) müstakil işlem yürütüyordu. Patronlarımın bilgisayarında Linux altında sadece çalıştı.

İşlem sayısının 1000'e yakın olacağını düşündüm, ancak başladığım her işlemin fiili işi yapan fiili öğeye ek olarak kabuğun kendi kopyasını da içeriyor gibi görünüyor. Çok şenlikli.

Gibi bir şey gitti bir ekran oyuncak yazdım:

#!/bin/sh

while[ 1 ]

do

    n=netstat -an | wc -l

    nw=netstat -an | grep WAIT | wc -l

    p=ps -ef | wc -l

    psh=ps -ef | fgrep sh | wc -l

    echo "netstat: $n   wait: $nw      ps: $p   sh: $psh"

    sleep 0.5

done

ve ps -ef'teki ve işlem TIME_WAITsüresinin dolmasını bekleyen netstat'ta takılan maksimum işlem sayısını izledim TIME_WAIT.

Sınırları yükseltmeden önce 1K'nın altında başlayan ama 1190 değerinde yükselen başarısızlık eşiğine 'gizlice girebiliyorum' .. her seferinde başarısızlığa itildiğinde, muhtemelen bir şey yüzünden biraz daha zaman alabilirdi Her başarısızlığında sınırını genişleten önbellek.

Test davamın son ifadesi olarak bir "bekletme" olmasına rağmen, çıktıktan sonra hala takılı kalan işlemlerin TESİSİ vardı.

İnternetteki kayıtlardan kullandığım bilgilerin çoğunu aldım, ancak hepsi doğru değildi. Milajınız değişebilir.

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.