Zwiększyć maksymalną liczbę otwartych deskryptorów plików w systemie Snow Leopard?

101

Próbuję zrobić coś, co wymaga dużej liczby deskryptorów plików

sudo ulimit -n 12288jest tak wysoki, jak chce Snow Leopard; poza tym skutkuje

/ usr / bin / ulimit: wiersz 4: ulimit: otwórz pliki: nie można zmodyfikować limitu: niepoprawny argument.

Chcę zwiększyć liczbę znacznie wyżej, powiedzmy 100000. Czy to możliwe?

Chris Poole
źródło
4
Odpowiedzi na to pytanie nie działają już w OSX Mavericks.
Howard
2
Uruchamianie echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confi restartowanie działa dla mnie w Mavericks.
Lri

Odpowiedzi:

95

Użycie ulimitpolecenia zmienia tylko limity zasobów dla bieżącej powłoki i jej elementów podrzędnych i sudo ulimittworzy powłokę główną, dostosowuje jej limity, a następnie kończy działanie (tym samym, o ile widzę, nie ma rzeczywistego efektu).
Aby przekroczyć 12288, musisz dostosować jądro kern.maxfilesi kern.maxfilesperprocparametry, a także (przynajmniej zgodnie z tym wpisem na blogu , który jest podsumowaniem tej dyskusji ) limit uruchomienia. Możesz użyć, launchctl limitaby dostosować je wszystkie naraz:

sudo launchctl limit maxfiles 1000000 1000000

Aby ustawić to na stałe (tzn. Nie resetować po ponownym uruchomieniu), utwórz /etc/launchd.confzawierające:

limit maxfiles 1000000 1000000

Następnie możesz użyć ulimit(ale bez sudo), aby dostosować limit procesu.

Jeśli tak się nie stanie, być może w twoim jądrze występują ograniczenia wielkości. Jeśli Twój model to obsługuje , pomocne może być uruchomienie jądra w trybie 64-bitowym .

Gordon Davisson
źródło
1
sudo launchctl limit maxfiles 1000000 unlimitedAni twardy, ani miękki limit dla „maxfiles” nie może być nieograniczony. Użyj obu parametrów numerycznych.
Thomas Hunter
2
Zachowaj ostrożność, dodając tę ​​linię do launchd.conf. Myślę, że jeśli liczba jest zbyt mała, może to uniemożliwić korzystanie z komputera. Na przykład użyłem limit maxfiles 1024 1024i bardzo ciężko mi było to zmienić.
Shawn
1
Niestety: „Plik /etc/launchd.conf nie jest już sprawdzany, czy komendy mają być uruchamiane podczas wczesnego rozruchu; ta funkcja została usunięta ze względów bezpieczeństwa.”
Alice Purcell,
To nie działa, mój numer fd nie może przekroczyć 6k, nawet jeśli pomyślnie ustawię ulimit -Sn 10240.
Jian Weihang
@JianWeihang liczby fd są na proces, więc zakładam, że w innych procesach otwartych jest 4000 plików. Czy zdarza ci się uruchamiać Chrome? ;)
Trejkaz
41

Następujące powinny rozwiązać większość rozwiązań (i są wymienione w kolejności ich hierarchii):

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

Uwagi:

  1. Konieczne będzie ponowne uruchomienie, aby zmiany zostały wprowadzone.
  2. AFAIK, nie można już ustawiać limitów na „nieograniczony” w OS X
  3. launchctl maxfiles są ograniczone przez maxfiles sysctl i dlatego nie mogą ich przekraczać
  4. Wygląda na to, że sysctl dziedziczy kern.maxfilesperproc z maxctiles launchctl
  5. ulimit domyślnie dziedziczy wartość „otwartych plików” z launchctl
  6. możesz ustawić niestandardową ulimit w / etc / profile lub ~ / .profile; chociaż nie jest to wymagane, podałem przykład
  7. Zachowaj ostrożność przy ustawianiu którejkolwiek z tych wartości na bardzo dużą liczbę w porównaniu z ich wartością domyślną - istnieją funkcje stabilności / bezpieczeństwa. Wziąłem te przykładowe liczby, które moim zdaniem są rozsądne, zapisane na innych stronach internetowych.
errant.info
źródło
3
Niestety: „Plik /etc/launchd.conf nie jest już sprawdzany, czy komendy mają być uruchamiane podczas wczesnego rozruchu; ta funkcja została usunięta ze względów bezpieczeństwa.”
Alice Purcell,
34

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. W Library/LaunchDaemonspliku o nazwie 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
2
Ta odpowiedź jest świetna i znalazłem tu trochę tła do dodania tutaj, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Dean Radcliffe
20

Wygląda na to, że OS X Lion nie zezwoli na „nieograniczoną” wartość:

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

Podanie wartości liczbowych dla miękkiego i twardego limitu wykonuje zadanie:

% sudo launchctl limit maxfiles 4096 8192
crishoj
źródło
3
Jeśli jedna z wartości była nieograniczona , użycie -1jako wartości powoduje 12288. Możliwe jest użycie większych wartości liczbowych, np sudo launchctl limit maxfiles 15000 150000. Nie jestem jednak pewien, czy te ustawienia mają wpływ.
Daniel Beck
8

Na Mavericks jest to proste. Jako zwykły użytkownik:

ulimit -n 8192

Możesz sprawdzić zaktualizowane ustawienia za pomocą

ulimit -a

Na mojej maszynie:

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
źródło
2
Rozważ zmianę swojego rozwiązania. Ustawiasz ulimit na 1024, a następnie pokazujesz deskryptory plików wyjściowych jako 8192 (powinno być 1024). Twoje podejście jest również probelmatyczne bez sudo, spróbuj zmienić to kilka razy dla siebie.
y3sh
1
sudo nie powinno być tutaj użyte, ale ta odpowiedź jest niepoprawna. Użytkownicy Mavericks powinni użyć, echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confa następnie ponownie uruchomić komputer
Kyle Chadha
3

W OS X 10.13.6 to działa dla mnie:

$ 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
źródło
1

Niektórych limitów nie można zmienić ulimit, ponieważ dotyczą one tylko bieżącej powłoki, dlatego launchctlnależy użyć polecenia do globalnej zmiany limitów, np.

sudo launchctl limit maxfiles 100000 unlimited

Należy pamiętać, że stosowanie tych limitów w /etc/launchd.conf(jak sugerowano w innych odpowiedziach) nie jest już obsługiwane w najnowszych wydaniach macOS. Chociaż nadal można używać launchd.plist(patrz man launchd.plist:), takich jak plistpliki konfiguracyjne dla poszczególnych użytkowników lub całego systemu, jak sugerowano tutaj , tam i tam .


Aby te limity były trwałe, możesz użyć /etc/sysctl.confpliku i dodać na przykład:

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

Aby zmiany odniosły skutek, wymaga ponownego uruchomienia.

Aby zobaczyć aktualne limity, uruchom: launchctl limitlub sysctl -a | grep ^kern.max.

Zobacz także: Jak zachować ustawienia ulimit w systemie macOS?

kenorb
źródło