Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Making GitLab Faster
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yorick Peterse
June 04, 2016
Programming
490
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Making GitLab Faster
Talk given at RubyC 2016
Yorick Peterse
June 04, 2016
More Decks by Yorick Peterse
See All by Yorick Peterse
Garbage Collection Crash Course
yorickpeterse
1
400
Rubinius & The Eternal Yak
yorickpeterse
1
290
Oga
yorickpeterse
3
210
Parsing for Humans
yorickpeterse
2
120
Other Decks in Programming
See All in Programming
Webの地図
yosuke_furukawa
PRO
6
4.5k
アクセシビリティから考える情報設計
high_g_engineer
0
380
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
1.8k
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
4
2.7k
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
260
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
280
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
140
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
120
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
340
Intent as Code
shoppingjaws
6
1k
Featured
See All Featured
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
280
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Google's AI Overviews - The New Search
badams
0
1.6k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
510
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Designing for Performance
lara
611
70k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
Visualization
eitanlees
152
17k
Paper Plane
katiecoart
PRO
4
53k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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?