Load test of 1000 players on the server: CPU is the ceiling (~135 req/s); player-simulation tools

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 19:48:00 +03:30
parent ba4ecff29e
commit e3c8962b7b
5 changed files with 150 additions and 0 deletions

13
tools/loadtest/agg.py Normal file
View File

@@ -0,0 +1,13 @@
import json, sys, glob, collections
recs = [r for f in sorted(glob.glob(sys.argv[1])) for r in json.load(open(f))]
dur = dict(x.split(':') for x in sys.argv[2].split(','))
q = lambda a, p: round(a[min(len(a) - 1, int(p * len(a)))] * 1000) if a else None
for stage in dur:
mine = [r for r in recs if r[0] == stage]
lat = sorted(r[3] for r in mine if r[1] != 'ai/ask')
codes = collections.Counter(str(r[2]) for r in mine)
per = collections.defaultdict(list)
for r in mine: per[r[1]].append(r[3])
print(json.dumps({'users': int(stage), 'requests': len(lat), 'rps': round(len(lat) / int(dur[stage]), 1), 'p50_ms': q(lat, .5), 'p95_ms': q(lat, .95),
'p99_ms': q(lat, .99), 'max_ms': q(lat, 1), 'codes': dict(codes),
'per': {k: {'n': len(v), 'p50': q(sorted(v), .5), 'p95': q(sorted(v), .95)} for k, v in per.items()}}, ensure_ascii=False))