To contact me, bother me on IRC in various places.
The code used to generate the bursts has been committed to Atheme and will be included in Atheme 6.0.0-alpha7 and later.
I created several burst files, a set of 10000, 100000 and 1000000 user bursts in both the legacy TS5 and basic TS6 protocols, then I used netcat to set up a listener that fed the burst into to services instance when it connected.
Follows is the data for both RSS (memory) and burst processing time. The burst processing time can be used to extrapolate the number of transactions that can be processed per second by using the formula where N is the number of users and BT is burst time:
rate(Txn) = (N + 4) / BT
A higher transaction processing rate indicates higher efficiency. There is an overhead of 4 messages in the burst for the server handshake.
Unfortunately, I was unable to test Anope 1.9.2 on TS5 because it kept crashing after 10000 users.
| Platform | 10000 users | 100000 users |
|---|---|---|
| Atheme-6 197436cb02e3 smallnet TS6 | 0.136 | 1.000 |
| Atheme-6 197436cb02e3 largenet TS6 | 0.123 | 1.000 |
| Atheme-6 197436cb02e3 smallnet TS5 | 0.127 | 1.000 |
| Atheme-6 197436cb02e3 largenet TS5 | 0.154 | 1.000 |
| Atheme-6 197436cb02e3 noballoc TS6 | 0.130 | 1.000 |
| Atheme-6 197436cb02e3 noballoc TS5 | 0.151 | 1.000 |
| Anope 1.9.2p2 release TS6 | 0.406 | 4.118 |
| Anope 1.9.2p2 release TS5 | 0.123 | — |
| Anope 1.8.5 TS6 | 1.373 | 14.095 |
| Anope 1.8.5 TS5 | 1.311 | 13.619 |
| Shrike 1.6 TS5 | 0.034 | 1.000 |
| Platform | 10000 users | 100000 users |
|---|---|---|
| Atheme-6 197436cb02e3 smallnet TS6 | 11604 | 71052 |
| Atheme-6 197436cb02e3 largenet TS6 | 13080 | 71160 |
| Atheme-6 197436cb02e3 smallnet TS5 | 10644 | 61448 |
| Atheme-6 197436cb02e3 largenet TS5 | 12136 | 61556 |
| Atheme-6 197436cb02e3 noballoc TS6 | 10688 | 68744 |
| Atheme-6 197436cb02e3 noballoc TS5 | 9732 | 59100 |
| Anope 1.9.2p2 release TS6 | 17348 | 72864 |
| Anope 1.9.2p2 release TS5 | 11036 | — |
| Anope 1.8.5 TS6 | 10408 | 48736 |
| Anope 1.8.5 TS5 | 10404 | 48372 |
| Shrike 1.6 TS5 | 3752 | 29172 |
| Platform | 10000 users | 100000 users | 1000000 users |
|---|---|---|---|
| Atheme-6 197436cb02e3 smallnet TS6 | 0.136 | 1.000 | 12.000 |
| Atheme-6 197436cb02e3 largenet TS6 | 0.123 | 1.000 | 12.000 |
| Atheme-6 197436cb02e3 smallnet TS5 | 0.127 | 1.000 | 12.000 |
| Atheme-6 197436cb02e3 largenet TS5 | 0.154 | 1.000 | 12.000 |
| Atheme-6 197436cb02e3 noballoc TS6 | 0.130 | 1.000 | 12.000 |
| Atheme-6 197436cb02e3 noballoc TS5 | 0.151 | 1.000 | 12.000 |
| Anope 1.9.2p2 release TS6 | 0.406 | 4.118 | 40.338 |
| Anope 1.9.2p2 release TS5 | 0.123 | — | — |
| Anope 1.8.5 TS6 | 1.373 | 14.095 | 138.652 |
| Anope 1.8.5 TS5 | 1.311 | 13.619 | 139.119 |
| Shrike 1.6 TS5 | 0.034 | 1.000 | 128.000 |
| Platform | 10000 users | 100000 users | 1000000 users |
|---|---|---|---|
| Atheme-6 197436cb02e3 smallnet TS6 | 11604 | 71052 | 665848 |
| Atheme-6 197436cb02e3 largenet TS6 | 13080 | 71160 | 651636 |
| Atheme-6 197436cb02e3 smallnet TS5 | 10644 | 61448 | 569788 |
| Atheme-6 197436cb02e3 largenet TS5 | 12136 | 61556 | 555512 |
| Atheme-6 197436cb02e3 noballoc TS6 | 10688 | 68744 | 649444 |
| Atheme-6 197436cb02e3 noballoc TS5 | 9732 | 59100 | 552960 |
| Anope 1.9.2p2 release TS6 | 17348 | 72864 | 627744 |
| Anope 1.9.2p2 release TS5 | 11036 | — | — |
| Anope 1.8.5 TS6 | 10408 | 48736 | 428064 |
| Anope 1.8.5 TS5 | 10404 | 48372 | 428060 |
| Shrike 1.6 TS5 | 3752 | 29172 | 283140 |
Shrike provides comparable performance to Atheme, but uses less memory. This is probably due to it's monolithic design and simplicity. However, due to Shrike's simplicity, it fails to scale effectively up to 1 million users. This is probably due to the use of hash tables instead of trees, which provide consistent scalability but are slower for small workloads than hash tables. Shrike 1.6 changed the hash function used and created larger hashtables which have a higher memory usage penalty due to the way that the hash tables are implemented, however the hash function used is weak and does not provide enough resolution for millions of objects.
Anope 1.9 is roughly four times slower than Atheme. Anope 1.8 is considerably slower than both Atheme 6 and Anope 1.9, but provides a lower memory footprint than both platforms.
Older services platforms with simpler designs use less resources than the modern IRC platforms.
TS6 adds additional overhead in all of the services implementations supporting it. This is expected and should not cause any alarm to anybody.
Atheme has the best scalability of all of the platforms tested, being able to handle a million-user burst in only 11 to 12 seconds across all memory allocation configurations.
Anope 1.8 has the worst scalability of all of the platforms tested. This was originally thought to be the fault of the TS6 implementation, but that has recently improved. This is probably due to the use of hash tables in combination with a weak hash function.
Anope 1.9 and Atheme have similar memory usage levels with Atheme's being slightly less on smaller workloads. Anope 1.9 has an advantage at the largest possible workload - I think this is because the STL allocator is tuned for managing millions of objects.