ZITADEL Docs
APIsBenchmarksv4.17.1

add session benchmark of zitadel v4.17.1

Benchmark results of the v4.17.1 release of Zitadel.

Performance test results

MetricValue
Baselinenone
PurposeTest current performance
Test start2026-08-27 14:58:50 UTC
Test end2026-08-27 15:28:51 UTC
Test duration30min
Executed testadd_session
k6 versionv2.1.0
VUs600
Client locationUS1
ZITADEL locationUS1
ZITADEL container specificationvCPU: 6
Memory: 6 Gi
Container min scale: 7
Container max scale: 7
ZITADEL Versionv4.17.1
ZITADEL SettingsEventstore autovacuum (new in v4.17): Enabled: true
VacuumThreshold: 1000000
AnalyzeThreshold: 1000000
Tuned for the ~4,000 events/s expected during the benchmark, per the tuning guide.
ZITADEL feature flagsEnabled: loginDefaultOrg (instance), oidcTokenExchange (system), enableBackChannelLogout (system), consoleUseV2UserApi (instance)
improvedPerformance (instance): IMPROVED_PERFORMANCE_PROJECT_GRANT, IMPROVED_PERFORMANCE_PROJECT, IMPROVED_PERFORMANCE_USER_GRANT, IMPROVED_PERFORMANCE_ORG_DOMAIN_VERIFIED
Disabled: loginV2 (explicitly false at instance), userSchema, debugOidcParentError, oidcSingleV1SessionTermination, permissionCheckV2
Captured from the instance before the run (sequence 7, set 2026-08-27 13:35:31 UTC); the same capture covers manipulate_user at 13:41 and the rest of the sweep from 14:56, so all eleven targets ran the same configuration.
This restores like-for-like comparison with the v4 pages, which ran five improvedPerformance options. The fifth, IMPROVED_PERFORMANCE_ORG_BY_ID, is reserved in the proto and no longer exists.
Databasetype: psql
version: v17.4
Database locationUS1
Database specificationvCPU: 8
memory: 32Gib
ZITADEL metrics during testCPU: p50 18%, p99 26% (peak 28%)
Memory: p50 6%, peak 12%
Instances: 7 (constant), no container startups recorded
Server-side: 790 req/s, latency p50 80ms / p95 3.5s / p99 3.9s
Observed errors1 of 1,416,546 requests failed (0.00%): none of the 1 individually logged (see k6 output). 1 of 2,831,284 checks failed (0.00%): add Session status ok (1 failed)
Top 3 most expensive database queries1: Push events (eventstore.push) (5,059 s)
2: Query events by instance_id, aggregate_types, event_types, position (paged) (3,497 s)
3: Shared advisory lock on events2, taken by every push — lock wait (585 s)
Ranked by total accumulated execution time summed across concurrent sessions (Cloud SQL Query Insights) — not CPU time; it can exceed the wall-clock window.
Database metrics during testCPU: 97% median, 98% peak
Memory: 40%
Connections: 46
Transactions: 9,895/s
IOPS: read 0, write 787
CPU-saturated — the bottleneck for this target.
k6 Iterations per second767
k6 outputoutput
flowchart outcomeScale. Database CPU is the limit: 97% median against ZITADEL at 18%, with advisory lock wait only 6% of the top-5 query time. Raising the database beyond 8 vCPU is the next step, and throughput should be re-measured against the increase.

Endpoint latencies

k6 output

 TOTAL RESULTS

    checks_total.......: 2831284 1533.737688/s
    checks_succeeded...: 99.99%  2831283 out of 2831284
    checks_failed......: 0.00%   1 out of 2831284

 user defined
 authorize status ok
 login name status ok
 login shows password page
 password status ok
 password callback
 code set
 token status ok
 access token created
 id token created
 info created
 org created
 create user is status ok
 add Session status ok
  99% 1415335 / 1
 add session is status ok
 org removed

    CUSTOM
    add_session_duration.................: min=23ms     avg=763.11ms max=7.69s    p(50)=96ms     p(95)=3.53s    p(99)=4.15s
    login_ui_enter_login_name_duration...: min=210.14ms avg=210.14ms max=210.14ms p(50)=210.14ms p(95)=210.14ms p(99)=210.14ms
    login_ui_enter_password_duration.....: min=18.75ms  avg=18.75ms  max=18.75ms  p(50)=18.75ms  p(95)=18.75ms  p(99)=18.75ms
    login_ui_init_login_duration.........: min=230.06ms avg=230.06ms max=230.06ms p(50)=230.06ms p(95)=230.06ms p(99)=230.06ms
    login_ui_token_duration..............: min=137.93ms avg=137.93ms max=137.93ms p(50)=137.93ms p(95)=137.93ms p(99)=137.93ms
    org_create_org_duration..............: min=57.15ms  avg=57.15ms  max=57.15ms  p(50)=57.15ms  p(95)=57.15ms  p(99)=57.15ms
    session_add_session_duration.........: min=21.8ms   avg=761.9ms  max=7.69s    p(50)=95.24ms  p(95)=3.53s    p(99)=4.15s
    user_create_human_duration...........: min=464.18ms avg=3.23s    max=5.82s    p(50)=3.06s    p(95)=5.61s    p(99)=5.75s

    HTTP
    http_req_duration....................: min=18.75ms  avg=762.65ms max=12.57s   p(50)=95.25ms  p(95)=3.53s    p(99)=4.15s
      { expected_response:true }.........: min=18.75ms  avg=762.65ms max=12.57s   p(50)=95.25ms  p(95)=3.53s    p(99)=4.15s
    http_req_failed......................: 0.00%   1 out of 1416546
    http_reqs............................: 1416546 767.358551/s

    EXECUTION
    iteration_duration...................: min=23.47ms  avg=763.22ms max=7.69s    p(50)=96.45ms  p(95)=3.53s    p(99)=4.15s
    iterations...........................: 1415336 766.703081/s
    vus..................................: 0       min=0            max=600
    vus_max..............................: 600     min=600          max=600

    NETWORK
    data_received........................: 1.1 GB  584 kB/s
    data_sent............................: 235 MB  127 kB/s

running (30m46.0s), 000/600 VUs, 1415336 complete and 0 interrupted iterations
default [ 100% ] 600 VUs  30m0s

Was this page helpful?

On this page