Dlaczego redis zgłasza limit 1024 plików nawet po aktualizacji do limit.conf?

9

Ten błąd pojawia się u góry mojego pliku redis.log:

Bieżące maksymalne otwarte pliki to 1024. Maksymalna liczba klientów została zmniejszona do 4064 w celu zrekompensowania niskiej ulimit.

Mam następnie kroki do listu (i ponownym uruchomieniu):

Co więcej, widzę to po uruchomieniu ulimit:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ulimit -n
65535

Czy ten błąd jest spekulacyjny? Jeśli nie, jakie inne kroki muszę wykonać? Używam Redis 2.8.13 (czubek drzewa) na Ubuntu LTS 14.04.1 (ponownie czubek drzewa).

Oto informacje o użytkowniku:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ps aux | grep redis
root      1027  0.0  0.0  66328  2112 ?        Ss   20:30   0:00 sudo -u ubuntu /usr/local/bin/redis-server /etc/redis/redis.conf
ubuntu    1107 19.2 48.8 7629152 7531552 ?     Sl   20:30   2:21 /usr/local/bin/redis-server *:6379               

Serwer działa zatem jako Ubuntu.

Oto mój plik limit.conf bez komentarzy:

ubuntu@ip-XX-XXX-XXX-XXX:~$ cat /etc/security/limits.conf | sed '/^#/d;/^$/d'
ubuntu soft nofile 65535
ubuntu hard nofile 65535
root soft nofile 65535
root hard nofile 65535

A oto wynik działania sysctl fs.file-max:

ubuntu@ip-XX-XXX-XXX-XXX:~$ sysctl -a| grep fs.file-max
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
fs.file-max = 1528687
sysctl: permission denied on key 'kernel.cad_pid'
sysctl: permission denied on key 'kernel.usermodehelper.bset'
sysctl: permission denied on key 'kernel.usermodehelper.inheritable'
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'

jak sudo

ubuntu@ip-10-102-154-226:~$ sudo sysctl -a| grep fs.file-max
fs.file-max = 1528687

Widzę również ten błąd na górze pliku redis.log, nie jestem pewien, czy jest on powiązany. Ma to sens, że użytkownik ubuntu nie może zmieniać maksymalnej liczby otwartych plików, ale biorąc pod uwagę wysokie limity, które próbowałem ustawić, nie powinien:

[1050] 23 Aug 21:00:43.572 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
[1050] 23 Aug 21:00:43.572 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
esilver
źródło

Odpowiedzi:

4

Powinieneś edytować swoje pliki w /etc/pam.d/katalogu.

W twoim przypadku, gdy uruchomisz sudo -u ubuntu /usr/local/bin/redis-server, powinieneś dodać następujący wiersz do /etc/pam.d/sudolub /etc/pam.d/common-session-noninteractivew przypadku, gdy /etc/pam.d/sudozawiera ten:

session required pam_limits.so

To powinno pomóc w ustawieniu konfiguracji podanej w środku /etc/security/limits.conf.

Navern
źródło
To było to! Dzięki wielkie. Brzmi jak zmiana z Ubuntu 2012.04 LTS na Ubuntu 2014.04 LTS.
esilver
Cieszę się, że ci pomogłem. Rzeczywiście mój xubuntu 14.04 nie ma tej linii w /etc/pam.d/sudo. Nie mogę teraz sprawdzić 12.04.
Navern
Jeśli używasz systemd na Debianie, zobacz serverfault.com/questions/770037
tholu 13.04.16
3

Kolejna sugestia dla użytkowników, którzy znaleźli ten post, którego problem nie jest związany z pam_limits.so. W moim przypadku Redis został uruchomiony za pośrednictwem superwizora. W tym przypadku metoda, za pomocą której nadzorca przełączał konteksty użytkownika, spowodowała uruchomienie nowej sesji z domyślnymi limitami systemowymi, a nie tymi, które skonfigurowałem dla użytkownika.

Rozwiązanie w tym przypadku znaleziono tutaj . Krótko mówiąc, musisz zdefiniować limit za pomocą ulimit -n jako część polecenia startowego w superwizji.

Przykład:

[program:redis-a]
command=bash -c "ulimit -n 32768; exec /usr/local/bin/redis-server /etc/redis/a.conf"
modea
źródło
1

Jak również zwiększenie limitu otwartych plików. Musisz zwiększyć maxclients w swoim redis.conf. Domyślnie jest to tylko 10000.

# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
maxclients 1024000
Kareem
źródło
0

Uwaga dla innych użytkowników Ubuntu z podobnym problemem:

Jeśli uruchamiasz Redis przy rozruchu, np. Przez Upstart, możesz ustawić ten limit za pomocą zwrotki „limit”.

Więc dla nofile:

limit nofile 4096 4096

DarkNeuron
źródło