Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Making GitLab Faster
Search
Yorick Peterse
June 04, 2016
Programming
2
480
Making GitLab Faster
Talk given at RubyC 2016
Yorick Peterse
June 04, 2016
Tweet
Share
More Decks by Yorick Peterse
See All by Yorick Peterse
Garbage Collection Crash Course
yorickpeterse
1
390
Rubinius & The Eternal Yak
yorickpeterse
1
270
Oga
yorickpeterse
3
210
Parsing for Humans
yorickpeterse
2
110
Other Decks in Programming
See All in Programming
Data-Centric Kaggle
isax1015
2
770
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
190
AgentCoreとHuman in the Loop
har1101
5
230
CSC307 Lecture 06
javiergs
PRO
0
680
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
940
AI時代の認知負荷との向き合い方
optfit
0
150
CSC307 Lecture 03
javiergs
PRO
1
490
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
190
Apache Iceberg V3 and migration to V3
tomtanaka
0
160
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
2026年 エンジニアリング自己学習法
yumechi
0
130
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
140
How to Think Like a Performance Engineer
csswizardry
28
2.4k
Facilitating Awesome Meetings
lara
57
6.8k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Faster Mobile Websites
deanohume
310
31k
BBQ
matthewcrist
89
10k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
110
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
250
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Scaling GitHub
holman
464
140k
Transcript
Making GitLab Faster
@yorickpeterse
[email protected]
GitLab Code, test, and deploy together
GitLab.com Statistics Users 544 306 Projects 955 340 Requests per
minute ~60 000 Storage ~30 TB
Response Timings Mean 350 ms 95th Percentile 1.23 s 99th
Percentile 3.17 s (backend only)
GitLab is slow, GitLab.com even more so
None
GitLab Problems
Limited production monitoring New Relic only on 1 out of
40 servers
No good development tools Only a collection of random Gems
No performance guides No guides on good/bad patterns, snippets to
use, workflow, etc
Lack of specialists Nobody was specifically focusing on performance
Badly Performing Code N+1 queries, inefficient algorithms, loading lots of
data into memory, etc
Solutions According to HackerNews
“Gitlab is one project that absolutely needs to be rebuilt
using Java. Both from a performance and a deployment perspective” https://news.ycombinator.com/item?id=11049717
“gogs was designed from the start to be fast. Nothing
but a rewrite would make GitLab as fast as gogs for basic stuff on small self-hosted servers.” https://news.ycombinator.com/item?id=11431410
Problem Solved! Let’s Rewrite GitLab in Java/Go/Haskell
Production Monitoring
Production monitoring is the first step to solving performance problems
GitLab’s Requirements 1. FOSS 2. Easy to set up 3.
Easy to query, visualize and add metrics 4. Low overhead 5. Support for percentiles
N-th percentile: N% of values are up to a given
value
“The 90th percentile is 1.5 seconds” means 90% completes in
1.5 seconds
GitLab Performance Monitoring
InfluxDB Time series DB with SQL-like query syntax
Grafana Time series visualization
Custom Ruby Code Used for measuring data, built from scratch
Transaction Metrics Rails, Grape, and Sidekiq
Code Region Metrics For measuring custom regions of code
Background Sampler Object counts, memory usage, GC statistics
None
None
Development Tools
Sherlock Development-only performance analysis, re-using the GitLab UI
1. Request details (URL, timings, etc) 2. Query timings, backtraces,
and EXPLAIN ANALYZE output 3. Line profiling
None
None
None
Documentation
GitLab Performance Guide Documents patterns to use/avoid, workflow, etc
http://docs.gitlab.com/ce/development/performance.html or https://is.gd/gitlab_webscale
Application Code
The language is rarely the problem
The database is not a black box
Rampant abuse of “pluck”
users.where(id: projects.pluck(:user_id))
users.where(id: projects.select(:user_id))
Combining Query Results
user.projects + public_projects + internal_projects
user.projects UNION public_projects UNION internal_projects
UNION not properly supported in ActiveRecord/Arel :<
Lots of Git Operations
if repo.exists? ... end
if repo.master_branch? foo end
Git Tag Existence https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3983
if all_tags.include?(ref_name) => if tag_exists?(ref_name)
Markdown References https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3969
for text in texts for reference in text process(reference)
process(texts)
1. Grab all references in a single pass 2. Query
any rows using the references 3. Replace text using the queried data
Calling “url_helpers” https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3486
include app.routes.url_helpers
include Gitlab::Routing.url_helpers
def self.url_helpers @url_helpers ||= Gitlab::Application. routes.url_helpers end
Recap
Language/framework is usually only a problem when the application is
already fully optimized.
Take advantage of your database’s features
There is no silver bullet to fixing performance problems, it
simply takes time, effort, and patience.
Keep an eye on GitLab 8.9 for many performance improvements
Questions?