Meningkatkan jumlah maksimum deskriptor file terbuka di Snow Leopard?

101

Saya mencoba melakukan sesuatu yang membutuhkan banyak deskriptor file

sudo ulimit -n 12288setinggi Snow Leopard ingin pergi; lebih dari ini menghasilkan

/ usr / bin / ulimit: baris 4: ulimit: buka file: tidak dapat mengubah batas: Argumen tidak valid.

Saya ingin meningkatkan jumlahnya jauh lebih tinggi, katakanlah 100000. Apakah mungkin?

Chris Poole
sumber
4
Jawaban pertanyaan ini tidak lagi berfungsi di OSX Mavericks.
Howard
2
Menjalankan echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confdan memulai kembali berfungsi untuk saya di Mavericks.
Lri

Jawaban:

95

Menggunakan ulimitperintah hanya mengubah batas sumber daya untuk shell saat ini dan anak-anaknya dan sudo ulimitmembuat shell root, menyesuaikan batasnya, dan kemudian keluar (dengan demikian, sejauh yang saya bisa lihat, tidak ada efek nyata).
Untuk melebihi 12288, Anda perlu menyesuaikan kernel kern.maxfilesdan kern.maxfilesperprocparameter, dan juga (setidaknya menurut entri blog ini , yang merupakan ringkasan dari diskusi ini ) batas launchd. Anda dapat menggunakannya launchctl limituntuk menyesuaikan semua ini sekaligus:

sudo launchctl limit maxfiles 1000000 1000000

Untuk membuat ini permanen (yaitu tidak diatur ulang saat Anda reboot), buat yang /etc/launchd.confberisi:

limit maxfiles 1000000 1000000

Kemudian Anda dapat menggunakan ulimit(tetapi tanpa sudo) untuk menyesuaikan batas proses Anda.

Jika ini tidak berhasil, Anda mungkin mengalami batasan ukuran pada kernel. Jika model Anda mendukungnya , boot kernel dalam mode 64-bit dapat membantu.

Gordon Davisson
sumber
1
sudo launchctl limit maxfiles 1000000 unlimitedBaik batas keras maupun lunak untuk "maxfiles" tidak terbatas. Silakan gunakan parameter numerik untuk keduanya.
Thomas Hunter
2
Hati-hati saat menambahkan baris itu ke launchd.conf. Saya pikir jika jumlahnya terlalu kecil, itu dapat membuat komputer Anda tidak dapat digunakan. Sebagai contoh, saya menggunakan limit maxfiles 1024 1024dan saya mengalami kesulitan untuk mengubahnya kembali.
Shawn
1
Alas: "File /etc/launchd.conf tidak lagi dikonsultasikan untuk menjalankan sub-perintah pada waktu boot awal; fungsi ini dihapus karena pertimbangan keamanan."
Alice Purcell
Tidak berfungsi, nomor fd saya tidak dapat melebihi 6k bahkan jika saya berhasil mengatur ulimit -Sn 10240.
Jian Weihang
@JianWeihang angka fd adalah per-proses jadi saya menganggap proses lain kebetulan memiliki 4000 file terbuka. Apakah Anda menjalankan Chrome? ;)
Trejkaz
41

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.
errant.info
sumber
3
Alas: "File /etc/launchd.conf tidak lagi dikonsultasikan untuk menjalankan sub-perintah pada waktu boot awal; fungsi ini dihapus karena pertimbangan keamanan."
Alice Purcell
34

Sepertinya ada metode yang sama sekali berbeda untuk mengubah batas file terbuka untuk setiap versi OS X!

Untuk OS X Sierra (10.12.X) Anda perlu:

1. Dalam Library/LaunchDaemonsmembuat file bernama limit.maxfiles.plistdan rekatkan hal berikut di (jangan ragu untuk mengubah dua angka (yang merupakan batas lunak dan keras, masing-masing):

<?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>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2. Ubah pemilik file baru Anda:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. Muat pengaturan baru ini:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. Terakhir, periksa apakah batasannya benar:

launchctl limit maxfiles
ninjaPixel
sumber
2
Jawaban ini luar biasa, dan saya menemukan beberapa latar belakang untuk ditambahkan di sini, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Dean Radcliffe
20

Tampaknya OS X Lion tidak akan mengizinkan nilai "tidak terbatas":

% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.

Memberikan nilai numerik untuk soft dan batas hard melakukan tugas:

% sudo launchctl limit maxfiles 4096 8192
crishoj
sumber
3
Jika salah satu nilai tidak terbatas , gunakan -1sebagai nilai menghasilkan 12288. Dimungkinkan untuk menggunakan nilai numerik yang lebih besar, misalnya sudo launchctl limit maxfiles 15000 150000. Namun, saya tidak yakin pengaturan ini berpengaruh.
Daniel Beck
8

Pada Mavericks itu sederhana. Sebagai pengguna biasa:

ulimit -n 8192

Anda dapat memeriksa pengaturan yang diperbarui melalui

ulimit -a

Di mesin saya:

ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                8192
Clustermagnet
sumber
2
Pertimbangkan merevisi solusi Anda. Anda menetapkan 10imun, kemudian menampilkan deskriptor file keluaran sebagai 8192 (seharusnya 1024). Pendekatan Anda juga bermasalah tanpa sudo, coba ubah beberapa kali untuk diri sendiri.
y3sh
1
sudo tidak boleh digunakan di sini tetapi jawaban ini salah. Pengguna Mavericks harus menggunakan echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confdan kemudian restart mesin mereka
Kyle Chadha
3

Pada OS X 10.13.6 ini berfungsi untuk saya:

$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576
Petr Javorik
sumber
1

Beberapa batas tidak dapat diubah oleh ulimit, karena mereka hanya berlaku untuk shell saat ini, oleh karena itu launchctlperintah harus digunakan untuk mengubah batas secara global, misalnya

sudo launchctl limit maxfiles 100000 unlimited

Harap dicatat bahwa menerapkan batas-batas ini dalam /etc/launchd.conf(seperti yang disarankan dalam jawaban lain) tidak lagi didukung dalam rilis MacOS terbaru. Meskipun masih dapat menggunakan launchd.plist(lihat :) seperti file konfigurasi man launchd.plistper pengguna atau sistem plistseperti yang disarankan di sini , di sana , dan di sana .


Untuk membuat batas ini tetap ada, Anda dapat menggunakan /etc/sysctl.conffile dan menambahkan misalnya:

kern.maxprocperuid=1000
kern.maxproc=2000
kern.maxfilesperproc=20000
kern.maxfiles=50000

Agar perubahan berlaku, ini membutuhkan reboot.

Untuk melihat batas saat ini, jalankan: launchctl limitatau sysctl -a | grep ^kern.max.

Lihat juga: Bagaimana cara mempertahankan pengaturan ulimit di macOS?

kenorb
sumber