Почему redis не может установить максимальный открытый файл

1167:M 26 Apr 13:00:34.666 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
1167:M 26 Apr 13:00:34.667 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
1167:M 26 Apr 13:00:34.667 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
1167:M 26 Apr 13:00:34.685 # Creating Server TCP listening socket 192.34.62.56​​:6379: Name or service not known
1135:M 26 Apr 20:34:24.308 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
1135:M 26 Apr 20:34:24.309 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
1135:M 26 Apr 20:34:24.309 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
1135:M 26 Apr 20:34:24.330 # Creating Server TCP listening socket 192.34.62.56​​:6379: Name or service not known

3 ответов


Redis никогда не изменит максимальное количество открытых файлов.

это конфигурация ОС, и ее также можно настроить для каждого пользователя. Ошибка описательна и говорит вам: "увеличить' ulimit-n'"

вы можете обратиться к этому сообщению в блоге о том, как увеличить максимальное количество дескрипторов открытых файлов: http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/


Ну, это немного поздно для этого поста, но так как я просто потратил много времени(всю ночь), чтобы настроить новый сервер Redis 3.0.6 на Ubuntu 16.04. Я думаю, я должен просто записать, как я это делаю, чтобы другим не пришлось тратить свое время...

для недавно установленного сервера redis вы, вероятно, увидите следующие проблемы в файле журнала redis, который /var/log/redis / redis-сервер.log

Максимально Открытой Файлы

3917:M 16 Sep 21:59:47.834 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
3917:M 16 Sep 21:59:47.834 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
3917:M 16 Sep 21:59:47.834 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.

я видел много сообщений, говорящих вам изменить

/etc/security/limits.conf
redis soft nofile 10000
redis hard nofile 10000

или

/etc/sysctl.conf
fs.file-max = 100000

это может работать в ubuntu 14.04, но это, конечно, не работает в ubuntu 16.04. я думаю, что это имеет какое-то отношение к изменению от выскочки к systemd, но я не эксперт ядра linux!

чтобы исправить это, вы должны сделать это systemd в путь

/etc/systemd/system/redis.service
[Service]
...
User=redis
Group=redis
# should be fine as long as you add it under [Service] block
LimitNOFILE=65536
...

тогда вы должны демон перезагрузите и перезапустите службу

sudo systemctl daemon-reload
sudo systemctl restart redis.service

чтобы проверить, работает ли он, попробуйте cat proc limits

cat /run/redis/redis-server.pid
cat /proc/PID/limits

и вы увидите

Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes   

на этом этапе решается максимальный открытый файл.

Максимальное Подключение Сокета

2222:M 16 Sep 20:38:44.637 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

Память Overcommit

2222:M 16 Sep 20:38:44.637 # Server started, Redis version 3.0.6
2222:M 16 Sep 20:38:44.637 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

поскольку эти два связаны, мы решим его сразу.

sudo vi /etc/sysctl.conf

# Add at the bottom of file
vm.overcommit_memory = 1
net.core.somaxconn=1024

теперь для этих configs для работы, вам нужно перезагрузить config

sudo sysctl -p

Прозрачные Огромные Страницы

1565:M 16 Sep 22:48:00.993 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

чтобы окончательно решить эту проблему, следуйте предложению журнала и измените rc.местные

sudo vi /etc/rc.local

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

это требует от вас перезагрузка, резервное копирование данных или сделать все, что вам нужно, прежде чем вы на самом деле сделать это!!

sudo reboot

теперь проверьте журнал redis снова, у вас должен быть сервер redis без каких-либо ошибок или предупреждение.


вам просто нужна эта команда в консоли:

sudo ulimit -n 65535