Czy w OS X 10.7.1 występuje błąd „Zbyt wiele otwartych plików w systemie”?

190

Muszę pozbyć się irytującego limitu „Zbyt wiele otwartych plików w systemie” w systemie OS X 10.7.1. 

Czy istnieje sposób?

John Wilund
źródło
4
Czy chcesz wyjaśnić więcej, kiedy to się stanie? W jakich okolicznościach?
slhck
1
@slhck - Mam ten sam problem. Okoliczności są w zasadzie „przypadkowe”. Jestem programistą, więc dość intensywnie korzystam z komputera Mac: uruchamiam jedną lub więcej baz danych, serwer WWW, narzędzia testujące, jedną lub więcej przeglądarek i odtwarzacz muzyki jednocześnie. Google Chrome wydaje się być programem, w którym otwartych jest wiele plików.
Nathan Long
W rzeczywistości moje „intensywne użytkowanie” nie było problemem; moje ustawienia maksymalnej liczby otwartych plików dla jądra i na proces były znacznie niższe niż domyślne powinny być.
Nathan Long
2
Jeśli przeczytałeś komentarz Nathana i zastanawiałeś się, dlaczego nie podał żadnych szczegółów na temat wartości domyślnych, to dlatego, że przeliterował to wszystko w swojej odpowiedzi poniżej. (Ładna odpowiedź! :)
Olie,
Jestem w takiej samej sytuacji użytkowej jak Nathan Long i stwierdziłem, że ponowne uruchomienie Apache było jedynym krokiem, który „rozwiązał” problem. Zastosowałem wszystkie poniższe podwyższenia limitów, ale nie pomogły natychmiast. Korzystam z wiersza poleceń phpUnit testy> serwer selenium> firefox> apache> php> mysql wszystkie na tym samym Macbooku. Kiedyś działał dobrze, dopóki nie uaktualniłem do indywidualistów. Występuje błąd w testowanej aplikacji internetowej, tzn. W php / apache zabrakło plików, więc prawdopodobnie nie jest kontrolowany przez ustawienie powłoki.
scipilot

Odpowiedzi:

225

Zgodnie z tym pomocnym artykułem (który polecam przeczytać):

Domyślnie maksymalna liczba plików, które Mac OS X może otworzyć, wynosi 12 288, a maksymalna liczba plików, które można otworzyć w danym procesie, wynosi 10 240.

Możesz to sprawdzić za pomocą:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Możesz zwiększyć limity (na własne ryzyko) za pomocą:

  • sysctl -w kern.maxfiles=20480 (lub dowolny inny numer)
  • sysctl -w kern.maxfilesperproc=18000 (lub dowolny inny numer)

Aby zmienić na stałe, użyj, sudoaby wprowadzić ustawienia /etc/sysctl.conf(które być może będziesz musiał utworzyć), w następujący sposób:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Uwaga: W systemie OS X 10.10 lub starszym możesz dodać ustawienie /etc/launchd.confpodobne limit maxfilesi spowoduje to zastąpienie tego, co tu umieścisz.

Ponownie z artykułu:

Gdy to zrobisz, samo jądro będzie miało maksymalną liczbę plików, ale powłoka może nie. A ponieważ większość procesów, które zajmą tak wiele plików, będzie inicjowana przez powłokę, będziesz chciał to zwiększyć.

Polecenie to brzmi:

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

Ta zmiana jest również tymczasowa; trwa tylko dla bieżącej sesji powłoki. Można go dodać do pliku konfiguracyjnego (shell .bashrc, .zshrclub cokolwiek), jeśli chcesz go uruchomić przy każdym otwarciu powłoki.

Nathan Long
źródło
1
jaki limit dotyczy procesów uruchamianych poprzez kliknięcie ikon w obszarze uruchamiania? A jak zmienić ten limit? Kiedy mówisz „shell”, zakładam, że masz na myśli interaktywną powłokę terminala.
Cheeso
@Cheeso - Myślę , że kontroluje to ogólny limit systemu (sysctl) lub limit uruchomienia, w zależności od tego, która wartość jest niższa.
Nathan Long
1
utworzenie pliku /etc/launchd.conf z limitem zawartości maxfiles 1000000 1000000 działało dla mnie świetnie! (OSX 10.8.2 tutaj)
Zugwalt
1
Włożyłem kern.maxfiles=65000 kern.maxfilesperproc=65000w /etc/sysctl.conf i ponownie uruchomiony. kern.maxfiles został zignorowany i pozostał domyślny, ale kern.maxfilesperproc został ustawiony na 65000. Nie mam pliku /etc/launchd.conf, więc o co chodzi?
pferrel
2
Jeśli ktoś ma problemy z nieprzywieraniem plików maksymalnych, to dlatego, że po linii maxfiles znajduje się spacja, należy ją usunąć.
jjathman
62

Wygląda na to, że istnieje zupełnie inna metoda zmiany limitu otwartych plików dla każdej wersji OS X!

W przypadku OS X Sierra (10.12.X) musisz:

1. Utwórz plik pod /Library/LaunchDaemons/limit.maxfiles.plisti wklej następujące elementy (możesz swobodnie zmienić dwie liczby (odpowiednio miękkie i twarde ograniczenia):

<?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. Zmień właściciela nowego pliku:

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

3. Załaduj te nowe ustawienia:

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

4. Na koniec sprawdź, czy limity są prawidłowe:

launchctl limit maxfiles
ninjaPixel
źródło
działało idealnie, dzięki! W moim przypadku błąd pojawił się w procesie Java z komunikatemIO Error: Bad file descriptor (Write failed)
agradl
1
Działa również na El Capitan 10.11.6
Troy Daniels
nadal nie może zmienić ulimit dla powłoki. Maksymalnie pozostaje 1024 cokolwiek robię
DataGreed
W kroku 2 uruchom: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen
32

Konieczne będzie zwiększenie ustawień ulimit - obecnie OS OS jest dość niski - domyślnie 256. Dodaj ulimit -n 4096lub podobny do swojego ~ / .profile lub odpowiednika, a to rozwiąże go w twoim lokalnym środowisku. Uruchom, ulimit -aaby sprawdzić swoje obecne poziomy

Aby zobaczyć ustawienia systemu, uruchom to:

launchctl limit maxfiles

W Lionie (10240) jest on ustawiony na nieco wyższą wartość w przeliczeniu na proces niż kiedyś. Ale jeśli nadal tam trafiasz, możesz ustawić go wyżej, używając tego samego polecenia z pożądanymi poziomami. Aby wprowadzić zmiany na stałe /etc/launchd.conf, musisz dodać odpowiednie linie.

Adam C.
źródło
1
256? To dla mnie 2560 deskryptorów plików i nigdy go nie zmieniłem. Limit wynosi 266 procesów (por ulimit -a.
slhck
2
To samo dla mnie, 256 plików na MacOS X Maverick
Climbatize
4
256 także na OS X Yosemite
Alexander
2
256 również na El Capitan.
TMN
1
256 w Yosemite.
Jaec
31

Inną opcją może być znalezienie winnego:

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

W ostatnim można zobaczyć, które pliki są otwarte:

sudo lsof -n | grep socketfil

I zabij ten proces, jeśli chcesz

kill $pid

Z komentarzy:

Za to, co jest warte, możesz również uzyskać listę identyfikatorów procesów z najczęściej używanymi plikami

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
sanmai
źródło
Pomocny! Ale sortowanie w OS X (10.11) nie zajmuje -h. (Może -g?)
Robert Calhoun
Dla mnie działał dobrze bez -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop
-h
Niech
To jedyna odpowiedź, która pomogła mi
zrootować
1
Służy lsof -n +c 0do zapobiegania obcinaniu nazwy procesu.
vaughan
9

Ludzie, na Mavericks 10.9.4

ulimit -n 2048działa w porządku. Może być konieczne uruchomienie nowej sesji logowania.

Clustermagnet
źródło
2

W najnowszym systemie macOS (w momencie pisania: 10.14.1) możesz użyć sudo launchctl limit maxfiles 64000 524288(domyślnie było to 256), ale działa tylko w bieżącej sesji. Użyj launchctlzadania z @ninjaPixel ( https://superuser.com/a/1171028/760235 ), aby uzyskać trwałe rozwiązanie.

Dzmitry Hubin
źródło
Jak wymyśliłeś numer 524288? Moje poprzednie wartości to 256 i były nieograniczone.
Chip Roberson
1

Możesz biegać

lsof -n

które przetwarzają otwierają zbyt wiele plików.

następnie zabij to.

lub

sysctl -w kern.maxfiles=20480

zmień go na większy.

SaintKnight
źródło
3
Proszę wyjaśnić, w jaki sposób ta odpowiedź różni się od już podanych.
Stephen Rauch
1

Po wszystkich zmianach powyżej moja Java nie utworzyła więcej niż 10000 plików. Rozwiązaniem była flaga jvm -XX: -MaxFDLimit

Uros Velickovic
źródło
0

Spotkałem to podczas robienia chmod -R, więc obejrzałem go, robiąc mniejsze kroki, np

# for each directory
find . -type d -exec chmod 755 {} \;
Michael
źródło
1
Chociaż może to być obejście problemu, wydaje się, że nie odpowiada na pytanie. Być może wyjaśnienie, że nie możesz pozbyć się wiadomości, a następnie zaproponowanie tego jako jednego ze sposobów zmniejszenia problemu, poprawiłoby twoją odpowiedź.
music2myear
0

Podobne do https://superuser.com/a/1171028/367819

Aby sprawdzić aktualne limity w systemie Mac OS X, uruchom:

launchctl limit maxfiles

Dwie ostatnie kolumny to odpowiednio miękkie i twarde limity.

Aby dostosować limity otwartych plików w całym systemie w systemie Mac OS X Yosemite, musisz utworzyć dwa pliki konfiguracyjne. Pierwszy to plik listy właściwości (aka plist) w /Library/LaunchDaemons/limit.maxfiles.plist, który zawiera następującą konfigurację XML:

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

Spowoduje to ustawienie limitu otwartych plików na 200000. Drugi plik konfiguracyjny plist powinien być przechowywany w /Library/LaunchDaemons/limit.maxproc.plist z następującą zawartością:

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

Oba pliki plist muszą być własnością root: wheel i mieć uprawnienia -rw-r - r--. Uprawnienia te powinny być domyślnie na miejscu, ale możesz je zapewnić, uruchamiając sudo chmod 644. Chociaż powyższe kroki spowodują prawidłowe ustawienie ogólnosystemowych limitów otwartych plików po ponownym uruchomieniu, możesz je zastosować ręcznie, uruchamiając limit launchctl.

Oprócz ustawiania tych limitów na poziomie systemu zalecamy również ustawienie na poziomie sesji, dołączając następujące wiersze do pliku bashrc, bashprofile lub analogicznego:

ulimit -n 200000
ulimit -u 2048

Podobnie jak pliki plist, twój bashrc lub podobny plik powinien mieć uprawnienia -rw-r - r--. W tym momencie możesz ponownie uruchomić komputer i wpisać ulimit -n w swoim terminalu. Jeśli twój system jest poprawnie skonfigurowany, powinieneś zobaczyć, że maxfiles został ustawiony na 200000.


Możesz śledzić ten artykuł, aby uzyskać więcej informacji.

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


Pamiętaj, aby ponownie uruchomić komputer Mac, aby wartości były skuteczne.

angelokh
źródło
Albo post powinien zostać oznaczony jako duplikat, jeśli już istnieje odpowiedź, w przeciwnym razie proszę zamieścić odpowiednie informacje z linku, ponieważ link może nie być ważny na zawsze.
zymhan