#debian #mqtt #mosquitto #pam #ulimit
#debian #mqtt #mosquitto #пэм #ограничить
Вопрос:
Я устанавливаю mosquitto и изменил множество настроек в
/etc/security/limits.conf
/etc/sysctl.cnof
/etc/pam.d/common-session
/etc/pam.d/common-session-noninteractive
Изменена деталь:
$ sudo vim /etc/sysctl.conf
fs.file-max=2097152
fs.nr_open=2097152
net.core.somaxconn=32768
net.ipv4.tcp_max_syn_backlog=16384
net.core.netdev_max_backlog=16384
net.ipv4.ip_local_port_range='1025 65535'
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.optmem_max=16777216
net.ipv4.tcp_rmem='1024 4096 16777216'
net.ipv4.tcp_wmem='1024 4096 16777216'
net.ipv4.tcp_max_tw_buckets=1048576
net.ipv4.tcp_fin_timeout=15
$ sudo vim /etc/security/limits.conf
* hard nofile 1048576
* soft nofile 1048576
* hard nproc 1048576
* soft nproc 1048676
$ sudo vim /etc/pam.d/common-session
$ sudo vim /etc/pam.d/common-session-noninteractive
session required pam_limits.so
Но после выполнения этого mosquitto все еще может поддерживать 1024 подключения.
Поэтому я использую cat /etc/{pid}/limits
для проверки пределов mosquitto
Затем я обнаружил, что ограничение mosquitto по-прежнему используется по умолчанию
Max processes 7968 7968 processes
Max open files 1024 4096 files
Я выяснил, что mosquitto является пользователем nologin и не может активировать конфигурацию ограничения доступа к PAM. И если я использую prlimit
команду для увеличения мягкого ограничения openfile, mosquitto действительно может увеличить максимальное количество подключений, но ограничено жестким ограничением (4096).
Похоже, debian все еще не может этого сделать (Ссылка), поэтому возможным решением является использование /etc/init/mosquitto.conf
Я изменил /etc/init/mosquitto.conf
, но, похоже, это не работает
$ sudo vim /etc/init/mosquitto.conf
limit nofile 1048576 1048576
limit nproc 1048576 1048576
ulimit -n 1048576 # I do both command, but neither do they works
ulimit -u 1048576
Есть ли у кого-нибудь идея заставить mosquitto поддерживать большое количество подключений?
Спасибо
PS. инструмент тестирования: бенчмарк emqtt
Ответ №1:
После долгих исследований я наконец нашел решение: измените сценарий инициализации mosquitto и измените пользователя mosquitto на root
$ sudo vim /etc/mosquitto/mosquitto.conf
# change user to root
user root
$ sudo vim /etc/init.d/mosquitto
#! /bin/bash
# Change /bin/sh to /bin/bash for fixing "ulimit -u illegal option" error
set_ulimit () {
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 1048576
ulimit -m unlimited
ulimit -u 1048576
}
start)
...
# Update ulimit config in start command
set_ulimit
...
;;
stop)
После изменения конфигурации перезагрузите systemctl config и перезапустите mosquitto
sudo systemctl daemon-reload
sudo service mosquitto stop
sudo service mosquitto start
Тогда ограничения изменены!
Комментарии:
1. Нет причин запускать mosquitto от имени root, и это не рекомендуется.
2. Привет @ralight, спасибо за ваш совет. У вас есть другой способ сделать это?
3. Запуск от имени root не имеет значения для ограничений, они применяются к процессу. Вы можете запустить mosquitto от имени root, но все изменения конфигурации заставляют mosquitto продолжать работать от имени root после его запуска.