Batas default nofile
untuk 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.conf
untuk 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:
Di bawah Leopard proses awalnya adalah
launchd
. Ulimit default dari setiap proses diwarisi darilaunchd
. Untuk referensi batas default (dikompilasi dalam) adalahUntuk mengubah salah satu dari batasan ini, tambahkan baris (Anda mungkin harus membuat file terlebih dahulu)
/etc/launchd.conf
, argumennya sama dengan yang diteruskan kelaunchctl
perintah. Sebagai contohNamun
launchd
sudah 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.)sumber
sysctl.maxfiles
? (pertanyaan terkait: apple.stackexchange.com/questions/33715/too-many-open-files )echo
sudo tetapi mencoba agar shell Anda yang tidak ditambahkan ditambahkan ke file, yang tidak memiliki izin untuk melakukannya. Cobaecho "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
saja.tidak berfungsi karena sudo ada di tempat yang salah, coba ini:
sumber
Batas shell
Sumber daya yang tersedia untuk shell dan proses dapat diubah dengan
ulimit
perintah yang dapat ditambahkan ke skrip startup seperti~/.bashrc
atau~/.bash_profile
untuk pengguna individu atau/etc/bashrc
untuk semua pengguna . Baris contoh untuk ditambahkan:Lihat:
help ulimit
danman bash
untuk informasi lebih lanjut.Batas sistem
Secara umum, batas sistem dikendalikan oleh kerangka kerja Launchd dan dapat diubah dengan
launchctl
perintah, misalnyaUntuk 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:
File akan dimuat pada saat peluncuran sistem, untuk memuat agar dijalankan secara manual:
Untuk memverifikasi batas saat ini, jalankan:
launchctl limit
.Lihat: Membuat Luncurkan Daemon dan Agen .
Batas kernel
sysctl
perintah.sysctl -a | grep ^kern.max
.sudo sysctl -w kern.maxfiles=20480
.Terkait:
Metode yang sudah usang
Dalam versi macOS sebelumnya, Anda dapat menetapkan batas-batas ini di seluruh
/etc/sysctl.conf
sistem seperti yang biasa Anda lakukan di Unix, namun, sepertinya itu tidak didukung.Menggunakan
~/.launchd.conf
atau/etc/launchd.conf
nampak juga tidak didukung dalam versi macOS yang ada. wikiSama dengan
/etc/rc.local
file startup, itu tidak didukung pada macOS.sumber
Sekarang saya harus menemukan mengapa ada 2 cara pemeriksaan / pengaturan batas ....
Oke - sepertinya
ulimit
dansysctl
memberi 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
init
proses lagi, telah diganti olehlaunchd
, yang juga berjalan dengan PID 1.Dan tentu saja layak disebutkan adalah bahwa itu
ulimit
adalah built-inlaunchctl
shell , adalah program shell-independen.sumber
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:
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:
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
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.
sumber
Berikut ini harus menyelesaikan sebagian besar solusi (dan didaftar sesuai urutan hierarki mereka):
Catatan:
sumber
Pengalaman saya adalah bahwa tugas penghitungan proses tinggi saya hanya berhasil dengan:
Dua yang pertama dapat masuk ke
/etc/sysctl.conf
dan nilai ulimit ke launchd.conf, untuk pengaturan yang andal.Karena tcp / ip adalah bagian dari apa yang saya lakukan, saya juga perlu menambahkan
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:
dan menyaksikan jumlah maksimum proses dalam ps -ef dan berkeliaran di netstat menunggu untuk
TIME_WAIT
kedaluwarsa ... Dengan batas yang ditingkatkan, saya melihat 3500+TIME_WAIT
item 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.
sumber