Replaced
Backlog's Git Server
From Perl To Go
#gocon Spring 2018 by Yuichi Watanabe @nulab
# Introduction
Yuichi Watanabe
# What is a Git Server ?
- Replaced a server for accessing Git remote repository via HTTP. That is where the Gopher is in the diagram below.
- In order to access a Git remote repository by HTTP, something is needed in front the remote repository, to handle the HTTP requests occurring in clone, push, fetch etc.
# example endpoints
GET ***/info/refs?service=git-upload-pack
GET ***/info/refs?service=git-receive-pack
POST ***/git-upload-pack
POST ***/git-receive-pack
The Git Server basically implements behavior for each endpoint according to the Smart Protocol specification defined by Git.
# What is a Git Server ?
# Motivation
Backlog has a subsystem that stood out a bit, a Git HTTP Server written in Perl. This Git HTTP Server itself does not undergo a lot of development. It's a relatively small system whose responsibility is not too large. I felt that the enthusiasm of maintaining this system within my team, including myself, was gradually decreasing. Also, we currently don't have a Perl Hacker our team.
# Motivation
At the same time, Backlog users are steadily increasing.
I thought I could improve our motivation, the maintainability, and performance by replacing the Git Server using Golang.
Don't guess, measure !
I decided to rewrite and measure it, as the proverb goes.
# Motivation
# Comparison Structure
## It could handle many requests.
# Improvments
100ms
400ms
Golang
Perl
## It could handle many requests.
Perl
Golang
# Improvments
60%
100%
### CPU usage
## It could handle many requests.
Perl
Golang
# Improvments
### Load Average
The speed of git clone and push improved by 2x times.
The larger the Git repository, the larger the speed difference.
## Improved the user experience of clone
Perl | Golang |
---|---|
1:02.35 | 35.185 |
1:05.73 | 36.318 |
1:13.02 | 35.383 |
# Improvments
## And More...
- Reduced memory used for pre-forking the process.
> Perl: 2.082456 MB
> Golang: 24.664 KB
- Deployment is simple as it is compiled into a single binary.
- We were able to focus on writing code without worrying about code formatting thanks to `go fmt`.
- Since golang is statically typed, We ware able to use code completion which improved my efficiency.
# Improvments
As a result, The performance improved. However, It's difficult to compare Perl and Golang, as they are so different. Golang is a compiled language and has lightweight threading.
I got a lot of insight on the design of Web applications written in Perl and eventually learned a lot about the Perl programming language.
I saw Geek 's wonderful hack footprints, I've come to like Perl than before.
Thank you for Perl, for your hard work. Hello Golang.
# Finally
Thanks !
Replaced Backlog's Git Server from Perl to Go
By Yuichi Watanabe
Replaced Backlog's Git Server from Perl to Go
- 3,129