尝试把大型程序挤进小内存服务器

今天受委托为一个新服务器安装gitlab与nexus。由于对两个程序不熟悉,所以我很大意,没有检查服务器配置,这也为后面踩坑埋下伏笔。

由于使用docker,所以安装这一步十分轻松。上网搜了安装教程,很快就把两个镜像拉下来,准备docker run 了。

运行gitlab容器,浏览器访问成功。再运行nexus,结果出事了,访问不到。

docker ps -a查看容器状态,nexus不断处于restart中。这个原因很好发现,我的docker run的命令里有 --restart=always,当然一直尝试重启。看来nexus启动失败。

于是docker logs查看nexus启动日志,发现报了OOM错误,也就是内存不够了。

我这才意识到问题,free -h命令查看内存使用,一看吓一跳,原本机器就3.6G的内存,光gitlab就占了3GB了。

既然不能换更好的机器,只能硬着头皮想办法调优。

配置gitlab,降低内存需求 

首先找了gitlab设置教程,把能改的基本都改到最低了:unicorn,postgresql,sidekiq,设置参数都调到最小了。再重新运行,内存只是稍微降下来点,2.5GB。

这样就勉强留出1GB空间给nexus。于是尝试启动nexus,仍然失败,内存依旧不够。

设置运行内存限制,试探内存真实需求

gitlab的内存需求基本稳定在2.5GB。接下来就想试出nexus的内存需求。关闭gitlab,直接运行nexus,稳定运行一段时间后,内存需求约0.8GB。

然而,如果在docker启动命令加上 -m 1024MB,也就是给nexus容器加上1GB的内存限制,却启动不了了。这说明nexus启动时需要比运行时更大的内存。

上网搜索,得知nexus需要2GB的启动内存。修改docker命令后,确实成功启动。

于是就想着能否先启动nexus,待运行稳定了,只占1GB,随后启动gitlab。这样勉勉强强挤进3.6GB。

尝试的结果仍然是失败的。nexus启动后,再启动gitlab时,就直接报内存不足了。

使用top命令查看内存使用,发现对nexus的内存限制,实际上体现在MEM USAGE后的LIMIT上。

我猜测,尽管LIMIT限制最大内存,但也确实为程序分配了这么大的空间,其他程序是不能占用的。

 

 

尝试使用虚拟内存

内存硬性条件不足 ,就考虑用虚拟内存凑活,也就是linux交换文件。查看了这篇文章后,创建了4GB的交换文件。

给gitlab限制了3GB内存,nexus 2GB,总计5GB,超过3.6GB的限制的部分自动使用虚拟内存,再运行,两个程序总算都启动成功了。

短暂的成功

启动成功后约半小时,gitlab页面便无法访问了。

top命令查看内存,gitlab的实际使用内存已经达3GB限制的99%;nexus则是1GB。

按照创建交换文件的文章中的推荐,swapfile的优先度只设为10,但swap空间还是用了不少:总计4GB内存里有1GB是swap。

我推测是内存使用达到上限,再分配的都是虚拟内存,而磁盘读写速度太慢,导致程序卡顿。

申请新硬件

程序内存配置也到了极限,虚拟内存也没用,这下真的没办法了。

向公司反映了实际情况,以及我的尝试。于是申请到了更好的硬件。

最终,两个程序稳定运行,gitlab占3GB,nexus 2GB。尽管只比之前分配的多用了1GB,但这1GB如果用虚拟内存实现,就会成为运行速度的瓶颈。

 

posted @ 2021-04-12 11:43  lpjworkroom  阅读(107)  评论(0编辑  收藏  举报