我需要为特定类型的作业大幅加速 I/O,并想为此使用
tmpfs
。我发现了另一个SO问题和接受的答案,在CI配置中手动安装tmpfs
(通过before_script
)需要在特权模式下运行GitLab一点也不快。
我还发现了海登少校的另一篇博文使用 ramdisk 获得更快的 GitLab runners 在运行器配置中使用
[runners.docker.tmpfs]
选项,但我也没有看到这种方法有任何加速。
我尝试过的另一件事是在主机上创建一个 tmpfs 挂载点并将其挂载到 GitLab 运行器的容器,然后将其配置为在运行器实例容器中使用,但同样,根本没有加速。 我无法获得超过 60 MB/s 的写入速度。
基于 Hayden 的方法,我通过 Docker 运行的 GitLab runner 的配置是:
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "Pre-calibration"
output_limit = 16384
url = "https://..."
id = 39
token = "..."
token_obtained_at = 2023-02-27T10:21:22Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
# The goal is to have the builds and cache dir also in RAM, once it's working
# builds_dir = "/ramdisk"
# cache_dir = "/ramdisk/cache"
environment = ["DOCKER_DRIVER=overlay2"]
[runners.custom_build_dir]
enabled = true
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:latest"
memory = "128m"
cpus = "120"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock"]
shm_size = 0
[runners.docker.tmpfs]
"/ramdisk" = "rw,exec"
这是
.gitlab-ci.yml
:
variables:
DOCKER_DRIVER: overlay2
pre-calibration:
script:
- pwd
- df -h
- ls -al /ramdisk
- time dd if=/dev/zero of=/ramdisk/1G.dat bs=1G count=1 oflag=dsync
- time cp /ramdisk/1G.dat /ramdisk/1G_copy.dat
tags:
- pre-calibration
在下面你可以看到从
/dev/zero
到 /ramdisk
的写入速度,也显示为 tmpfs
挂载以及从 /ramdisk
到 /ramdisk
通过 cp
的写入速度约为 60MB/s,这是更多或更低的硬盘驱动器速度,与 RAM 的性能相去甚远。
$ pwd
/builds/tgal/pre-calibration-runner
$ df -h
Filesystem Size Used Avail Use% Mounted on
overlay 394G 301G 76G 80% /
tmpfs 64M 0 64M 0% /dev
tmpfs 252G 0 252G 0% /sys/fs/cgroup
shm 64M 0 64M 0% /dev/shm
/dev/mapper/ubuntu--vg-ubuntu--lv 394G 301G 76G 80% /builds
tmpfs 252G 0 252G 0% /ramdisk
tmpfs 51G 3.5M 51G 1% /run/docker.sock
$ ls -al /ramdisk
total 4
drwxrwxrwt 2 root root 40 Feb 27 12:41 .
drwxr-xr-x 1 root root 4096 Feb 27 12:41 ..
$ time dd if=/dev/zero of=/ramdisk/1G.dat bs=1G count=1 oflag=dsync
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 17.512 s, 61.3 MB/s
real 0m17.559s
user 0m0.000s
sys 0m8.726s
$ time cp /ramdisk/1G.dat /ramdisk/1G_copy.dat
real 0m16.593s
user 0m0.021s
sys 0m7.147s
Cleaning up project directory and file based variables
00:01
Job succeeded