Привет.
Есть ejabberd-2.1.3 из портов на freebsd 8.1pre, amd64, 8G ram, бэкенд - родной erlang mysql driver из ejabberd cvs (mysql-5.1).
проблема в том, что не получается в онлайне более 32768 пользователей, число получено при помощи комадны ejabberctl connected_users_number (после 25k соединения устанавливаются, а потом некоторые рвутся).
CPU и памяти еще много, а куда копать дальше - непонятно. ОС потюнил, как мог.
Цель - получить 50k users online, потом 100k. Буду очень благодарен за любой совет!
Erlang R13B04 (erts-5.7.5) [source] [64-bit] [smp:8:8] [rq:8] [async-threads:0] [hipe] [kernel-poll:true]
Eshell V5.7.5 (abort with ^G)
(ejabberd@localhost)1> os:getenv("ERL_MAX_PORTS").
"500000"
(ejabberd@localhost)2> os:cmd("ulimit -n").
"200000\n"
(ejabberd@localhost)3>
>cat ejabberdctl.cfg | grep -v # | grep -v ^$
POLL=true
SMP=enable
ERL_MAX_PORTS=1000000
ERL_PROCESSES=3500000
ERL_MAX_ETS_TABLES=5000
>cat /boot/loader.conf
net.inet.tcp.syncache.hashsize=1024
net.inet.tcp.syncache.bucketlimit=100
net.inet.tcp.tcbhashsize=4096
kern.ipc.nsfbufs=10240
>cat /etc/sysctl.conf
kern.ipc.nmbclusters=65000
kern.ipc.somaxconn=4096
kern.ipc.maxsockets=204800
kern.maxfiles=204800
kern.maxfilesperproc=200000
net.inet.tcp.recvspace=16384
net.inet.tcp.sendspace=16384
net.inet.tcp.maxtcptw=55000
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535
net.inet.ip.portrange.randomized=0
net.inet.tcp.nolocaltimewait=1
net.inet.tcp.fast_finwait2_recycle=1
я непонимаю ничего в BSD, но
я непонимаю ничего в BSD, но есть мыль что 32768 это половина от 65535 - кратно этому параметру в том что ты привёл только количество портов, попробуй его увеличить и/или найди ещё что-то похожее - в linux нужно увеличивать число открытых файлов на процесс, порты, сокеты. Можно почитать статьюhttp://www.tigase.org/content/linux-settings-high-load-systems про тюнинг высоконагруженного linux сервера для tigase, и провести параллели в BSD+erlang.
Проблема состоит в том, что
Проблема состоит в том, что по ejabberdctl запускется виртуальная машина, которая может обрабатывать 32767 (именно) процессов. Это системное ограничение виртуальной машины Erlang.
Как решить? Разобраться, как ejabberd запускает вирт.машину (в линукс команда erl) и запустить так:
Эта запись запускает вирт.машину, которая сможет обработать 50000 процессов. И не нужно никак тюнить систему. Эрланг и система стоят в разных логических плоскостях.