0

I install mosquitto, and have changed a lot of setting in

/etc/security/limits.conf
/etc/sysctl.cnof
/etc/pam.d/common-session
/etc/pam.d/common-session-noninteractive

Detail changed:

$ 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

But after done this, mosquitto can still support 1024 connections.

So I use cat /etc/{pid}/limits to check the mosquitto's limits

Then I found that mosquitto's limit is still the default

Max processes             7968                 7968      processes
Max open files            1024                 4096      files

I figured out the mosquitto is nologin user, and cannot trigger the PAM limit configuration. And if I use prlimit command to increase the soft openfile limit, the mosquitto can indeed increase the max connections, but is limited by hard limit (4096).

Seems the debian still cannot do this (Reference), so a possible solution is to use /etc/init/mosquitto.conf

I do changed the /etc/init/mosquitto.conf but it seems not working

$ 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

Is anyone have any idea to make mosquitto support large amount of connections?

Thanks

PS. test tool: emqtt benchmark

Community
  • 1
  • 1
Asoul
  • 996
  • 1
  • 10
  • 22

1 Answers1

0

After lots of study, I finally got an solution: change the init script of mosquitto, and change mosquitto user to 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)

After changed the config, reload systemctl config and restart mosquitto

sudo systemctl daemon-reload
sudo service mosquitto stop
sudo service mosquitto start

Then the limits is changed!

Asoul
  • 996
  • 1
  • 10
  • 22
  • 1
    There is no reason to run mosquitto as root and it should be discouraged. – ralight Dec 12 '16 at 21:46
  • Hi @ralight, thanks for your advise. Do you have another way to do this? – Asoul Dec 13 '16 at 03:40
  • Running as root makes no difference to limits, they are something applied to the process. You can *start* mosquitto as root, but all the config change does is force mosquitto to remain running as root after it has been started. – ralight Dec 14 '16 at 07:06