推荐使用
Py-Spy
和Scalene
这个两个工具进行问题排查。
- [1] 问题现象
情况是下面这个样子的:
有一个开发给我们的某一个仓库提交了代码,紧接着没多久,发现我们的 Gitlab
服务和聊天工具均无法正常使用了。登录到对应的服务器,发现是因为内存占用满了导致了。而发现导致内存占用满的罪魁祸首就是 Gitlab
服务,随后紧接着重启了该服务,服务均正常可用。但是,没过多久该情况还是会反复出现。
- [2] 问题原因
后来分析得出当时 Gitlab
卡住的问题原因大致是下面这样的:
- 因为开发推送代码的时候,使用
force push
强制推送到了代码库,然后使用gocd
自动构建的时候就会重新clone
该仓库的提交记录。比较尴尬的是,正好这个代码库的数据量又比较大(5G
左右)。 - 而
gocd
的每个pipeline
的clone
都会在Gitlab
服务器起一个git pack-objects
的进程(最多好像是核数+1
),这个进程负责将对象打包到文件,会占用大量的内存资源,然后Gitlab
所在的服务就卡死了。服务器内存不足,然后服务器就卡死了。
- [3] 解决办法
处理方法大致如下所示:
- 先给
Gitlab
服务所在的服务器加内存,扩充到16G
。 - 删除了部分不再使用该仓库的
gocd
相关的pipeline
任务。 - 在
gocd
中设置git
仓库时候需要勾选上Shallow clone
(浅拷贝) 选项。