Mosquitto увеличить максимальное количество подключений

#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 после его запуска.