内存占用
gitlab内存占用是出奇的高,我这里高的离谱,top一看全都是gitlab的进程
组件调优
进入容器通过命令gitlab-ctl status
可以看到所有运行的组件
root@gitlab:/# gitlab-ctl status
run: alertmanager: (pid 680) 162s; run: log: (pid 483) 296s
run: gitaly: (pid 275) 324s; run: log: (pid 272) 324s
run: gitlab-exporter: (pid 651) 167s; run: log: (pid 407) 315s
run: gitlab-kas: (pid 350) 317s; run: log: (pid 349) 317s
run: gitlab-workhorse: (pid 359) 317s; run: log: (pid 358) 317s
run: logrotate: (pid 274) 324s; run: log: (pid 271) 324s
run: nginx: (pid 363) 317s; run: log: (pid 362) 317s
run: postgres-exporter: (pid 692) 161s; run: log: (pid 545) 290s
run: postgresql: (pid 361) 317s; run: log: (pid 360) 317s
run: prometheus: (pid 661) 166s; run: log: (pid 465) 302s
run: puma: (pid 354) 317s; run: log: (pid 353) 317s
run: redis: (pid 276) 324s; run: log: (pid 273) 324s
run: redis-exporter: (pid 653) 167s; run: log: (pid 429) 310s
run: sidekiq: (pid 365) 317s; run: log: (pid 364) 317s
run: sshd: (pid 33) 354s; run: log: (pid 32) 354s
默认gitlab会开启这么多的组件,它们的用处如下
- alertmanager:用于处理和管理 Prometheus 监控的告警。它负责接收告警信息并发送通知(例如邮件、Slack)。
- gitaly:Git 仓库的服务管理器,负责优化 Git 操作的性能。GitLab 使用 Gitaly 来高效处理仓库请求,如分支操作和合并请求。
- gitlab-exporter:用于导出 GitLab 的性能和健康数据,以便通过 Prometheus 进行监控。
- gitlab-kas:GitLab Kubernetes Agent Server (KAS) 服务,支持 GitLab 与 Kubernetes 集群的通信,用于 DevOps 管理和 CI/CD 集成。
- gitlab-workhorse:HTTP 服务器,用于处理来自客户端的请求(如文件上传/下载)并与 GitLab Rails 应用交互。
- logrotate:日志文件轮转工具,定期管理日志文件,防止日志占用过多的磁盘空间。
- nginx:Web 服务器和反向代理,将来自客户端的 HTTP 请求转发到 GitLab 工作进程(如 puma 和 gitlab-workhorse)。
- postgres-exporter:将 PostgreSQL 数据库的性能指标导出到 Prometheus,用于数据库监控。
- postgresql:GitLab 使用的 PostgreSQL 数据库,用于存储应用数据,如用户信息、项目和配置等。
- prometheus:监控和告警系统,收集 GitLab 和其组件的性能指标,并存储和显示相关监控信息。
- puma:Rails 应用服务器,运行 GitLab 的核心应用逻辑,处理所有核心业务逻辑和 API 请求。
- redis:内存数据库,GitLab 使用 Redis 存储缓存、会话数据和队列任务。
- redis-exporter:导出 Redis 的监控指标到 Prometheus,以监控 Redis 的状态。
- sidekiq:后台任务处理服务,GitLab 使用它来处理异步任务,如发送通知、执行计划任务等。
- sshd:GitLab 的 SSH 服务,使用户可以通过 SSH 协议进行 Git 仓库操作(如推送和克隆),提高数据传输的安全性。
对于个人来说,alertmanager、gitlab-exporter、gitlab-kas、postgres-exporter、prometheus、redis-exporter可以说是基本用不到基本都是监控相关的组件,然后gitlab-kas是用来对接k8s的,如果用不到这个功能也完全可以关闭,还有就是如果本地环境有redis和postgresql,这俩组件也完全也可移除。
对于生产环境,可以根据上面所写的组件作用来做移除,如果是一些小型企业我感觉这些组件基本上也用不到,开着就是吃内存。下面开始移除组件
编辑gitlab.rb
配置文件,主要是做下面更改
# 关闭alertmanager组件,这条配置大概是再2423行,默认是注释的,他的默认值为true
alertmanager['enable'] = false
# 关闭gitlab_exporter组件,这条配置大概率是在2536行,默认是注释的,他的默认值为true
gitlab_exporter['enable'] = false
# 关闭gitlab_kas组件,这条配置大概率是在2152行,默认是注释的,他的默认值是true
gitlab_kas['enable'] = false
# 关闭postgres_exporter组件,大概在2497行,默认是注释的,默认值是true
postgres_exporter['enable'] = false
# 关闭redis-exporter组件,大概率是在2472行,默认是注释的,默认值是true
redis_exporter['enable'] = false
# 关闭prometheus组件,大概率是在2576行,默认是注释的,默认值是true
prometheus_monitoring['enable'] = false
配置调优
在配置种还有不少线程、内存相关的配置,可以参考下面进行修改
# 在1303行有一段下面的配置,他默认值是20,他是sidekiq组件的并发数,因为我是个人使用,我这里依次改成15、10、5发现区别不大,我这里直接用5了,可以根据个人环境来调试
sidekiq['concurrency'] = 5
# 在1419行,有一个postgresql的缓存,这个默认是256MB,我这里直接改成64MB了
postgresql['shared_buffers'] = "64MB"
# 在1506行,有一个postgresql的线程数量,它默认为8,我这里改成4了
postgresql['max_worker_processes'] = 4
# 在1271行,有一个Puma线程最大占用,默认使1024,这里修改成256
puma['per_worker_max_memory_mb'] = 256
# 在2543行有一段gitlab_exporter组件的配置,默认是true,给他改成false
gitlab_exporter['enable'] = false
# 然后再1243有这么几段配置,它们分别代表工作进程数,然后工作进程的线程池大小
# 默认是2个工作进程最小4最大4,算下来就是8个线程,这里进行修改
puma['worker_processes'] = 2
puma['min_threads'] = 1
puma['max_threads'] = 2
外置数据库
如果要用外置存储数据库,则可以参考修改下面配置
postgresql['enable'] = false
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = "gitlab"
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "passwd"
gitlab_rails['db_host'] = "databases.workstation.boychai.xyz"
要注意的是,尽量修改配置,而不是增加配置
外置缓存
如果要用外置Reids缓存,则可以参考修改下面配置
redis['enable'] = false
gitlab_rails['redis_host'] = "databases.workstation.boychai.xyz"
gitlab_rails['redis_password'] = "passwd"
# 这个是redis的命名空间
gitlab_rails['redis_database'] = 1
要注意的是,尽量修改配置,而不是增加配置
加载配置
我当前配置如下
[root@localhost config]# cat gitlab.rb |grep -Ev "^#|^$"
external_url '......'
puma['worker_processes'] = 2
puma['min_threads'] = 1
puma['max_threads'] = 2
puma['per_worker_max_memory_mb'] = 256
sidekiq['concurrency'] = 5
postgresql['shared_buffers'] = "64MB"
postgresql['max_worker_processes'] = 2
gitlab_kas['enable'] = false
alertmanager['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitlab_exporter['enable'] = false
prometheus_monitoring['enable'] = false
执行gitlab-ctl reconfigure
命令进行重载配置,然后直接重启容器
root@gitlab:/# gitlab-ctl reconfigure
......
[2024-11-11T13:17:13+00:00] INFO: Running report handlers
Running handlers complete
[2024-11-11T13:17:13+00:00] INFO: Report handlers complete
Infra Phase complete, 5/633 resources updated in 38 seconds
gitlab Reconfigured!
root@gitlab:/# gitlab-ctl restart
ok: run: gitaly: (pid 1766) 0s
ok: run: gitlab-workhorse: (pid 1773) 0s
ok: run: logrotate: (pid 1798) 1s
ok: run: nginx: (pid 1806) 0s
ok: run: postgresql: (pid 1820) 0s
ok: run: puma: (pid 1847) 0s
ok: run: redis: (pid 1852) 0s
ok: run: sidekiq: (pid 1864) 0s
ok: run: sshd: (pid 1893) 0s
再次执行gitlab-ctl status
查看组件状态
root@gitlab:/# gitlab-ctl status
run: gitaly: (pid 1931) 180s; run: log: (pid 332) 726s
run: gitlab-workhorse: (pid 1942) 180s; run: log: (pid 437) 714s
run: logrotate: (pid 1961) 180s; run: log: (pid 335) 726s
run: nginx: (pid 1968) 179s; run: log: (pid 435) 714s
run: postgresql: (pid 1984) 179s; run: log: (pid 432) 714s
run: puma: (pid 1988) 178s; run: log: (pid 436) 714s
run: redis: (pid 2007) 178s; run: log: (pid 330) 726s
run: sidekiq: (pid 2016) 176s; run: log: (pid 433) 714s
run: sshd: (pid 2499) 0s; run: log: (pid 40) 756s
再次查看占用,这里是因为刚启动稳定在内存剩余2000m了,具体调优的方式可以参考本文,实际这个占用算式较低的了..
外置数据环境
在我本地K8s环境中,配置如下
[root@control service-gitlab-config-pvc-362bde8b-f3d4-405f-8c00-683815f92fe0]# cat gitlab.rb |grep -Ev "^#|^$"
external_url 'xxxxxx'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "xxxxxx"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxxxx"
gitlab_rails['smtp_password'] = "xxxxxx"
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'coding@boychai.xyz'
gitlab_rails['gitlab_email_display_name'] = 'Codeing'
gitlab_rails['gitlab_email_reply_to'] = 'admin@boychai.xyz'
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = "gitlab"
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "xxxxxxx"
gitlab_rails['db_host'] = "xxxxxxx"
gitlab_rails['redis_host'] = "xxxxxxx"
gitlab_rails['redis_password'] = "xxxxxxx"
gitlab_rails['redis_database'] = 1
puma['per_worker_max_memory_mb'] = 256
sidekiq['enable'] = true
sidekiq['concurrency'] = 5
postgresql['enable'] = false
postgresql['shared_buffers'] = "64MB"
postgresql['max_worker_processes'] = 4
redis['enable'] = false
logrotate['enable'] = true
gitlab_kas['enable'] = false
prometheus['enable'] = false
alertmanager['enable'] = false
gitlab_exporter['listen_address'] = '0.0.0.0'
patroni['postgresql']['max_worker_processes'] = 4
在我本地K8s环境中,启动的组件如下
root@gitlab-cb5f6f764-6vhhz:/# gitlab-ctl status
run: gitaly: (pid 265) 1471577s; run: log: (pid 293) 1471576s
run: gitlab-exporter: (pid 455) 1471545s; run: log: (pid 401) 1471546s
run: gitlab-workhorse: (pid 440) 1471545s; run: log: (pid 349) 1471558s
run: logrotate: (pid 562714) 2656s; run: log: (pid 562722) 2655s
run: nginx: (pid 369) 1471553s; run: log: (pid 383) 1471552s
run: puma: (pid 300) 1471571s; run: log: (pid 307) 1471570s
run: sidekiq: (pid 312) 1471565s; run: log: (pid 320) 1471564s
run: sshd: (pid 35) 1471588s; run: log: (pid 34) 1471588s
我的缓存和数据库都是外置的,然后开了一个gitlab的exporter,他的内存占用还算比较稳定,可以参考下面输出
[root@node1 ~]# kubectl top pod -A|grep gitlab
service gitlab-cb5f6f764-6vhhz 22m 3804Mi
在外部的Prometheus中也可以通过k8s的cAdvisor组件来查询pod的内存占用
container_memory_usage_bytes{namespace="service", pod="gitlab-cb5f6f764-6vhhz", container="gitlab"}
我这里占用还算比较平稳。
6 条评论
感谢大佬分享,解决问题了
大佬的邮箱通知好了吗?我的邮箱通知现在正常了
没呢,大佬教教我
我也没啥操作,就是昨天一试,它就有通知了,之前试的时候,也是没看到通知
好吧 我再试试