ZITADEL Docs
APIsBenchmarksv4.17.1

machine client credentials login 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 16:03:44 UTC
Test end2026-08-27 16:33:45 UTC
Test duration30min
Executed testmachine_client_credentials_login
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 26%, p99 36% (peak 44%)
Memory: p50 6%, peak 12%
Instances: 7 (constant), no container startups recorded
Server-side: 1,674 req/s, latency p50 46ms / p95 1.8s / p99 2.3s
Observed errors1,789 of 3,073,497 requests failed (0.05%): 3x connection reset, 1,786x not individually logged (see k6 output). 1 iteration aborted on a null response body. 1,789 of 4,607,991 checks failed (0.03%): client credentials status ok (905 failed), userinfo status ok (884 failed)
Top 3 most expensive database queries1: Query events by aggregate_id and event_types, ordered by sequence (4,057 s)
2: Push events (eventstore.push) (3,810 s)
3: Query events by instance_id, aggregate_types, event_types, position (paged) (3,573 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: 96% median, 98% peak
Memory: 40%
Connections: 46
Transactions: 10,804/s
IOPS: read 0, write 857
CPU-saturated — the bottleneck for this target.
k6 Iterations per second834
k6 outputoutput
flowchart outcomeScale. Database CPU is the limit: 96% median against ZITADEL at 26%, with advisory lock wait only 0% 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.......: 4607991 2501.878593/s
    checks_succeeded...: 99.96%  4606202 out of 4607991
    checks_failed......: 0.03%   1789 out of 4607991

    ✓ 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
    ✓ generate machine secret status ok
    ✓ openid configuration
    ✗ client credentials status ok
      ↳  99% — ✓ 1535091 / ✗ 905
    ✓ client credentials token ok
    ✗ userinfo status ok
      ↳  99% — ✓ 1534207 / ✗ 884
    ✓ org removed

    CUSTOM
    login_ui_enter_login_name_duration...: min=140.15ms avg=140.15ms max=140.15ms p(50)=140.15ms p(95)=140.15ms p(99)=140.15ms
    login_ui_enter_password_duration.....: min=17.02ms  avg=17.02ms  max=17.02ms  p(50)=17.02ms  p(95)=17.02ms  p(99)=17.02ms
    login_ui_init_login_duration.........: min=73.97ms  avg=73.97ms  max=73.97ms  p(50)=73.97ms  p(95)=73.97ms  p(99)=73.97ms
    login_ui_token_duration..............: min=188.55ms avg=188.55ms max=188.55ms p(50)=188.55ms p(95)=188.55ms p(99)=188.55ms
    oidc_client_credentials_duration.....: min=0s       avg=434.03ms max=7.96s    p(50)=69.73ms  p(95)=2.16s    p(99)=2.56s
    oidc_user_info_duration..............: min=0s       avg=268.43ms max=8.81s    p(50)=39.35ms  p(95)=1.35s    p(99)=1.61s
    org_create_org_duration..............: min=65.77ms  avg=65.77ms  max=65.77ms  p(50)=65.77ms  p(95)=65.77ms  p(99)=65.77ms
    user_add_machine_secret_duration.....: min=47.04ms  avg=3.8s     max=7.63s    p(50)=3.75s    p(95)=7.26s    p(99)=7.54s
    user_create_machine_duration.........: min=45.5ms   avg=631.9ms  max=946.99ms p(50)=637.66ms p(95)=867.81ms p(99)=881.99ms

    HTTP
    http_req_duration....................: min=0s       avg=351.86ms max=8.81s    p(50)=56.78ms  p(95)=1.74s    p(99)=2.42s
      { expected_response:true }.........: min=9.43ms   avg=350.9ms  max=8.81s    p(50)=56.73ms  p(95)=1.74s    p(99)=2.42s
    http_req_failed......................: 0.05%   1789 out of 3073497
    http_reqs............................: 3073497 1668.735106/s

    EXECUTION
    iteration_duration...................: min=833.79µs avg=703.15ms max=9.19s    p(50)=332.64ms p(95)=2.39s    p(99)=3.27s
    iterations...........................: 1535996 833.958988/s
    vus..................................: 0       min=0               max=600
    vus_max..............................: 600     min=600             max=600

    NETWORK
    data_received........................: 3.4 GB  1.9 MB/s
    data_sent............................: 1.3 GB  692 kB/s

running (30m41.8s), 000/600 VUs, 1535996 complete and 0 interrupted iterations
default ✓ [ 100% ] 600 VUs  30m0s

Was this page helpful?

On this page