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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yorick Peterse
June 04, 2016
Programming
480
2
Share
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
390
Rubinius & The Eternal Yak
yorickpeterse
1
280
Oga
yorickpeterse
3
210
Parsing for Humans
yorickpeterse
2
110
Other Decks in Programming
See All in Programming
dRuby over BLE
makicamel
2
310
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
1.5k
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
880
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
110
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
220
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.6k
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.5k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
190
TypeScriptだけでAIエージェントを作る フロント・エージェント・インフラのフルスタック実践
har1101
6
1.3k
エージェンティックRAGにAWSで入門しよう!
har1101
7
970
GitHub Copilot CLIのいいところ
htkym
2
1.3k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.2k
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
770
The SEO identity crisis: Don't let AI make you average
varn
0
480
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
400
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
Done Done
chrislema
186
16k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Designing Experiences People Love
moore
143
24k
Designing for humans not robots
tammielis
254
26k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
320
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?