Apakah ada perbaikan untuk kesalahan "Terlalu banyak file yang terbuka di sistem" pada OS X 10.7.1?

191

Saya perlu menyingkirkan batasan "Terlalu banyak file terbuka di sistem" pada OS X 10.7.1. 

Apakah ada cara?

John Wilund
sumber
4
Apakah Anda ingin menjelaskan lebih lanjut tentang kapan ini terjadi? Dalam situasi apa?
slhck
1
@ Slhck - Saya memiliki masalah yang sama. Keadaan pada dasarnya "secara acak." Saya seorang pengembang, jadi saya menggunakan Mac saya cukup banyak: menjalankan satu atau lebih database, server web, alat pengujian, satu atau lebih browser, dan pemutar musik sekaligus. Google Chrome tampaknya menjadi salah satu program yang memiliki banyak file terbuka.
Nathan Long
Sebenarnya, "kegunaan saya" bukan masalah; pengaturan saya untuk jumlah maksimum file terbuka untuk kernal dan per-proses jauh lebih rendah dari yang seharusnya.
Nathan Long
2
Jika Anda membaca komentar Nathan dan bertanya-tanya mengapa dia tidak memasukkan perincian tentang defaultnya, itu karena ia menguraikan semuanya dalam jawabannya, di bawah. (Jawaban yang bagus! :)
Olie
Saya berada dalam kondisi penggunaan yang sama dengan Nathan Long, dan menemukan me-restart Apache adalah satu-satunya langkah yang "memecahkan" masalah. Saya menerapkan semua kenaikan batas di bawah ini tetapi mereka tidak segera membantu. Saya menjalankan tes baris perintah phpUnit> server selenium> firefox> apache> php> mysql semua di macbook yang sama. Dulu bekerja dengan baik sampai saya meng-upgrade ke maverick. Kesalahan yang saya dapatkan adalah di webapp yang sedang diuji, yaitu php / apache kehabisan file, jadi mungkin tidak dikendalikan oleh pengaturan shell.
scipilot

Jawaban:

225

Menurut artikel bermanfaat ini (yang saya sarankan baca):

Secara default, jumlah maksimum file yang dapat dibuka oleh Mac OS X diatur ke 12.288 dan jumlah maksimum file yang dapat dibuka oleh proses yang diberikan adalah 10.240.

Anda dapat memeriksanya dengan:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Anda dapat meningkatkan batas (dengan risiko Anda sendiri) dengan:

  • sysctl -w kern.maxfiles=20480 (atau nomor apa pun yang Anda pilih)
  • sysctl -w kern.maxfilesperproc=18000 (atau nomor apa pun yang Anda pilih)

Untuk membuat perubahan permanen, gunakan sudountuk memasukkan pengaturan Anda /etc/sysctl.conf(yang mungkin harus Anda buat), seperti ini:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Catatan: Di OS X 10.10 atau lebih rendah, Anda dapat menambahkan pengaturan /etc/launchd.confseperti limit maxfilesdan itu akan menimpa apa pun yang Anda masukkan di sini.

Sekali lagi, dari artikel:

Setelah Anda selesai melakukannya, kernel itu sendiri akan memiliki jumlah file maksimum tetapi shell mungkin tidak. Dan karena sebagian besar proses yang akan mengambil banyak file ini akan diprakarsai oleh shell Anda akan ingin meningkatkan itu.

Perintah untuk itu adalah:

ulimit -S -n 2048 # or whatever number you choose

Perubahan itu juga bersifat sementara; hanya berlangsung untuk sesi shell saat ini. Anda dapat menambahkannya ke file konfigurasi shell Anda ( .bashrc, .zshrcatau apa pun) jika Anda ingin menjalankannya setiap kali Anda membuka sebuah shell.

Nathan Long
sumber
1
batas apa yang berlaku untuk proses yang diluncurkan dengan mengklik ikon di area peluncuran? Dan bagaimana cara mengubah batas itu? Ketika Anda mengatakan "shell", saya menganggap Anda maksud shell terminal interaktif.
Cheeso
@Cheeso - Saya pikir bahwa batas sistem keseluruhan (sysctl) atau batas launchd, mana yang lebih rendah, mengontrolnya.
Nathan Long
1
membuat /etc/launchd.conf dengan batas isi maxfiles 1000000 1000000 bekerja sangat baik untuk saya! (OSX 10.8.2 di sini)
Zugwalt
1
Saya memasukkan kern.maxfiles=65000 kern.maxfilesperproc=65000/etc/sysctl.conf dan reboot. kern.maxfiles diabaikan dan tetap default tetapi kern.maxfilesperproc diatur ke 65000. Saya tidak punya /etc/launchd.conf jadi ada apa dengan itu?
pferrel
2
Jika ada yang punya masalah dengan file max tidak lengket, itu karena ada spasi tambahan setelah baris maxfiles, yang perlu dihapus.
jjathman
62

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. Buat file di /Library/LaunchDaemons/limit.maxfiles.plistdan tempel yang berikut ini (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
bekerja dengan sempurna, terima kasih! Dalam kasus saya kesalahan terwujud dalam proses java dengan pesanIO Error: Bad file descriptor (Write failed)
agradl
1
Juga bekerja pada El Capitan 10.11.6
Troy Daniels
masih tidak dapat mengubah ulimit untuk shell. Maksimum tetap 1024 apa pun yang saya lakukan
DataGreed
Pada langkah 2 jalankan: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen
33

Anda perlu meningkatkan pengaturan ulimit Anda - ini cukup rendah pada OS X hari ini - 256 secara default. Tambahkan ulimit -n 4096atau mirip dengan profil ~ /. Anda atau yang setara dan itu akan menyelesaikannya di lingkungan lokal Anda. Jalankan ulimit -auntuk memeriksa level Anda saat ini

Untuk melihat pengaturan sistem, jalankan ini:

launchctl limit maxfiles

Ini diatur sedikit lebih tinggi di Lion (10240) pada basis per proses daripada sebelumnya. Tetapi jika Anda masih memukulnya di sana maka Anda dapat mengaturnya lebih tinggi menggunakan perintah yang sama dengan level yang diinginkan. Untuk membuat perubahan permanen /etc/launchd.conf adalah di mana Anda perlu menambahkan baris yang relevan.

Adam C
sumber
1
256? Ini 2560 deskriptor file untuk saya dan saya tidak pernah mengubahnya. Batas tersebut 266 proses (cf ulimit -a).
slhck
2
Sama bagi saya, 256 file di MacOS X Maverick
Climbatize
4
256 pada OS X Yosemite juga
Alexander
2
256 tentang El Capitan juga.
TMN
1
256 di Yosemite.
Jaec
31

Pilihan lain mungkin menemukan pelakunya:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Untuk yang terakhir Anda bisa melihat file apa yang terbuka:

sudo lsof -n | grep socketfil

Dan bunuh prosesnya jika diinginkan

kill $pid

Dari komentar:

Untuk apa nilainya, Anda juga bisa mendapatkan daftar ID proses dengan menggunakan file paling terbuka

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
sanmai
sumber
Bermanfaat! Tetapi mengurutkan pada OS X (10.11) tidak mengambil -h. (Mungkin -g?)
Robert Calhoun
Bagi saya bekerja dengan baik tanpa -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop
Jadilah tanpa-h
sanmai
Ini adalah satu-satunya jawaban yang membantu saya mencari penyebab masalah saya .. terima kasih :)
SgtPooki
1
Gunakan lsof -n +c 0untuk mencegah pemotongan nama proses.
Vaughan
10

Teman-teman, di Mavericks 10.9.4

ulimit -n 2048bekerja dengan baik. Anda mungkin perlu meluncurkan sesi login baru.

Clustermagnet
sumber
3

Untuk macOS terbaru (pada saat penulisan: 10.14.1), Anda dapat menggunakan sudo launchctl limit maxfiles 64000 524288(secara default adalah 256), tetapi hanya berfungsi dalam sesi saat ini. Gunakan launchctlpekerjaan dari @ninjaPixel ( https://superuser.com/a/1171028/760235 ) untuk solusi permanen.

Dzmitry Hubin
sumber
Bagaimana Anda menemukan nomor 524288? Nilai saya sebelumnya 256 dan tidak terbatas.
Chip Roberson
1

Anda bisa lari

lsof -n

proses yang membuka terlalu banyak file.

lalu bunuh itu.

atau

sysctl -w kern.maxfiles=20480

ubah ke yang lebih besar.

SaintKnight
sumber
3
Tolong jelaskan bagaimana jawaban ini berbeda dari yang sudah diberikan.
Stephen Rauch
1

Setelah semua perubahan di atas java saya tidak membuat lebih dari 10.000 file. Solusi adalah flag jvm ini -XX: -MaxFDLimit

Uros Velickovic
sumber
0

Saya menemukannya saat melakukan chmod -R jadi saya mendapatkannya dengan mengambil langkah-langkah yang lebih kecil, misalnya

# for each directory
find . -type d -exec chmod 755 {} \;
Michael
sumber
1
Meskipun ini mungkin merupakan solusi, namun tampaknya tidak benar-benar menjawab pertanyaan. Mungkin menjelaskan bahwa Anda tidak dapat menyingkirkan pesan dan kemudian mengusulkan ini sebagai salah satu cara untuk mengurangi masalah akan meningkatkan jawaban Anda.
music2myear
0

Mirip dengan https://superuser.com/a/1171028/367819

Untuk memeriksa batas saat ini pada sistem Mac OS X Anda, jalankan:

launchctl limit maxfiles

Dua kolom terakhir adalah batas lunak dan keras.

Untuk menyesuaikan batas file terbuka secara sistem di Mac OS X Yosemite, Anda harus membuat dua file konfigurasi. Yang pertama adalah file daftar properti (alias plist) di /Library/LaunchDaemons/limit.maxfiles.plist yang berisi konfigurasi XML berikut:

<?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>200000</string>
          <string>200000</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

Ini akan menetapkan batas file terbuka menjadi 200000. File konfigurasi plist kedua harus disimpan di /Library/LaunchDaemons/limit.maxproc.plist dengan konten berikut:

<?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.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Kedua file plist harus dimiliki oleh root: wheel dan memiliki izin -rw-r - r--. Izin ini harus ada di tempat secara default, tetapi Anda dapat memastikan bahwa mereka ada dengan menjalankan sudo chmod 644. Meskipun langkah-langkah yang dijelaskan di atas akan menyebabkan batas file terbuka di seluruh sistem ditetapkan dengan benar saat dimulai ulang, Anda dapat menerapkannya secara manual dengan menjalankan batas launchctl.

Selain mengatur batas-batas ini di tingkat sistem, kami menyarankan pengaturan di tingkat sesi juga dengan menambahkan baris berikut ke file bashrc, bashprofile, atau analog Anda:

ulimit -n 200000
ulimit -u 2048

Seperti file plist, bashrc Anda atau file serupa harus memiliki izin -rw-r-r--. Pada titik ini, Anda dapat me-restart komputer Anda dan memasukkan ulimit -n ke terminal Anda. Jika sistem Anda dikonfigurasikan dengan benar, Anda akan melihat bahwa maxfiles telah diatur ke 200000.


Anda dapat mengikuti artikel ini untuk lebih jelasnya.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


Ingatlah untuk me-restart Mac Anda agar nilainya efektif.

angelokh
sumber
Entah pos tersebut harus ditandai sebagai duplikat jika sudah ada jawaban, jika tidak, silakan posting informasi yang relevan dari tautan, karena tautan tersebut mungkin tidak berlaku selamanya.
zymhan