OS X 10.7.1'de “Sistemde çok fazla açık dosya” hatası var mı?


191

OS X 10.7.1'deki sinir bozucu "Sistemde çok fazla açık dosya var" sınırından kurtulmam gerekiyor. 

Bir yolu var mı?


4
Bunun ne zaman gerçekleştiği hakkında daha fazla bilgi almak ister misiniz? Hangi durumlarda
slhck

1
@slhck - Aynı sorun bende. Koşullar temel olarak "rastgele" dir. Ben bir geliştiriciyim, bu yüzden Mac'imi oldukça yoğun kullanıyorum: bir veya daha fazla veritabanı, bir web sunucusu, test araçları, bir veya daha fazla tarayıcı ve aynı anda bir müzik çalar çalıştırmak. Google Chrome, pek çok açık dosya içeren bir program gibi görünüyor.
Nathan Long,

Aslında benim "yoğun kullanımım" sorun değildi; çekirdek ve işlem başına maksimum açık dosya sayısı için ayarlarım varsayılanların olması gerektiğinden çok daha düşüktü.
Nathan Long,

2
Nathan'ın yorumunu okuduysanız ve neden varsayılanlar hakkında hiçbir ayrıntı içermediğini merak ettiyseniz, bunun nedeni, cevabını aşağıda yazdı. (Güzel cevap! :)
Olie

Nathan Long ile aynı kullanım koşullarındayım ve Apache'yi yeniden başlatmanın sorunu "çözen" tek adım olduğunu gördüm. Aşağıdaki tüm limit artışlarını uyguladım ancak hemen yardımcı olmadılar. Komut satırı phpUnit testler> selenium server> firefox> apache> php> mysql komutlarını çalıştırıyorum aynı macbook. Ben mavericks'e yükselene kadar iyi çalışırdım. Aldığım hata test edilen web uygulamasında, yani dosyaların tükenmesi durumunda php / apache, bu nedenle muhtemelen kabuk ayarı tarafından kontrol edilmiyor.
scipilot

Yanıtlar:


225

Göre bu yararlı maddeye (ki ben okuma tavsiye):

Varsayılan olarak, Mac OS X'in açabileceği maksimum dosya sayısı 12.288 olarak ayarlanmıştır ve verilen bir işlemin açabileceği maksimum dosya sayısı 10.240'tır.

Bunları kontrol edebilirsiniz:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Sınırları (kendi sorumluluğunuzdadır) ile artırabilirsiniz:

  • sysctl -w kern.maxfiles=20480 (veya seçtiğiniz numara)
  • sysctl -w kern.maxfilesperproc=18000 (veya seçtiğiniz numara)

Değişikliği kalıcı hale getirmek için sudo, ayarlarınızı koymak için kullanın /etc/sysctl.conf(bu, oluşturmanız gerekebilir), şöyle:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Not: OS X 10.10 veya daha düşük sürümlerde, /etc/launchd.confbenzer ayarları ekleyebilirsiniz limit maxfilesve buraya koyduğunuz şeyi geçersiz kılar.

Yine, makaleden:

Bunu yaptıktan sonra, çekirdeğin kendisinde maksimum sayıda dosya olacaktır, ancak kabuk olmayabilir. Ve bu işlemlerin çoğunu alacak olan çoğu işlem, onu artırmak isteyeceğiniz bir kabuk tarafından başlatılacak.

Bunun için komut:

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

Bu değişiklik de geçicidir; yalnızca geçerli kabuk oturumu için sürer. Bir kabuğunu her açtığınızda çalışmasını istiyorsanız .bashrc, kabuk yapılandırma dosyasına ( .zshrcveya her neyse) ekleyebilirsiniz .


1
Başlatma alanındaki simgeleri tıklatarak başlatılan işlemler için hangi sınır uygulanır? Ve bu limiti nasıl değiştirebilirim? "Kabuk" derken, etkileşimli bir terminal kabuğunu kastediyorsunuzdur.
Cheeso

@Cheeso - Ben düşünüyorum genel sistem sınırı (sysctl) ya da Launchd limiti, hangisi daha düşükse, o kontrol eder.
Nathan Long,

1
1000000 1000000 içerik sınırını içeren bir /etc/launchd.conf dosyası oluşturmak benim için harika oldu! (Burada OSX 10.8.2)
Zugwalt

1
kern.maxfiles=65000 kern.maxfilesperproc=65000/Etc/sysctl.conf dosyasını koydum ve yeniden başlattım. kern.maxfiles yoksayıldı ve varsayılan kaldı, ancak kern.maxfilesperproc 65000 olarak ayarlandı. /etc/launchd.conf 'a sahip değilim.
pferrel

2
Herhangi birinin yapışmadığı max dosyaları ile ilgili problem varsa, bunun nedeni, maxfiles satırından sonra silinmesi gereken son bir boşluk olmasıdır.
jjathman

62

OS X'in her sürümü için açık dosya limitini değiştirmek için tamamen farklı bir yöntem var gibi görünüyor!

OS X Sierra (10.12.X) için yapmanız gerekenler:

1. Bir dosya oluşturun /Library/LaunchDaemons/limit.maxfiles.plistve aşağıdakini yapıştırın (iki sayıyı değiştirmekten çekinmeyin (sırasıyla yumuşak ve sert sınırlar):

<?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. Yeni dosyanızın sahibini değiştirin:

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

3. Bu yeni ayarları yükleyin:

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

4. Son olarak, sınırların doğru olduğunu kontrol edin:

launchctl limit maxfiles

mükemmel çalıştı, teşekkürler! Benim durumumda hata mesajı bir java sürecinde tezahür ettiIO Error: Bad file descriptor (Write failed)
agradl

1
Ayrıca El Capitan 10.11.6
Troy Daniels

hala ulimit'i kabuk için değiştiremiyorum. Maksimum ne yaparsam yap
1024'te

Adımında 2 çalıştırmak: Sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist Sudo chown kök /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen

32

Ulimit ayarlarınızı artırmanız gerekecek - bugünlerde OS X'te oldukça düşük - varsayılan olarak 256. ulimit -n 4096~ / .Profile veya eşdeğerinize ekleyin veya buna benzer ve bunu yerel ortamınızda çözecektir. ulimit -aMevcut seviyelerini kontrol etmek için koş

Sistem ayarlarını görmek için şunu çalıştırın:

launchctl limit maxfiles

Lion'da (10240) işlem başına esasında olduğundan biraz daha yüksek bir değere ayarlanmış. Fakat hala orada vuruyorsanız, aynı seviyeyi istediğiniz seviyelerde kullanarak daha yüksek bir değere ayarlayabilirsiniz. Değişiklikleri kalıcı yapmak için /etc/launchd.conf, ilgili satırları eklemeniz gereken yerdir.


1
256? Bu benim için 2560 dosya tanımlayıcısı ve ben hiç değişmedim. Sınır 266 işlemdir (cf ulimit -a).
slhck

2
Benim için aynı, MacOS X Maverick'te 256 dosya
Ağustos'ta

4
OS X Yosemite'de 256
Alexander

2
El Capitan’da da 256.
TMN

1
Yosemite’de 256.
Jaec,

31

Diğer seçenek de suçluyu bulmak olabilir:

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

Sonuncusu için hangi dosyaların açık olduğunu görebilirsiniz:

sudo lsof -n | grep socketfil

Ve eğer istenirse işlemi öldür

kill $pid

Yorumlardan:

Buna değer, aynı zamanda kullanarak en açık dosyaları içeren işlem kimlikleri listesini de alabilirsiniz.

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

Faydalı! Ancak OS X'teki sıralama (10.11) -h almaz. (Belki -g?)
Robert Calhoun

Benim için de sadece -h(OS X 10.12.3) olmadan iyi çalıştı :sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop

Öyleyse o olmadan-h
sanmai 6:17

Bu benim kök
salmam

1
lsof -n +c 0Kesme işleminin adını önlemek için kullanın .
vaughan

9

Millet, Mavericks'te 10.9.4

ulimit -n 2048iyi çalışıyor. Yeni bir oturum açma oturumu başlatmanız gerekebilir.


2

En son macOS için (yazma sırasında: 10.14.1), kullanabilirsiniz sudo launchctl limit maxfiles 64000 524288(varsayılan olarak 256 idi), ancak yalnızca geçerli oturumda çalışır. Kalıcı bir çözüm için launchctl@ ninjaPixel'den ( https://superuser.com/a/1171028/760235 ) gelen işi kullanın .


524288 numarasını nasıl buldunuz? Önceki değerlerim 256 ve sınırsızdı.
Chip Roberson

1

Koşabilirsin

lsof -n

Hangi işlem çok fazla dosya açar.

o zaman öldür.

veya

sysctl -w kern.maxfiles=20480

daha büyüğü ile değiştirin.


3
Lütfen bu cevabın verilen cevaplardan nasıl farklı olduğunu açıklayınız.
Stephen Rauch

1

Yukarıdaki tüm değişikliklerden sonra java 10000 dosyadan daha fazlasını yapmadı. Çözüm bu jvm bayrağıydı -XX: -MaxFDLimit


0

Bir chmod yaparken -R ile karşılaştım, bu yüzden daha küçük adımlar atarak dolaştırdım

# for each directory
find . -type d -exec chmod 755 {} \;

1
Bu bir geçici çözüm olsa da, aslında soruyu yanıtlıyor gibi görünmüyor. Belki de mesajdan kurtulmayacağınızı açıklamak ve daha sonra bunu bir sorunu daha az çözmenin bir yolu olarak önermek cevabınızı iyileştirecektir.
music2myear

0

Https://superuser.com/a/1171028/367819 ile benzer

Mac OS X sisteminizdeki geçerli sınırları kontrol etmek için aşağıdakileri çalıştırın:

launchctl limit maxfiles

Son iki sütun sırasıyla yumuşak ve sert sınırlardır.

Mac OS X Yosemite’te açık dosya limitlerini sistem bazında ayarlamak için iki yapılandırma dosyası oluşturmanız gerekir. Birincisi, aşağıdaki XML yapılandırmasını içeren /Library/LaunchDaemons/limit.maxfiles.plist içindeki bir özellik listesi (aka plist) dosyasıdır:

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

Bu açık dosya limitini 200000 olarak ayarlayacaktır. İkinci plist konfigürasyon dosyası aşağıdaki içeriğe sahip /Library/LaunchDaemons/limit.maxproc.plist dosyasında saklanmalıdır:

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

Her iki plist dosya root tarafından sahiplenilmelidir: wheel ve izinleri -rw-r - r--. Bu izinler varsayılan olarak yerinde olmalıdır, ancak sudo chmod 644 çalıştırarak yerinde olduklarından emin olabilirsiniz. Yukarıda açıklanan adımlar, sistem genelinde açık dosya limitlerinin yeniden başlatmanın ardından doğru şekilde ayarlanmasına neden olsa da, launchctl limitini çalıştırarak bunları manuel olarak uygulayabilirsiniz.

Bu limitleri sistem düzeyinde ayarlamaya ek olarak, bashrc, bashprofile veya analog dosyaya aşağıdaki satırları ekleyerek oturum seviyesini ayarlamanızı öneririz:

ulimit -n 200000
ulimit -u 2048

Plist dosyaları gibi, bashrc veya benzer dosyalarınız da -rw-r - r-- izinlerine sahip olmalıdır. Bu noktada, bilgisayarınızı yeniden başlatabilir ve terminalinize ulimit -n girebilirsiniz. Sisteminiz doğru yapılandırılmışsa, maksimum dosyaların 200000 olarak ayarlandığını görmelisiniz.


Daha fazla ayrıntı için bu makaleyi takip edebilirsiniz.

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


Değerlerin etkili olması için Mac'inizi yeniden başlatmayı unutmayın.


Zaten bir cevap varsa, ya posta bir kopya olarak işaretlenmelidir, aksi takdirde, lütfen bağlantıyı sonsuza dek geçerli olmayabileceğinden, ilgili bilgileri bir bağlantıdan gönderin.
zymhan 1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.