Di mana ulimit default yang ditentukan pada OS X (10.5)?


26

Batas default nofileuntuk akun pengguna OS X tampaknya sekitar 256 deskriptor file hari ini. Saya mencoba menguji beberapa perangkat lunak yang membutuhkan lebih banyak koneksi daripada yang terbuka sekaligus.

Pada kotak khas Debian yang menjalankan modul batas pam, saya akan mengedit /etc/security/limits.confuntuk menetapkan batas yang lebih tinggi bagi pengguna yang akan menjalankan perangkat lunak, tapi saya bingung di mana harus menetapkan batas-batas ini di OS X.

Apakah ada GUI di suatu tempat untuk itu? Apakah ada file konfigurasi di suatu tempat untuk itu? Apa cara tersingkat untuk mengubah ulimit default pada OS X?



Jawaban:


27

Di bawah Leopard proses awalnya adalah launchd. Ulimit default dari setiap proses diwarisi dari launchd. Untuk referensi batas default (dikompilasi dalam) adalah

$ 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

Untuk mengubah salah satu dari batasan ini, tambahkan baris (Anda mungkin harus membuat file terlebih dahulu) /etc/launchd.conf, argumennya sama dengan yang diteruskan ke launchctlperintah. Sebagai contoh

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

Namun launchdsudah memulai shell login Anda, jadi cara paling sederhana untuk membuat perubahan ini berlaku adalah untuk me-restart mesin kami. (Gunakan >> untuk menambahkan ke /etc/launchd.conf.)


2
Bisakah Anda menambahkan tautan ke dokumentasi resmi untuk ini?
Glyph

7
Dude, jika ini telah didokumentasikan di mana saja, halaman ini akan tidak diperlukan
Dave Cheney

1
Sepertinya tidak bekerja di Snow Leopard.
ismail

1
Ada yang tahu bagaimana ini berbeda sysctl.maxfiles? (pertanyaan terkait: apple.stackexchange.com/questions/33715/too-many-open-files )
keflavich

2
Koreksi kecil: Anda menjalankan echosudo tetapi mencoba agar shell Anda yang tidak ditambahkan ditambahkan ke file, yang tidak memiliki izin untuk melakukannya. Coba echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.confsaja.
Vineet

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

tidak berfungsi karena sudo ada di tempat yang salah, coba ini:

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

3
Ini mungkin akan lebih baik sebagai "sunting yang disarankan" untuk jawaban yang Anda maksud.
Chris Johnsen

3

Batas shell

Sumber daya yang tersedia untuk shell dan proses dapat diubah dengan ulimitperintah yang dapat ditambahkan ke skrip startup seperti ~/.bashrcatau ~/.bash_profileuntuk pengguna individu atau /etc/bashrcuntuk semua pengguna . Baris contoh untuk ditambahkan:

ulimit -Sn 4096 && ulimit -Sl unlimited

Lihat: help ulimitdan man bashuntuk informasi lebih lanjut.

Batas sistem

Secara umum, batas sistem dikendalikan oleh kerangka kerja Launchd dan dapat diubah dengan launchctlperintah, misalnya

launchctl limit maxfiles 10240 unlimited

Untuk membuat perubahan terus-menerus, Anda perlu membuat file daftar properti di folder yang sesuai dengan peluncuran yang bertindak sebagai agen pemula.

Berikut adalah contoh perintah membuat file startup tersebut:

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"

File akan dimuat pada saat peluncuran sistem, untuk memuat agar dijalankan secara manual:

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

Untuk memverifikasi batas saat ini, jalankan: launchctl limit.

Lihat: Membuat Luncurkan Daemon dan Agen .

Batas kernel

  • Batas kernel dikendalikan oleh sysctlperintah.
  • Untuk melihat batas kernel saat ini, jalankan: sysctl -a | grep ^kern.max.
  • Untuk mengubah maksimum file diperbolehkan untuk terbuka, jalankan: sudo sysctl -w kern.maxfiles=20480.
  • Untuk membuat perubahan terus-menerus, gunakan metode di atas yang serupa untuk membuat file daftar properti di folder startup sistem.

Terkait:


Metode yang sudah usang

Dalam versi macOS sebelumnya, Anda dapat menetapkan batas-batas ini di seluruh /etc/sysctl.confsistem seperti yang biasa Anda lakukan di Unix, namun, sepertinya itu tidak didukung.

Menggunakan ~/.launchd.confatau /etc/launchd.confnampak juga tidak didukung dalam versi macOS yang ada. wiki

Sama dengan /etc/rc.localfile startup, itu tidak didukung pada macOS.


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
%

Sekarang saya harus menemukan mengapa ada 2 cara pemeriksaan / pengaturan batas ....


Oke - sepertinya ulimitdan sysctlmemberi kesan positif palsu bahwa mereka benar-benar melakukan sesuatu - tetapi mereka tampaknya tidak berguna . Bisakah seseorang memverifikasi itu?


Oke, saya mulai mengerti. Pada v10.4, tidak ada initproses lagi, telah diganti oleh launchd, yang juga berjalan dengan PID 1.

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

Dan tentu saja layak disebutkan adalah bahwa itu ulimitadalah built-in launchctlshell , adalah program shell-independen.


2

Pada OS X, jika Anda mencoba untuk memodifikasi batas lunak untuk daemon atau proses atau tugas, cara yang tepat untuk mengubah batas lunak ini bukan dengan mengubah konfigurasi launchd default untuk semua proses, tetapi dengan mengaturnya untuk proses Anda berada mencoba lari.

Ini dilakukan dalam file launchd .plist Anda untuk proses Anda.

Jika Anda memiliki daemon atau proses yang sedang berjalan dan Anda perlu memiliki lebih banyak file terbuka, buat file plist untuknya dan tambahkan params ini ke dalamnya:

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

Contohnya, menggunakan mongodb. Saya membuat file .plist bernama org.mongo.mongodb.plist, dan menyimpannya di /Library/LaunchDaemons/org.mongo.mongodb.plist. File terlihat seperti ini:

<?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>

Sekarang proses Anda memiliki sumber daya yang dibutuhkan, tanpa mucking dengan konfigurasi global untuk sistem. Ini akan secara otomatis diatur pada restart. Atau, jika Anda tidak ingin memulai kembali, Anda dapat menjalankan

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

Jika proses atau tugas Anda lebih dari sekadar agen daripada daemon, Anda bisa memasukkan .plist di / Library / LaunchAgents sebagai gantinya. Aturan berbeda berlaku untuk bagaimana launchd akan mengontrol proses Anda dalam kedua kasus. LaunchDaemons tampaknya dicadangkan untuk proses yang launchd akan mencoba untuk mengikuti setiap saat.


1

Berikut ini harus menyelesaikan sebagian besar solusi (dan didaftar sesuai urutan hierarki mereka):

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

Catatan:

  1. Anda harus memulai ulang agar perubahan ini berlaku.
  2. AFAIK Anda tidak lagi dapat menetapkan batas 'tidak terbatas' di bawah OS X
  3. launchctl maxfiles dibatasi oleh sysctl maxfiles, dan karenanya tidak dapat melebihi mereka
  4. sysctl tampaknya mewarisi kern.maxfilesperproc dari launchctl maxfiles
  5. ulimit tampaknya mewarisi nilai 'file terbuka' dari launchctl secara default
  6. Anda dapat mengatur ulimit khusus di dalam / etc / profile, atau ~ / .profile; sementara ini tidak wajib saya berikan contoh
  7. Berhati-hatilah saat menetapkan salah satu dari nilai-nilai ini ke angka yang sangat tinggi bila dibandingkan dengan standarnya - fitur-fitur ini memiliki stabilitas / keamanan. Saya telah mengambil nomor contoh ini yang saya yakini masuk akal, ditulis di situs web lain.
  8. Ketika batas launchctl lebih rendah dari yang sysctl, ada laporan bahwa yang sysctl relevan akan bertemu secara otomatis untuk memenuhi persyaratan.

1

Pengalaman saya adalah bahwa tugas penghitungan proses tinggi saya hanya berhasil dengan:

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

kern.maxprocperuid=2048

ulimit -u 2048

Dua yang pertama dapat masuk ke /etc/sysctl.confdan nilai ulimit ke launchd.conf, untuk pengaturan yang andal.

Karena tcp / ip adalah bagian dari apa yang saya lakukan, saya juga perlu menambahkan

kern.ipc.somaxconn=8192

dari default 128.

Sebelum saya meningkatkan batas proses, saya mengalami kegagalan "garpu", tidak cukup sumber daya. Sebelum saya meningkatkan kern.ipc.somaxconn, saya mendapatkan kesalahan "pipa rusak".

Ini saat menjalankan sejumlah proses (500-4000) terpisah pada monster saya Mac, OS 10.5.7, lalu 10.5.8, sekarang 10.6.1. Di Linux di komputer bos saya, itu hanya berfungsi.

Saya pikir jumlah proses akan mendekati 1000, tetapi tampaknya setiap proses yang saya mulai menyertakan salinan cangkangnya sendiri di samping item yang sebenarnya melakukan pekerjaan yang sebenarnya. Sangat meriah

Saya menulis mainan tampilan yang berbunyi seperti:

#!/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

dan menyaksikan jumlah maksimum proses dalam ps -ef dan berkeliaran di netstat menunggu untuk TIME_WAITkedaluwarsa ... Dengan batas yang ditingkatkan, saya melihat 3500+ TIME_WAITitem di puncak.

Sebelum saya menaikkan batas saya bisa 'menyelinap' di ambang kegagalan, yang dimulai di bawah 1K tetapi naik ke nilai tinggi 1190 .. setiap kali didorong ke kegagalan itu bisa mengambil sedikit lebih banyak waktu berikutnya, mungkin karena sesuatu cache yang diperluas ke batasnya setiap kali gagal.

Meskipun test case saya memiliki "menunggu" sebagai pernyataan terakhir masih ada banyak proses terpisah berkeliaran setelah keluar.

Saya mendapatkan sebagian besar info yang saya gunakan dari posting di internet, tetapi tidak semuanya akurat. Jarak Anda mungkin beragam.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.