Important: some of the test results shown here are quite old. All the software benchmarked on them has improved, so you are encouraged to run the tests yourself with current versions of the software. At least until we update them.
System Setup
-
Linux
If you are going to simulate 2.000 concurrent users using the same machine as stress tool and stressed host, you have to setup limit to more than 4.000. For example:
ulimit -n 16000
Or you can edit the limit in /etc/security/limits.conf
Another useful tip in some cases is to force linux to reuse stucked connections:
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
-
Jabber/XMPP Server
-
jabberd 1.4
Increase rate limitations in jabber.xml.
-
jabberd2
Increase max_fds limitation in c2s.xml.
-
ejabberd
Increase the traffic limit speed for normal connections in your ejabberd.cfg:
{shaper, normal, {maxrate, 10000000}}.
In order to register a lot of accounts fast, add this option to your ejabberd.cfg:
{registration_timeout, infinity}.
Increase Erlang ports limit, ETS maximum tables, and maximum processes. This can be configured in ejabberdctl.cfg or providing the arguments when starting erl:
erl ... -env ERL_MAX_PORTS=5000 -env ERL_MAX_ETS_TABLES 20000 +P 250000 -shared
-
-
Create users with Jabber Test Suite
cvs -z3 -d:pserver:anonymous@jabbertest.cvs.sourceforge.net:/cvsroot/jabbertest co testsuite cd testsuite/ cp Makefile.linux Makefile make userreg
And now create 3000 users with username 'test_*' and password 'password' on your server 'localhost':
./userreg -h localhost -u 3000 -n 1
-
Jabsimul
Get Jabsimul from source package (also available a jab_simul Git repository):
wget http://www.ejabberd.im/files/other/jabsimul.tar.gz tar xzf jabsimul.tar.gz cd jabsimul/jab_simul/ cp jab_simul.xml.example jab_simul.xml
Compile it:
./configure make
Configure the tool:
- user_names_generator
- range: range of users that will login/logout
- server: your server name
- connect: how often a login is done
- add_roster: add a contact to the user roster every 'frequency' until 'max_roster_count' is reached
- del_roster: removes a contact from the roster
- send_message: send a message
- range: users that will receive messages
- Xfile: file with the content of the message
- If you use ejabberd 2.1.0 or newer, you must remove 'prepend_with_debug_info' because it makes jab_simul to be non compliant with XMPP: it sends messages with attribute from=bare JID, which is not the real full JID and ejabberd kicks the client session.
- change_status
- logout
- kill_connection: connection is aborted
- send_raw_bytes: sends random bytes (noise)
Now you can execute it:
./jab_simul
- user_names_generator
Profiles
-
Users chatting
- connect frequency: 30000 ms
- add_roster frequency: 600000 ms
- add_roster max_roster_count: 200
- del_roster frequency: 600000 ms
- send_message frequency: 60000 ms
- message content: 'I'm sending you a message now, blablabla, blablabl blablaaa'
- change_status frequency: 60000 ms
- logout frequency: 300000 ms
- kill_connection frequency: 120000 ms
- send_raw_bytes frequency: 300000 ms
Tests
-
Test 1
-
System
- Hardware: Toshiba Satellite A40-241. Mobile Intel Pentium 4 2.80 GHz, 256 MB RAM, 5537.79 Bogomips (cat /proc/cpuinfo).
- Operating System: Debian GNU/Linux sid (with KDE 3.3 running while testing)
- Kernel: Linux 2.6.7-1-686, official package in Debian
- jabberd 1.4.3, official Debian package
- jabberd2 2.0s2 unofficial Debian package, usgin MySQL storage
- ejabberd 0.7.5 compiled from sources
- Erlang R10B-1 compiled from sources
- Jabsimul profile: Users chatting (jabsimul.xml.chat60)
-
Results
Num users 500 1000 1500 2000 2500 Server j1 j2 ej j1 j2 ej j1 j2 ej j1 j2 ej j1 j2 ej Latency (ms) 41 45 16 91 90 40 (1) 40 40 230 CPU (%) 65 6 4 87 15 10 18 20 24 36 Memory RES (MB) 10 36 41 17 93 60 122 70 80 90 Memory VIRT (MB) 66 94 110 120 160 (1) System started to swap to disk and latency was quite irregular, usually several seconds.
-
-
Test 2
-
System
- Hardware: AMD Athlon(tm) XP 1700+, 768 MB RAM, 2908.16 Bogomips (cat /proc/cpuinfo).
- Operating System: Debian GNU/Linux sid (in text mode)
- Kernel: Linux 2.6.7-1-686, official package in Debian
- ejabberd 0.7.5 compiled from sources
- Erlang R9C-2 official Debian package
- Jabsimul profile: Users chatting (jabsimul.xml.chat60)
-
Results
Num users 1000 1500 Server ej ej Latency (ms) 16 18 CPU (%) 17 28 Memory (MB) 62 87
-
-
Test 3
-
System
- Hardware: AMD Athlon(tm) XP 1700+, 768 MB RAM, 2908.16 Bogomips (cat /proc/cpuinfo).
- Operating System: Debian GNU/Linux sid (in text mode)
- Kernel: Linux 2.6.11-1-386, official package in Debian
- ejabberd 0.9.8 compiled from sources
- Erlang R10B-7 compiled from sources + Kernel Poll patch
- Jabsimul profile: Users chatting (jabsimul.xml.chat60)
-
Results
Num users 1500 3000 Kernel Poll no yes no yes Latency (ms) 16 16 28 28 CPU (%) 15 2 30 4 Memory RES (MB) 84 84 150 150 Memory VIRT (MB) 94 94 160 160
-
Related Links
- Performance Tuning
- Kernel Poll on ejabberd
- Solution to 'Socket creation error ! (Too many open files)'
- Jabsimul on WPJabber
- Jabsimul on WPJabber (spanish)
- jab_simul.xml example (spanish)
- Jabberd2 Stress Testing with bmark.pl (August 2004)
- Jabberd 1.4.x Administration Guide: Performance Tuning
- Load generators
- Load generator: jabsimul
- Jabberd Evaluation - screenshots of ejabberd evaluation
- Tigase's recommendations about Linux settings for high load systems
- Tigase's script for Basic system checks