loadtest/README.md
Content of this directory is for running rudimentary load tests of Tinode server. You need this only if you want to run your own load tests.
The tsung.xml is a configuration for Tsung. The tinode.beam is an erlang binary required by the test to generate base64-encoded user-password pairs. The tinode.erl is the source for tinode.beam (erlc tinode.erl -> tinode.beam).
Install Tsung, then run the test
tsung -f ./tsung.xml start
A similar loadtest scenario is also available in Gatling. The configuration file is loadtest.scala.
Run it with (after installing Gatling):
gatling.sh -sf . -rsf . -rd "na" -s tinode.Loadtest
Currently, three tests are available:
tinode.Loadtest: after connecting to server, retrieves user's subscriptions, and publishes a few messages to them one by one.tinode.MeLoadtest: attempts to max out me topic connections.tinode.SingleTopicLoadtest: connects to and publishes messages to the specified topic (typically, a group topic).The script supports passing params via the JAVA_OPTS envvar.
| Parameter name | Default value | Description |
|---|---|---|
num_sessions | 10000 | Total number of sessions to connect to the server |
ramp | 300 | Time period in seconds over which to ramp up the load (0 to num_sessions). |
publish_count | 10 | Number of messages that a user will publish to a topic it subscribes to. |
publish_interval | 100 | Maximum period of time a user will wait between publishing subsequent messages to a topic. |
accounts | users.csv | tinode.Loadtest and tinode.SingleTopicLoadtest only: Path to CSV file containing user accounts to use in loadtest (in format username,password[,token] (token field is optional). |
topic | tinode.SingleTopicLoadtest only: topic name to send load to. | |
username | tinode.MeLoadtest only: user to subscribe to me topic. | |
password | tinode.MeLoadtest only: user password. |
Examples:
JAVA_OPTS="-Daccounts=users.csv -Dnum_sessions=100 -Dramp=10" gatling.sh -sf . -rsf . -rd "na" -s tinode.Loadtest
Ramps up load to 100 sessions listed in users.csv file over 10 seconds.
JAVA_OPTS="-Dusername=user1 -Dpassword=user1123 -Dnum_sessions=10000 -Dramp=600" gatling.sh -sf . -rsf . -rd "na" -s tinode.MeLoadtest
Connects 10000 sessions to me topic for user1 with password user1123 over 600 seconds.
JAVA_OPTS="-Dtopic=grpYOrcDwORhPg -Daccounts=users.csv -Dnum_sessions=10000 -Dramp=1000 -Dpublish_count=2 -Dpublish_interval=300" gatling.sh -sf . -rsf . -rd "na" -s tinode.SingleTopicLoadtest
Connects 10000 users (specified in users.csv file) to grpYOrcDwORhPg topic over 1000 seconds. Each user will publish 2 messages with interval up to 300 seconds.
This will be eventually packaged into a docker container.
We have tested our single-server Tinode synthetic setup with 50000 accounts on a standard t3.xlarge AWS box (4 vCPUs, 16GiB, 5Gbps network) with the mysql backend.
As the load increases, before starting to drop: