Dlaczego ustawienia kern.maxfiles w /etc/sysctl.conf się nie trzymają?

4

W Yosemite (10.10.1) występują różne błędy typu „zbyt wiele plików otwieranych w systemie”. Wyszukiwanie wokół sugeruje ustawienie kern.maxfilesi kern.maxfilesperprocessw /etc/sysctl.conf.

Próbowałem tego i kern.maxfilesperprocessnadal się uruchamia po ponownym uruchomieniu, ale kern.maxfilesnie robi tego.

% cat /etc/sysctl.conf 
# NB DO NOT COPY AND PASTE THIS INTO YOUR CONFIG FILE - IT DOESN'T WORK
kern.maxfiles=20480 
kern.maxfilesperproc=18000

(restart)

% sysctl kern.maxfiles
kern.maxfiles: 12288
% sysctl kern.maxfilesperproc   
kern.maxfilesperproc: 18000

Jeśli ustawię go ręcznie w wierszu polecenia, działa, więc nie wydaje mi się, że przekraczam górny limit:

% sudo sysctl -w kern.maxfiles=20480 
kern.maxfiles: 12288 -> 20480
% sysctl kern.maxfiles               
kern.maxfiles: 20480

Widziałem ostrzeżenia o zastąpieniu tych wartości, /etc/launchd.confale nie mam tego pliku:

% cat /etc/launchd.conf
cat: /etc/launchd.conf: No such file or directory

W wyszukiwaniu w centrum uwagi nie ma innych wzmianek kern.maxfiles, więc nie mam pomysłów. Jakieś inne sugestie?

CupawnTae
źródło
@ w00t Cofnąłem edycję, która usunęła końcowe spacje z pliku conf - ponieważ te spacje były w rzeczywistości problemem, myślę, że sensowniej jest pozostawić je w pytaniu.
CupawnTae
sprawiedliwe, zredagowane pytanie zamiast tego wskazać.
w00t
@ w00t twoja ostatnia proponowana edycja została odrzucona przez mod diamentowy (nie przeze mnie) - być może dlatego, że już cofnąłem ostrzeżenie w tekście po cofnięciu edycji. Powinienem był poinformować cię, kiedy to zrobiłem - miałeś rację, więc po cofnięciu i komentowaniu poczułem, że czegoś potrzebuje - mam nadzieję, że moja ostatnia edycja to obejmuje?
CupawnTae

Odpowiedzi:

7

Chociaż nie odpowiadając bezpośrednio na twoje pytanie, znajdziesz u superużytkownika dwa rozwiązania :

  1. 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 pliku „/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>65536</string>
              <string>65536</string>
            </array>
          <key>RunAtLoad</key>
            <true/>
          <key>ServiceIPC</key>
            <false/>
        </dict>
      </plist>

    Spowoduje to ustawienie limitu otwartych plików na 65536. Drugi plik konfiguracyjny plist powinien być przechowywany w /Library/LaunchDaemons/limit.maxproc.plistnastępującej treś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żna je zapewnić, uruchamiając je sudo chmod 644 <filename>. 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 launchctl limit.

    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 pliku analogicznego:

    ulimit -n 65536
    ulimit -u 2048

    Podobnie jak pliki plist, twój bashrc lub podobny plik powinien mieć -rw-r--r--uprawnienia. 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 65536.

    Dostosuj maxfiles i limit maxproc według potrzeb

    Źródło: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/

  2. /etc/launchd.confWydaje mi się, że modyfikowanie liczby zapytań Google i sugestii SO nie działa w Yosemite (10.10). Po wielu kombinacjach zmiany / restartu / testu skończyło się to modyfikowaniem (lub tworzeniem, jeśli nie istnieje) /etc/sysctl.confpliku.

    Właśnie to musiałem wprowadzić, aby działało

    kern.maxfiles=65536
    kern.maxfilesperproc=65536

    Nie jestem pewien, czy „kern.maxfiles” musi tam być, ale kiedy już go tam miałem, nadal miałem ten sam problem, kiedy dodałem „kern.maxfilesperproc” wszystko zaczęło działać.

Jeśli jedno lub oba z tych rozwiązań działają dla Ciebie, przypisz oryginalne plakaty.

klanomath
źródło
Chociaż to nie rozwiązało problemu, zapewnia obejście (pierwszy plik plist). Dziękujemy również za pomoc w znalezieniu właściwej przyczyny. Nagroda przyznana.
CupawnTae
Czy być może wiesz, jak ustawić wyższy limit na „nieograniczony”, tak jak domyślnie OS X? W szczególności chcę dostosować tę odpowiedź, aby podnieść ulimit -n do 1000 i nie zmienić żadnego innego aspektu, aby uruchomić niektóre testy wydajności dla jeden pakiet oprogramowania
bmike
@mike hmm, który wyższy limit? -n = 1000 jako miękki limit i nieograniczony twardy limit. Który system operacyjny? 10.10 lub 10.9 i niższe?
klanomath
Wymyśliłem inny sposób na zrobienie tego, co chciałem, aby uruchomić program i użyć limitów w liście. Zadam nowe pytanie, gdy moje zmiany kodu zostaną przejrzane i scalone w innym miejscu.
bmike
4

Dzięki połączeniu bezpiecznego / pełnego uruchamiania, dziennika konsoli i Google, znalazłem podobny problem, który doprowadził mnie do odkrycia końcowego miejsca w linii maxfiles. Usunięcie tego miejsca rozwiązało problem.

Proszę dokładnie sprawdzić, czy linie w sysctl.conf nie mają spacji końcowych. Wydaje się, że powoduje to problem z Yosemite, podczas gdy działał poprawnie z poprzednimi wersjami.

Poprawione ustawienia (te można bezpiecznie skopiować):

kern.maxfiles=20480
kern.maxfilesperproc=18000
CupawnTae
źródło
1

Usuwanie końcowych białych znaków zajmuje tylko jeden krok:

sed -i '~' -e's/[[:space:]]*$//' /etc/sysctl.conf

Polecenie powyżej zapisuje również kopię zapasową w /etc/sysctl.conf~.

sanmai
źródło