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