gitlab内存消耗大,频繁出现502错误的解决办法
首先说明笔者的服务器环境,阿里云服务器:8G内存,2核。自从团队运维小伙伴搭建了gitlab之后,git push 代码时不时的就很卡,也经常出现 gitlab 反应超时——返回502错误,严重阻塞了团队项目的开发,伤心!
转载请注明出处: https://www.cnblogs.com/NaughtyCat/p/gitlab-eat-too-much-memory-and-response-with-502-error.html
SSH登上服务器,我去,卡的不要不要的,top 命令一看,内存只有不到125M。在top -d 3(每3秒刷新一次)模式下,按住 shift + m (以内存排序), 内存和cpu使用情况如下图:
CPU还是有很多空闲的,内存所剩不多,USER为 git和gitlab-+的全是gitlab的东东,gitlab内存占比超过%35,而且随着时间推移,如5小时后,free memory 持续减少,buff/cache 持续增加【CoderBaby】,on my god!
慌不要慌,淡定。我有上网法宝,我怕谁,一通google,答案了然于胸。
基本方略,改配置文件(/etc/gitlab/gitlab.rb ),配置文件生效(gitlab-ctl reconfigure),重启(gitlab-ctl restart)
1)unicorn改小进程数,及内存占用
unicorn['worker_processes'] = 2
unicorn['worker_memory_limit_min'] = "300 * 1 << 20" unicorn['worker_memory_limit_max'] = "500 * 1 << 20"
注:
a. gitlab有很多组件,部分组件有memory leak — 内存泄露,gitlab 搞了个 unicorn-worker-killer,会自动丢弃(drop)那些崩溃了且没有用户请求的worker,关于Unicorn and unicorn-worker-killer,详情参见:
https://docs.gitlab.com/ee/administration/operations/unicorn.html
b. ps aux|grep unicorn|wc -l 【查看unicorn进程数,一看原来默认有9个】
c. unicorn['worker_processes'] 至少得有2个,推荐: (CPU cores * 1.5) + 1 = Unicorn workers
2)其它修改
sidekiq['concurrency'] = 4
prometheus_monitoring['enable'] = false
postgresql['shared_buffers'] = 256M 【postgresql内存改小】
3)linux kernal swap调整到适当比例
配置文件:/etc/sysctl.conf ,修改: vm.swappiness =
10
,使其生效:重启,或者通过 sysctl vm.swappiness=10 使其运行时生效
跑了一天,gitlab运行正常,内存已始终有1.7G空闲,开心
4) 如果跑了几天,top命令看到buff/cache越来越大,空闲内存越来越少,可通过如下命令【终极解决方案】:
- 释放page cache:
echo 1 > /proc/sys/vm/drop_caches
- 释放 dentries 和 inodes:
echo 2 > /proc/sys/vm/drop_caches
- 一起搞
echo 3 > /proc/sys/vm/drop_caches 或者 free && sync && echo 3 > /proc/sys/vm/drop_caches && free
运行【一月后】,一起正常,开心鸭
注:
- gitlab配置说明【至少要2 core, 8G RAM】:https://gitlab.com/gitlab-org/gitlab-foss/blob/master/doc/install/requirements.md
- 设置kernal swapping: https://askubuntu.com/questions/103915/how-do-i-configure-swappiness/103916#103916
- buff/cache 内存释放: https://unix.stackexchange.com/questions/415814/memory-runs-full-over-time-high-buffer-cache-usage-low-available-memor
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
*******************************************************************************************
精力有限,想法太多,专注做好一件事就行
- 我只是一个程序猿。5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
- 写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事
*******************************************************************************************
- 前端特效制作 | CSS3圆形风格面包屑导航
- CSS3 倒影
- 写一只具有识别能力的图片爬虫
- 【今日问题】变量未初始化引起的崩溃
- 前端特效开发 | 点击查看大图相册效果
- 开发 | 星际争霸2人工智能研究环境 SC2LE 初体验
- 开发 | 我做了12万条的影评分析,告诉你《战狼Ⅱ》都在说些啥
- JavaScript | 函数定义的两种方法;预编译与执行
- jQuery特效 | 导航底部横线跟随鼠标缓动
- JavaScript | 选中并获取多行文本框内容的效果
- JavaScript | 动画显示比例的投票效果
- 原生JS | 作用域
- 腾讯、网易、新浪新闻网站爬虫编写记录及评论格式分析
- 原生JS | 随机抽取不重复的数组元素 —— 有没有更好的方法?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法