Perintah mana yang mengontrol batas file terbuka?

19

File konfigurasi / perintah mana yang mengontrol batas file terbuka pada OS X? Apakah ada perintah berbeda untuk OS X 10.5 / 10.6 / 10.7? Pilihan saya menjelajahi bawah ulimit, sysctldanlaunchctl

"Terlalu banyak file terbuka" tampaknya merupakan kesalahan umum pada Leopard, mungkin versi OS X lainnya:

Ada banyak (terkait?) Cara untuk melihat batas file terbuka:

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


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

Telah diklaim dalam beberapa posting di atas bahwa ini dapat dimodifikasi dengan perintah berikut:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

Namun, dari perintah di atas, hanya sysctlperintah yang tampaknya memiliki efek (yaitu ulimit -ndan launchctl limittidak menunjukkan perubahan setelah perintah di atas dimasukkan, sementara sysctl -atidak menunjukkan perubahan yang diminta).

Lokasi yang sesuai untuk mengubah parameter ini untuk OS adalah:

/etc/sysctl.conf
/etc/launchd.conf

Saya juga menemukan satu jawaban yang berbunyi yang ulimithanya mengontrol shell saat ini.

Bagaimana saya bisa menyesuaikan ke atas file maksimum / batas file maksimum terbuka di macOS?

keflavich
sumber

Jawaban:

9

Jawaban sederhananya adalah ada beberapa batas dan batas terendah yang Anda capai dalam contoh spesifik akan menghasilkan kesalahan Anda. Sekarang pada 10.12 launchctl limit maxfilesjuga dalam campuran. Untuk detail tentang implementasi, jawaban yang bagus ini mendapatkan karunia dan layak mendapatkan lebih banyak suara daripada yang bisa saya berikan.

utas lain yang relevan adalah:

The ulimittingkat diatur rendah untuk mencegah satu script shell miskin dari banjir kernel dengan file terbuka.

Apakah kern.maxfilesperprocada untuk meninggalkan sedikit ruang dalam jumlah file max sehingga satu proses dapat menggunakan sebagian besar tetapi tidak semua ruang file handler terbuka dari kernel.

Untuk situasi normal, itu kern.maxfilesadalah faktor pembatas akhir.

Di Sierra - batasnya adalah 256 file terbuka dan maks tidak terbatas, jadi saya menemukan bahwa memiliki 3 hingga 4 ribu file yang ditetapkan untuk batas lunak berfungsi untuk hampir semua perangkat keras kami dan tetap membuat sistem responsif ketika proses pelarian membuka terlalu banyak file. Kami ingin menjaga server pengembangan kami pada batas 256 sehingga kami menangkap perangkat lunak yang bocor dan bermasalah dalam pengembangan / pementasan dan pengujian daripada mencari tahu tentang hal itu dalam produksi.

Saya bukan penggemar file 10k - mungkin dengan penyimpanan APFS dan NVMe kita akan melihat hari ketika itu tidak terpikirkan, tetapi cobalah untuk tetap dengan ratusan atau ribuan rendah untuk batas file Anda. Terutama jika mac Anda memiliki batas proses rendah , memiliki begitu banyak file yang dibuka oleh beberapa proses bisa menjadi masalah.

bmike
sumber
9

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
Saya tampaknya mengalami kesulitan mengatur maxfile menjadi tidak terbatas dengan cara ini dengan menetapkan nilai kedua ke 'tidak terbatas'. Adakah pikiran?
user200857
7

Berikut ini harus menyelesaikan masalah yang paling umum (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
0

Dengan kata sederhana:

  • The ulimitperintah memberikan "kontrol atas sumber daya yang tersedia untuk shell dan proses menciptakan" (lihat: help ulimitdan man bash). Sumber daya yang diberikan ke shell dibatasi oleh batas sumber daya sistem.

  • The launchctlkontrol maksimum konsumsi sumber daya sistem dengan proses saat ini (lihat: man setrlimitdan man launchctl). Nilai maksimum dibatasi oleh batas kernel.

  • The sysctlkontrol kernel batas (lihat: man sysctldan Batas Tuning Kernel BSD ).

Untuk menambah batas, Anda dapat menggunakan masing-masing perintah, tergantung masalahnya.

Lihat juga: Apa hubungan antara `launchctl limit` dan` ulimit`?


Untuk masalah dengan terlalu banyak file yang terbuka, ini tergantung pada batas mana yang lunak atau keras telah dicapai (apakah itu skrip shell lokal, skrip global yang dijalankan oleh root, aplikasi, atau semua proses pada saat yang bersamaan). Layak untuk meningkatkan semua batasan (batas shell, launchd dan kernel).

Untuk meningkatkan batas secara terus-menerus, lihat: Bagaimana cara terus-menerus mengontrol konsumsi sumber daya sistem maksimum pada Mac?

kenorb
sumber