Improve cache hit rates with Rails Bootsnap cache
What does this MR do?
Previously the Bootsnap cache was populated with rake about
. While
this loads the Rails environment, it does not load a significant
amount of the GitLab Rails code.
This merge request adds an intermediate image to populate the Bootsnap cache. It does the following:
- Builds
gitlab-rails-{ce,ee}
image. - Uses docker-compose to spin up a PostgreSQL, Redis, and the Rails image to
start
gitlab-rails runner
. - Builds a
gitlab-rails-bootsnap-{ce,ee}
image that contains the Bootsnap cache in/srv/gitlab/bootsnap
.
Images such as gitlab-webservice-ee
then copy the contents of gitlab-rails-bootsnap-ee
into their image.
This improves the hit rate significantly. Setting the BOOTSNAP_LOG
environment variable shows that previously there were 11,567 and
11,553 "[Bootsnap] miss" messages in webservice
and sidekiq
,
respectively. After this change, the number dropped to 29 and 26,
respectively.
More importantly, the startup times dropped about 15 seconds as a result of this change.
Sizes
Debian
Image | Size before (GB) | Size after (GB) |
---|---|---|
registry.gitlab.com/gitlab-org/build/cng/gitlab-geo-logcursor | 1.72 | 1.7 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ce | 1.84 | 1.79 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ee | 1.86 | 1.84 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ce | 2.04 | 1.99 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee | 2.06 | 2.03 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ce | 1.82 | 1.77 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ee | 1.84 | 1.81 |
UBI-8
Image | Size before (GB) | Size after (GB) |
---|---|---|
registry.gitlab.com/gitlab-org/build/cng/gitlab-geo-logcursor | 2.62 | 2.5 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ee | 2.77 | 2.66 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee | 2.97 | 2.85 |
registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ee | 2.74 | 2.63 |
Testing
I used this script to validate the size of permissions:
#!/usr/bin/env bash
images=( registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ce
registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ce
registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ee
registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ee
registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ce
registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee
registry.gitlab.com/gitlab-org/build/cng/gitlab-geo-logcursor )
function pull_and_show () {
echo "=== Checking $1"
docker pull -q $1
docker run $1 sh -c 'ls -al /srv/gitlab/bootsnap; du -hs /srv/gitlab/bootsnap'
echo "=== Done =="
}
for img in "${images[@]}"
do
pull_and_show $img:sh-bootsnap-all
if [[ "$img" != *-ce ]]; then
pull_and_show $img:sh-bootsnap-all-ubi8
fi
done
Related issues
Relates to #655 (closed)
Checklist
See Definition of done.
For anything in this list which will not be completed, please provide a reason in the MR discussion
Required
-
Merge Request Title, and Description are up to date, accurate, and descriptive -
MR targeting the appropriate branch -
MR has a green pipeline on GitLab.com -
When ready for review, MR is labeled "~workflow::ready for review" per the Distribution MR workflow
Expected (please provide an explanation if not completing)
-
Test plan indicating conditions for success has been posted and passes -
Documentation created/updated -
Integration tests added to GitLab QA -
The impact any change in container size has should be evaluated -
New dependencies are managed with dependencies.io