{"id":455,"date":"2026-10-14T12:21:11","date_gmt":"2026-10-14T12:21:11","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2015\/11\/12\/gerrit-performance-cheatsheet\/"},"modified":"2026-10-14T12:21:11","modified_gmt":"2026-10-14T12:21:11","slug":"gerrit-performance-cheatsheet","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/gerrit-performance-cheatsheet\/","title":{"rendered":"Gerrit Performance Tuning Cheat Sheet: Workflow, Bottlenecks, and Practical Commands"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Gerrit performance tuning is usually less about a single magic setting and more about <strong>systematic diagnosis<\/strong> across Git traffic, indexing, JVM behavior, storage, and database latency. This guide is for DevOps and platform engineers who need a fast, repeatable way to investigate slow reviews, delayed indexing, or sluggish push operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2015-11-12; fully revised and updated.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2015\/11\/gerrit-performance-cheatshe.png\" alt=\"gerrit-performance-cheatsheet\" width=\"600\" height=\"400\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2015\/11\/gerrit-performance-cheatshe.png 600w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2015\/11\/gerrit-performance-cheatshe-300x200.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Original reference from the earlier post: <a href=\"http:\/\/help.collab.net\/topic\/teamforge80-git-gerrit210x\/reference\/Gerrit-Performance-Tuning-Cheat-Sheet.pdf\">Gerrit Performance CheatSheet (PDF)<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A practical way to tune Gerrit performance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Treat tuning as an <strong>iterative loop<\/strong>: baseline, isolate one bottleneck, apply one change, and measure again. This keeps troubleshooting objective and prevents regressions caused by multiple simultaneous changes.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Capture baseline metrics] --> B[Identify slow user action]\n    B --> C[Map issue to layer]\n    C --> D[Apply one change]\n    D --> E[Measure again]\n    E --> F{Improved and stable}\n    F -- no --> C\n    F -- yes --> G[Document and monitor]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Where Gerrit bottlenecks usually appear<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Layer<\/th><th>Common symptom<\/th><th>What to check first<\/th><th>Typical next action<\/th><\/tr><\/thead><tbody><tr><td>Git receive path<\/td><td>Slow push to review refs<\/td><td>CPU, disk IOPS, receive queue depth<\/td><td>Reduce host contention and verify repository storage performance<\/td><\/tr><tr><td>Indexing and search<\/td><td>Search results delayed or slow<\/td><td>Index backlog and indexing worker activity<\/td><td>Tune indexing capacity and monitor index health<\/td><\/tr><tr><td>Database<\/td><td>UI\/API latency spikes<\/td><td>DB latency, connection pool pressure, slow queries<\/td><td>Optimize DB performance and pool sizing<\/td><\/tr><tr><td>Caches<\/td><td>Repeated expensive lookups<\/td><td>Cache hit ratio and churn<\/td><td>Adjust cache sizing with memory limits in mind<\/td><\/tr><tr><td>JVM and GC<\/td><td>Periodic pauses or throughput drops<\/td><td>Heap usage and GC pause behavior<\/td><td>Right-size heap and review GC strategy<\/td><\/tr><tr><td>Front door HTTP or SSH<\/td><td>Intermittent request slowdown<\/td><td>Thread or connection saturation<\/td><td>Tune concurrency and proxy or load balancer limits<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting tools compared<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool or source<\/th><th>Best for<\/th><th>Strength<\/th><th>Limitation<\/th><\/tr><\/thead><tbody><tr><td>Gerrit SSH admin commands<\/td><td>Live server internals such as queues and caches<\/td><td>Fast, service-specific visibility<\/td><td>Command availability can vary by version and setup<\/td><\/tr><tr><td>OS tools (vmstat, iostat, top)<\/td><td>CPU, memory, disk, and load diagnosis<\/td><td>Always useful for first-pass triage<\/td><td>Not Gerrit-specific context<\/td><\/tr><tr><td>JVM tools (jcmd, jstat)<\/td><td>Heap and garbage-collection behavior<\/td><td>Pinpoints Java runtime pressure<\/td><td>Needs JVM access and interpretation skill<\/td><\/tr><tr><td>Database monitoring<\/td><td>Query and connection bottlenecks<\/td><td>Identifies backend latency root causes<\/td><td>Requires DB-side observability<\/td><\/tr><tr><td>Reverse proxy or load balancer metrics<\/td><td>Request concurrency and frontend pressure<\/td><td>Shows ingress saturation patterns<\/td><td>Can hide backend details if used alone<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Command examples for a safe tuning cycle<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) Capture a quick host baseline<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">uptime\nvmstat 1 5\niostat -xz 1 5\nfree -m\ndf -h\nulimit -n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2) Inspect Gerrit internals from SSH admin interface<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use these only if the SSH admin interface is enabled and your account has permission.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">-p<\/span> 29418 <span class=\"hljs-selector-tag\">admin<\/span><span class=\"hljs-keyword\">@review<\/span>.example.com gerrit show-caches\nssh -p <span class=\"hljs-number\">29418<\/span> admin@review.example.com gerrit show-queue\nssh -p <span class=\"hljs-number\">29418<\/span> admin@review.example.com gerrit show-connections<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">3) Validate user-facing push latency<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">time git push origin HEAD:refs\/for\/main<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">4) Example JVM sizing pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Exact file paths and startup conventions depend on installation method and operating system.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">JAVA_OPTIONS=<span class=\"hljs-string\">\"-Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Baseline first, then change <strong>one variable at a time<\/strong>.<\/li><li>Correlate Gerrit metrics with OS, JVM, and database metrics before tuning.<\/li><li>Prefer repeatable load patterns for validation instead of one-off manual checks.<\/li><li>Track every tuning change with timestamp, reason, and rollback plan.<\/li><li>Re-check performance after upgrades because defaults and internals can change by version.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A practical Gerrit performance guide for DevOps and platform engineers. Learn a repeatable tuning workflow, where bottlenecks usually appear, and which commands to run first.<\/p>\n","protected":false},"author":1,"featured_media":3098,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[558],"tags":[1385,945,1387,1386,1388,940,938,634,894,939],"class_list":["post-455","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-source-code-management","tag-cheatsheet","tag-gerrit","tag-gerrit-performance","tag-gerrit-performance-cheatsheet","tag-gerrit-resources","tag-link","tag-reference","tag-resources","tag-website","tag-websites"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=455"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/455\/revisions"}],"predecessor-version":[{"id":79330,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/455\/revisions\/79330"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3098"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}