Jak zwiększyć limit otwartych plików dla użytkownika innego niż root?

143

Dzieje się tak w Ubuntu Release 12.04 (precyzyjnie) 64-bitowym jądrze Linux 3.2.0-25-virtual

Próbuję zwiększyć liczbę otwartych plików dozwolonych dla użytkownika. Dotyczy to mojej aplikacji Java Eclipse, w której obecny limit 1024 nie jest wystarczający.

Zgodnie z postami, które znalazłem do tej pory, powinienem móc umieszczać wiersze

/etc/security/limits.conf jak to:

soft nofile 4096
hard nofile 4096

aby zwiększyć liczbę otwartych plików dozwoloną dla wszystkich użytkowników.

Ale to nie działa dla mnie i myślę, że problem nie jest związany z tym plikiem.

Dla wszystkich użytkowników domyślny limit wynosi 1024, niezależnie od tego, co znajduje się w /etc/security/limits.conf (zrestartowałem się po zmianie tego pliku)

$ ulimit -n
1024

Teraz, pomimo wpisów w /etc/security/limits.conf, nie mogę tego zwiększyć:

$ ulimit -n 2048

-bash: ulimit: otwarte pliki: nie można zmodyfikować limitu: Operacja niedozwolona Dziwne jest to, że mogę zmienić limit w dół , ale nie mogę go zmienić w górę - nawet w celu powrotu do liczby poniżej pierwotnego limitu:

$ ulimit -n 800
$ ulimit -n
800

$ ulimit -n 900

-bash: ulimit: open files: cannot modify limit: Operation not permitted

Jako root mogę zmienić ten limit na cokolwiek chcę, w górę lub w dół. Wydaje się, że nawet nie obchodzi go rzekomo ogólnosystemowy limit w / proc / sys / fs / file-max

# cat /proc/sys/fs/file-max
188897

# ulimit -n 188898
# ulimit -n 
188898

Ale nawet gdy zaćmienie mam działać jako root, moja aplikacja nadal ulega awarii z powodu wyjątku „Too Many Open File”!

Jak dotąd nie znalazłem sposobu na zwiększenie limitu otwartych plików dla użytkownika innego niż root.

Jak mam to właściwie zrobić? Przejrzałem kilka innych postów, ale bez powodzenia!

iCode
źródło
6
Pamiętaj też, że po dokonaniu edycji /etc/security/limits.confmoże być konieczne wylogowanie, a następnie ponowne zalogowanie się przed użyciem nowego maksymalnego limitu. Zrobiłem to i byłem zaskoczony, ulimit -Hswciąż pokazując 1000, kiedy właśnie podniosłem go do 1000000! Następnie wylogowałem się i wróciłem, a ulimit pokazał nową kwotę.
Cerin,
W sesji GUI może być również ważny (Ubuntu 16+) ten wątek .
Waldemar Wosiński

Odpowiedzi:

142

ulimitPoleceń domyślnie zmienia dysku granice, które można (użytkownik) jest niższy, ale nie może podnieść.

Użyj opcji -S , aby zmienić limit SOFT , który może wynosić od 0- { HARD }.

Właściwie aliasowałem ulimitdo ulimit -S, więc przez cały czas domyślnie są ustawione miękkie granice.

alias ulimit='ulimit -S'

Jeśli chodzi o problem, brakuje Ci kolumny we wpisach w /etc/security/limits.conf.

Powinny być CZTERY kolumny, ale w twoim przykładzie brakuje pierwszej.

* soft nofile 4096
* hard nofile 4096

Pierwsza kolumna opisuje, kogo dotyczy limit. „*” to symbol wieloznaczny, co oznacza wszystkich użytkowników. Aby podnieść limity rootowania , musisz jawnie wpisać „root” zamiast „*”.

Musisz także edytować /etc/pam.d/common-session*i dodać następujący wiersz na końcu:

session required pam_limits.so
lornix
źródło
1
Jak zmienić twardy limit maksymalnej liczby otwartych deskryptorów plików? Mój problem polega na tym, że muszę zezwolić mojej aplikacji Eclipse na posiadanie tylu otwartych plików, ile chce, ale limit 4096 nie jest wystarczający i chcę ustawić go tak wysoko, jak to możliwe, może 500000. Moje ustawienie w limit.conf jest, jak wspomniałeś z gwiazdą, a mimo to Twardy limit się nie zmienia.
iCode
1
Cóż, odkryłeś, że wartość / proc / sys / fs / file-max wynosiła 188 887 ... Więc powiedziałbym, że twój górny limit wynosi od 188,000 (dozwolone) do 500 000 (niedozwolone). Udręcza umysł, że masz coś, co wymaga ponad 65 000 otwartych plików jednocześnie. Łał. Zwykle jest to obsługiwane na dużym żelazie. Byłbym podejrzliwy wobec błędnego przekonania programistycznego. (Z całym szacunkiem, proszę)
lornix,
4
to było to: sesja wymagała pam_limits.so, dzięki!
lethalman
13
Na początku brakowało mi symbolu na końcu /etc/pam.d/common-session*i właśnie go edytowałem common-session, a nawet po ponownym uruchomieniu nie zadziałało. Ale po dodaniu tej samej linii (na pam_limits.so) do common-session-noninteractive, ulimit -nwyświetlany nową wartość po świeżej login (nie wymaga restartu). FWIW Próbowałem zmienić limit rootowania (tylko).
Lambart
1
sprawdź także, czy wartość jest inna, jeśli zalogujesz się jako root. superuser.com/questions/1200539/…
Robbo_UK
20

Jeśli używasz miękkich i twardych limitów dla poszczególnych użytkowników, możesz użyć czegoś takiego:

su USER --shell /bin/bash --command "ulimit -n"

aby sprawdzić, czy ustawienia działają dla tego konkretnego użytkownika, czy nie.

Jeroen Teeuwen
źródło
5

Mam problem z uruchomieniem tego.

Korzystanie z poniższych opcji umożliwia aktualizację bez względu na uprawnienia użytkownika.

sudo sysctl -w fs.inotify.max_user_watches=100000
Layke
źródło
4
Próbowałem tego, ponieważ mam ten sam problem, ale to nie zadziałało$ sudo sysctl -w fs.inotify.max_user_watches=100000 fs.inotify.max_user_watches = 100000 $ ulimit -n 1024
grepmaster