如何排查Gitlab在OpenVZ环境下numtcpsock超限致服务器崩溃问题
碰到这种OpenVZ环境下GitLab触发numtcpsock超限崩溃的问题,确实挺闹心的——毕竟全局看连接数明明正常,偏偏进程层面突然爆仓搞垮服务器。结合我处理过的类似案例,给你梳理几个优先级最高的排查方向:
1. 先揪出到底是哪个GitLab组件在疯狂造TCP连接
全局的numtcpsock数值正常,不代表单个进程没在偷偷狂建连接。OpenVZ的限制是针对整个容器的,但很多时候是某个组件(比如Sidekiq、Workhorse)在突发场景下(比如批量Web钩子、CI流水线爆发)瞬间创建大量连接,直接触发超限阈值。
- 用
ss -tupan | grep gitlab实时盯着连接状态,重点看ESTABLISHED和SYN_SENT状态的条目,对应找到进程PID和名称——比如是GitLab Rails在疯狂连外部API,还是Sidekiq在处理一堆对外回调? - 装个
iftop或者tcpdump抓包,看看连接的目标IP和端口,判断是对外的(比如Web钩子调用、CI拉取镜像)还是内部组件间的(比如Rails连Redis/PostgreSQL) - 打开GitLab自带的Prometheus监控(在
/etc/gitlab/gitlab.rb里设prometheus['enable'] = true,然后执行gitlab-ctl reconfigure),查看gitlab_*_connections相关指标,特别是Sidekiq和Puma/Workhorse的连接数趋势,找到峰值出现的时间点,对应去查同期的日志
2. 检查GitLab的并发配置是否“过载”
虽然你限制了Redis和PostgreSQL的连接数,但GitLab前端、后台进程的并发数如果没控住,很容易引发连锁反应:
- 检查Puma(旧版本可能是Unicorn)的配置:
puma['worker_processes']×puma['max_threads']的总和如果太大,每个线程都可能创建TCP连接到后端,叠加起来很容易爆 - Sidekiq的并发数:
sidekiq['concurrency']这个值要是设得太高,在任务爆发时(比如批量触发Web钩子、CI流水线),每个并发线程都可能发起对外或对内的TCP请求,瞬间把连接数拉满 - GitLab Workhorse的配置:
gitlab_workhorse['max_clients']控制同时处理的请求数,过高的话会导致大量TCP连接积压,尤其是遇到批量Git克隆/拉取请求时
3. 排查OpenVZ本身的参数“隐性坑”
OpenVZ的numtcpsock限制有时候会有容易忽略的触发条件:
- 先看TIME_WAIT状态的连接是否被统计:有些OpenVZ内核会把TIME_WAIT也算入numtcpsock,导致看似活跃连接不多,但总计数直接爆了。执行
ss -s查看TCP状态分布,如果TIME_WAIT数量很大,调整内核参数:net.ipv4.tcp_tw_reuse = 1(NAT环境下别用tcp_tw_recycle,容易出问题),同时把net.ipv4.tcp_fin_timeout从默认60秒降到30秒,减少TIME_WAIT的存活时间 - 检查容器的其他beancounter参数,比如
tcpsndbuf、tcprcvbuf,如果这些缓冲区不足,可能导致连接创建失败后重试,进而积累更多连接请求 - 联系主机商确认numtcpsock的限制是否是“硬限制”,有没有突发峰值的允许机制——有些主机商会设置突发值,但如果触发次数过多还是会冻结容器
4. 挖GitLab日志找崩溃前的异常事件
崩溃前后的日志里肯定藏着线索,重点看这几个日志文件:
/var/log/gitlab/gitlab-rails/production.log:找有没有大量的Web钩子请求、API调用,或者某个项目的CI流水线突然爆发/var/log/gitlab/sidekiq/current:看Sidekiq是否在集中处理需要对外连接的任务(比如WebHookWorker、PipelineScheduleWorker)/var/log/gitlab/gitlab-workhorse/current:看有没有大量的Git HTTP/HTTPS请求,比如批量克隆、拉取大仓库导致的连接积压- 系统日志
/var/log/syslog或/var/log/messages:找崩溃前OpenVZ内核发出的numtcpsock exceeded警告,以及对应的进程PID
5. 模拟负载复现问题,精准定位
如果等自然触发太耗时间,可以用工具模拟负载:
- 用
ab(Apache Bench)或者hey对GitLab的Web界面、API发起并发请求,比如hey -n 1000 -c 50 https://your-gitlab-url/api/v4/projects,实时监控连接数变化 - 手动触发一批CI流水线,比如同时启动多个项目的流水线,看Sidekiq和Workhorse的连接数是否飙升
- 用工具模拟大量Web钩子回调,向GitLab的Web钩子URL发送批量请求,观察是否会触发连接数超限
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

