xtool/contrib/mORMot/SQLite3/Samples/36 - Simple REST Benchmark
Razor12911 098e8c48de source upload 2022-01-17 22:16:47 +02:00
..
README.md source upload 2022-01-17 22:16:47 +02:00
RESTBenchmark.dpr source upload 2022-01-17 22:16:47 +02:00
RESTBenchmark.lpi source upload 2022-01-17 22:16:47 +02:00
RESTModel.pas source upload 2022-01-17 22:16:47 +02:00
installSystemSocket.sh source upload 2022-01-17 22:16:47 +02:00
mormot-rest-nginx.conf source upload 2022-01-17 22:16:47 +02:00
rest_benchmark.service source upload 2022-01-17 22:16:47 +02:00
rest_benchmark.socket source upload 2022-01-17 22:16:47 +02:00

README.md

Simple mORMot server for REST benchmark

Socket based server

ab -n 10000 -c 1000 http://localhost:8888/root/abc 

Keep alive

By default mROMot HTTP server runs in KeepAlive mode.

To disable KeepAlive run RESTBenchmark with secont parameter false

 ./RESTBenchmark 8888 false

Disabling KeepAlive make sence in case mORMotserver is behind the reverse proxy. In this case reverse proxy cares about KeepAlive connection pool and mormot can operate with fixed thread pool size.

Unix Domain Socket (Linux)

When to use

In case mORMot is behind a local reverse proxy on the environment with a huge number of incoming connection it's make sence to use a UDS to minimize unnecessary TCP handshakes between mORMot and reverse proxy.

To emulate such environment on the syntetic test we can disable keep alive in RESTBEnchmark by passing false to then second parameter

./RESTBenchmark unix false
./RESTBenchmark 8888 false

How to run

  • compile a program and run with unix parameter
./RESTBenchmark unix

Benchmark will listen on Unix Domain Socket /tmp/rest-bench.socket

  • test it with curl
curl --unix-socket /tmp/rest-bench.socket http://localhost/root/abc
  • setup nginx as a reverse proxy
sudo ln -s "$(pwd)/mormot-rest-nginx.conf" /etc/nginx/sites-available
sudo ln -s /etc/nginx/sites-available/mormot-rest-nginx.conf /etc/nginx/sites-enabled
sudo nginx -s reload
  • test it using ab (or better - wrk)
wrk http://localhost:8888/root/abc

systemd integration

  • socket activation
  • journald logging (can be exported for LogView program)
  • auto shutdown on inactivity

With combination of Systemd Template Unit, * A DNS zone and nginx virtual hosts we can build a "cloud solution" using mORMot services with per-customer process level isolation.

Install Unit

Add our service to systemd (should be executed once). This command activate rest_benchmark socket on port 8889

sudo ./installSystemSocket.sh

Socket activation, auto shutdown and logs

Kill possible instances of RESTBenchmark program

killall -TERM RESTBenchmark

Now program is NOT running, lets send an HTTP request to a port configured in rest_benchmark.socket unit (8889)

curl  http://localhost:8889/root/xyz

Magic - we got a response :) This is how systemd socket activation works.

Inside our demo program, in case it executed by systemd it:

  • log all activity into journald (see EchoToConsoleUseJournal)
  • stops after 10 seconds without GET requests (see inactivityWatchdog in RESTBenchmark.dpr)

Open new terminal window and run a command to watch logs from rest_benchmark services

journalctl -u rest_benchmark.service -f

Now wait for 10 second - service should shut down itself.

journald and LogView (Samples/11 - Exception logging)

Logs from journald can be exported to format LogView understand. Example:

journalctl -u rest_benchmark.service --no-hostname -o short-iso-precise --since today | grep "RESTBenchmark\[.*\]:  . " > todaysLog.log

better to grep by program PID "RESTBenchmark\[12345]: . " to include only one start/stop circle (on 2020-06 LogView do not allow to filter on PIDs)