ZITADEL Docs
APIsBenchmarksv4.17.1

otp 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 18:49:09 UTC
Test end2026-08-27 19:19:16 UTC
Test duration30min
Executed testotp_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 9%, p99 20% (peak 22%)
Memory: p50 6%, peak 14%
Instances: 7 (constant), no container startups recorded
Server-side: 256 req/s, latency p50 2.8s / p95 8.4s / p99 9.3s
Observed errors182 of 466,756 requests failed (0.03%): none of the 182 individually logged (see k6 output). 182 of 466,159 checks failed (0.03%): add Session status ok (56 failed), set Session status ok (126 failed)
Top 3 most expensive database queries1: Projection handler advisory lock, one per projection per instance — lock wait, not query work (13,149 s)
2: Query events by instance_id, aggregate_types, event_types, position (paged) (3,760 s)
3: Load user with primary login name and human profile (1,615 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: 63% median, 64% peak
Memory: 40%
Connections: 46
Transactions: 3,554/s
IOPS: read 3, write 860
k6 Iterations per second84
k6 outputoutput
flowchart outcomePotential issues. Not resource-bound: database CPU 63%, ZITADEL CPU 9%, yet 69% of the top-5 query time is advisory lock wait — predominantly the projection handler lock, which serialises this workload. Additional vCPU will not help. Logged as an issue rather than blocking further scale testing.

Endpoint latencies

k6 output

  █ TOTAL RESULTS

    checks_total.......: 466159 252.308936/s
    checks_succeeded...: 99.96% 465977 out of 466159
    checks_failed......: 0.03%  182 out of 466159

    ✓ 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
    ✓ set email otp status ok
    ✗ add Session status ok
      ↳  99% — ✓ 154981 / ✗ 56
    ✗ set Session status ok
      ↳  99% — ✓ 309783 / ✗ 126
    ✓ org removed

    CUSTOM
    login_ui_enter_login_name_duration...: min=111.91ms avg=111.91ms max=111.91ms p(50)=111.91ms p(95)=111.91ms p(99)=111.91ms
    login_ui_enter_password_duration.....: min=19.51ms  avg=19.51ms  max=19.51ms  p(50)=19.51ms  p(95)=19.51ms  p(99)=19.51ms
    login_ui_init_login_duration.........: min=72.77ms  avg=72.77ms  max=72.77ms  p(50)=72.77ms  p(95)=72.77ms  p(99)=72.77ms
    login_ui_token_duration..............: min=112.4ms  avg=112.4ms  max=112.4ms  p(50)=112.4ms  p(95)=112.4ms  p(99)=112.4ms
    org_create_org_duration..............: min=57.4ms   avg=57.4ms   max=57.4ms   p(50)=57.4ms   p(95)=57.4ms   p(99)=57.4ms
    otp_session_duration.................: min=125ms    avg=6.97s    max=36.37s   p(50)=5.63s    p(95)=18.87s   p(99)=23s
    session_add_session_duration.........: min=52.96ms  avg=6.77s    max=30.32s   p(50)=5.35s    p(95)=18.76s   p(99)=22.29s
    session_set_session_duration.........: min=20.57ms  avg=96.93ms  max=8.56s    p(50)=39.41ms  p(95)=64.73ms  p(99)=2.29s
    set_human_email_otp_duration.........: min=27.64ms  avg=241.81ms max=549.68ms p(50)=256.75ms p(95)=481.96ms p(99)=535.73ms
    user_create_human_duration...........: min=378.51ms avg=3.51s    max=6.81s    p(50)=3.82s    p(95)=5.86s    p(99)=6.72s

    HTTP
    http_req_duration....................: min=17.42ms  avg=2.32s    max=30.32s   p(50)=47.8ms   p(95)=13.83s   p(99)=20.22s
      { expected_response:true }.........: min=17.42ms  avg=2.32s    max=30.32s   p(50)=47.79ms  p(95)=13.83s   p(99)=20.22s
    http_req_failed......................: 0.03%  182 out of 466756
    http_reqs............................: 466756 252.632063/s

    EXECUTION
    iteration_duration...................: min=124.68ms avg=6.97s    max=36.37s   p(50)=5.62s    p(95)=18.86s   p(99)=23s
    iterations...........................: 155037 83.913902/s
    vus..................................: 0      min=0             max=600
    vus_max..............................: 600    min=600           max=600

    NETWORK
    data_received........................: 351 MB 190 kB/s
    data_sent............................: 178 MB 96 kB/s

running (30m47.6s), 000/600 VUs, 155037 complete and 0 interrupted iterations
default ✓ [ 100% ] 600 VUs  30m0s

Was this page helpful?

On this page