Domyślny nofile
limit kont użytkowników OS X wynosi obecnie około 256 deskryptorów plików. Próbuję przetestować oprogramowanie, które wymaga znacznie większej liczby połączeń niż otwarte jednocześnie.
W typowym oknie Debiana z modułem pam limitów edytowałbym, /etc/security/limits.conf
aby ustawić wyższe limity dla użytkownika, który będzie uruchamiał oprogramowanie, ale zastanawiam się, gdzie ustawić te limity w OS X.
Czy jest gdzieś do tego GUI? Czy jest gdzieś plik konfiguracyjny? Jaki jest najbardziej uporządkowany sposób zmiany domyślnych limitów w OS X?
Odpowiedzi:
W Leopardzie początkowy proces to
launchd
. Domyślne limity każdego procesu są dziedziczonelaunchd
. Dla odniesienia domyślnymi (wkompilowanymi) limitami sąAby zmienić którykolwiek z tych limitów, dodaj wiersz (może być konieczne najpierw utworzenie pliku)
/etc/launchd.conf
, argumenty są takie same, jak przekazane dolaunchctl
polecenia. Na przykładJednak
launchd
już uruchomiono powłokę logowania, więc najprostszym sposobem na wprowadzenie tych zmian jest ponowne uruchomienie naszego komputera. (Użyj >>, aby dołączyć do /etc/launchd.conf.)źródło
sysctl.maxfiles
? (powiązane pytanie: apple.stackexchange.com/questions/33715/too-many-open-files )echo
trybie sudo, ale próbujesz dołączyć do pliku nieuprzywilejowaną powłokę, do czego nie ma uprawnień. Spróbujecho "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
zamiast tego.nie działa, ponieważ sudo znajduje się w niewłaściwym miejscu, spróbuj tego:
źródło
Ograniczenia powłoki
Zasoby dostępne dla powłoki i procesów można zmienić za pomocą
ulimit
polecenia, które można dodać do skryptów startowych, takich jak~/.bashrc
lub~/.bash_profile
dla poszczególnych użytkowników lub/etc/bashrc
dla wszystkich użytkowników . Przykładowa linia do dodania:Zobacz:
help ulimit
iman bash
więcej informacji.Limity systemowe
Zasadniczo limity systemowe są kontrolowane przez środowisko Launchd i mogą być zmieniane za pomocą
launchctl
polecenia, npAby zmiany były trwałe, musisz utworzyć plik listy właściwości w określonych folderach zgodnych z Launch, które działają jako agent startowy.
Oto przykładowe polecenie tworzące taki plik startowy:
Plik zostanie załadowany przy uruchomieniu systemu, aby załadować go ręcznie:
Aby sprawdzić aktualne limity, uruchom:
launchctl limit
.Zobacz: Tworzenie demonów i agentów uruchamiania .
Limity jądra
sysctl
polecenie.sysctl -a | grep ^kern.max
.sudo sysctl -w kern.maxfiles=20480
.Związane z:
Przestarzałe metody
We wcześniejszej wersji systemu macOS można było ustawić te limity w całym
/etc/sysctl.conf
systemie, jak zwykle w systemie Unix, jednak wydaje się, że nie jest ono obsługiwane.Używanie
~/.launchd.conf
lub/etc/launchd.conf
wydaje się, że nie jest również obsługiwane w żadnej istniejącej wersji systemu macOS. wikiTo samo dotyczy
/etc/rc.local
pliku startowego, nie jest obsługiwany w systemie macOS.źródło
Teraz muszę się dowiedzieć, dlaczego istnieją 2 sposoby sprawdzania / ustawiania limitów ....
Okej - wydaje się
ulimit
isysctl
daje fałszywie pozytywne wrażenie, że faktycznie coś robią - ale zamiast tego wydają się bezużyteczne . Czy ktoś może to zweryfikować?Okej, zaczynam rozumieć. Począwszy od wersji 10.4, nie ma
init
już żadnego procesu, został on zastąpiony przezlaunchd
, który również działa z PID 1.I oczywiście warto wspomnieć, że
ulimit
jest to wbudowana powłoka,launchctl
to program niezależny od powłoki.źródło
W systemie OS X, jeśli próbujesz zmodyfikować miękkie limity dla demona, procesu lub zadania, właściwym sposobem zmiany tych miękkich limitów nie jest zmiana domyślnej uruchomionej konfiguracji dla wszystkich procesów, ale ustawienie jej dla procesu, w którym jesteś próbuje biec.
Jest to realizowane w uruchomionym pliku .plist dla Twojego procesu.
Jeśli masz uruchomionego demona lub proces, dla którego musisz mieć więcej otwartych plików, utwórz dla niego plik plist i dodaj do niego następujące parametry:
Przykład użycia mongodb. Tworzę plik .plist o nazwie org.mongo.mongodb.plist i zapisuję go w /Library/LaunchDaemons/org.mongo.mongodb.plist. Plik wygląda następująco:
Teraz twój proces ma zasoby, których potrzebuje, bez konieczności marnowania globalnej konfiguracji systemu. Zostanie to automatycznie skonfigurowane przy ponownym uruchomieniu. Lub, jeśli nie chcesz restartować, możesz uruchomić
Jeśli twój proces lub zadanie jest bardziej agentem niż demonem, możesz zamiast tego umieścić .plist w / Library / LaunchAgents. W obu przypadkach obowiązują różne zasady dotyczące tego, jak uruchomienie będzie kontrolować proces. Wydaje się, że LaunchDaemons jest zarezerwowane dla procesów, które uruchomione będą starały się nadążać przez cały czas.
źródło
Następujące powinny rozwiązać większość rozwiązań (i są wymienione w kolejności ich hierarchii):
Uwagi:
źródło
Z mojego doświadczenia wynika, że moje zadanie polegające na dużej liczbie procesów zakończyło się powodzeniem:
Pierwsze dwa mogą wejść do,
/etc/sysctl.conf
a wartość ulimit do launchd.conf, dla niezawodnego ustawienia.Ponieważ tcp / ip było częścią tego, co robiłem, musiałem również zwiększyć wydajność
z domyślnego 128.
Zanim podniosłem limity procesu, dostawałem awarie „rozwidlenia”, za mało zasobów. Zanim zwiększyłem kern.ipc.somaxconn, otrzymywałem błędy „zepsutej rury”.
To było podczas uruchamiania sporej liczby (500-4000) odłączonych procesów na moim potwornym Macu, OS 10.5.7, potem 10.5.8, teraz 10.6.1. Pod Linuksem na komputerze moich szefów po prostu działało.
Myślałem, że liczba procesów będzie bliższa 1000, ale wydaje się, że każdy proces, który rozpocząłem, zawierał własną kopię powłoki oprócz rzeczywistego elementu wykonującego faktyczną pracę. Bardzo uroczyście.
Napisałem zabawkę displayową, która wyglądała mniej więcej tak:
i obserwowałem maksymalną liczbę procesów w ps -ef i krążyłem w sieci, czekając na
TIME_WAIT
wygaśnięcie ... Po podniesieniu limitów widziałem ponad 3500TIME_WAIT
przedmiotów w szczycie.Zanim podniosłem granice, mogłem „podkraść się” do progu awarii, który zaczynał się poniżej 1K, ale wzrósł do wysokiej wartości 1190 .. za każdym razem, gdy popychano go w niepowodzenie, może zająć trochę więcej czasu, prawdopodobnie z powodu czegoś buforowane, które zwiększało się do limitu za każdym razem, gdy zawiodło
Chociaż mój przypadek testowy miał „czekać” jako ostateczne stwierdzenie, wciąż było mnóstwo odłączonych procesów wiszących po jego wyjściu.
Większość informacji, z których korzystałem, otrzymałem z postów w Internecie, ale nie wszystkie były dokładne. Twój przebieg może się różnić.
źródło