Które polecenie kontroluje limity otwartych plików?

19

Który plik polecenia / konfiguracji kontroluje limity otwartych plików w systemie OS X? Czy istnieje inne polecenie dla OS X 10.5 / 10.6 / 10.7? Opcje badam poniżej ulimit, sysctlorazlaunchctl

„Zbyt wiele otwartych plików” jest najwyraźniej częstym błędem w systemie Leopard, być może w innych wersjach systemu OS X:

Istnieje wiele (powiązanych?) Sposobów wyświetlania limitów otwartych plików:

$ 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

W niektórych powyższych postach stwierdzono, że można je modyfikować za pomocą następujących poleceń:

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

Jednak spośród powyższych poleceń tylko sysctlpolecenia mają najwyraźniej jakikolwiek efekt (tj. ulimit -nI launchctl limitnie pokazują żadnych zmian po wprowadzeniu powyższych poleceń, podczas gdy sysctl -apokazuje żądane zmiany).

Odpowiednie lokalizacje do zmiany tych parametrów dla systemu operacyjnego to:

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

Odkryłem również jedną odpowiedź, która czyta ulimittylko kontrolę bieżącej powłoki.

Jak mogę podwyższyć maksymalne limity plików / maksymalne limity otwartych plików w systemie MacOS?

Keflavich
źródło

Odpowiedzi:

9

Prosta odpowiedź brzmiała, że ​​istnieje wiele limitów, a najniższy limit osiągany w konkretnej instancji spowoduje wygenerowanie błędu. Teraz 10.12 launchctl limit maxfilesjest również w miksie. Aby uzyskać szczegółowe informacje na temat wdrożenia, ta świetna odpowiedź jest nagradzana i zasługuje na więcej głosów niż ten, który mogę jej dać.

inne istotne wątki to:

ulimitPoziom ustawiony jest niska, aby zapobiec jednemu słabe skrypt przed zalaniem jądro z otwartych plików.

kern.maxfilesperprocJest tam zostawić trochę miejsca na Maxa plików liczyć tak, że jeden proces może korzystać z większości, ale nie wszystkich otwartej przestrzeni obsługi plików z jądra.

W normalnych sytuacjach kern.maxfilesostateczny czynnik ograniczający.

W Sierra - limity to 256 otwartych plików i nielimitowane maksimum, więc stwierdzam, że ustawienie 3 do 4 tysięcy plików dla miękkiego limitu działa na prawie cały nasz sprzęt i nadal utrzymuje system w stanie reakcji, gdy niekontrolowany proces otwiera zbyt wiele pliki. Lubimy utrzymywać nasze serwery programistyczne na limicie 256, aby złapać nieszczelne i problematyczne oprogramowanie w fazie programowania / testowania, a nie testować w produkcji.

Nie jestem fanem plików 10k - być może dzięki APFS i pamięci NVMe zobaczymy dzień, kiedy nie będzie to nie do pomyślenia, ale postaraj się trzymać setek lub niskich tysięcy limitów plików. Zwłaszcza jeśli twój komputer Mac ma niski limit procesów , posiadanie tak wielu plików otwartych przez tak mało procesów może być problematyczne.

bmike
źródło
9

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
Wydaje mi się, że mam problem z ustawieniem maksymalnych plików na nieograniczony w ten sposób, ustawiając drugą wartość na „nieograniczony”. jakieś pomysły?
user200857
7

Poniższe powinny rozwiązać najczęstsze problemy (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ą - funkcje zapewniają stabilność / bezpieczeństwo. Wziąłem te przykładowe liczby, które moim zdaniem są rozsądne, zapisane na innych stronach internetowych.
errant.info
źródło
0

W prostych słowach:

  • ulimitKomenda zapewnia „kontrola nad zasobami dostępnymi do powłoki i procesów to tworzy” (patrz: help ulimita man bash). Zasoby podane powłoce są ograniczone limitami zasobów systemowych.

  • launchctlMaksymalny kontroluje zużycie zasobów systemu przez obecnego procesu (patrz: man setrlimita man launchctl). Maksymalne wartości są ograniczone limitami jądra.

  • Te sysctlkontrole granic jądra (patrz: man sysctla Granice BSD Tuning jądra ).

Aby zwiększyć limity, możesz użyć każdego z poleceń, w zależności od problemu.

Zobacz także: Jaki jest związek między „limitem uruchomienia” i „ulimitem”?


W przypadku problemu ze zbyt dużą liczbą otwartych plików zależy to od tego, który dokładnie limit miękki lub twardy został osiągnięty (czy to lokalny skrypt powłoki, globalny skrypt uruchamiany przez rootaplikację lub wszystkie procesy w tym samym czasie). Warto zwiększyć wszystkie limity (limity powłoki, uruchomienia i jądra).

Aby stale zwiększać limity, zobacz: Jak trwale kontrolować maksymalne zużycie zasobów systemowych na komputerze Mac?

kenorb
źródło