#JVM调优
#楔子
最近博主正在为一家创业公司从零开始架构微服务以及建立一套完善的DevOps流水线.
因为经费原因,公司前期并没有在局域网搭建测试环境,而是用阿里云ECS作为测试和未来的生产环境.
阿里云服务器内存有限(只有8个G),前期所有微服务都是部署到一台机器上进行测试,但是部署了7个服务后,发现内存没了…
以下是我已经部署的服务
- eureka 服务注册与发现
- config 分布式配置中心
- zipkin 分布式链路追踪
- zuul 分布式路由网关
- admin 分布式系统监控
- service-admin 管理员服务提供者
- api-admin 管理员服务消费者
然后…我的内存就只剩800M了
然后我下线一个服务提供者你们再感受下
一个服务1个G,我后面至少还要上至少8个服务啊
这个不是完蛋了个屁的吗?
所以想到了JVM调优,限制每个服务的堆内存大小(我算了下,前前后后加起来有15~21个服务),对于微服务来说,这真的很少了,并且这些服务只是这家公司蓝图的一个模块而已,最后完全开发完毕可能会上线150+个服务.
没错,这就是微服务,内存跟玩儿似的
#开始调优
首先我们需要计算下,按照16个服务计算,8G的内存最多只能给每个服务分配512M的内存,为了后期上线更多服务做准备,我们应当给每个服务分配400M左右内存(我快哭出来了)
经典设置
java -Xmx400m -Xms400m -Xmn150m -Xss1024k
简单说明下调优参数的值
- -Xmx400m 设置JVM最大内存为400M
- -Xms400m 设置JVM最小内存为400M(与最大值保持一致可以防止每次垃圾回收(GC)后JVM对内存进行再分配)
- -Xmn150m 设置新生代大小,新生代大小会影响到老年代的大小,Sun推荐设置为总内存的3/8
- -Xss1024k 每个线程堆栈大小,值越小能生成的线程数越多,但是一般不超过5000个,在递归场景下值太小可能会造成堆栈溢出
然后我们将分布式配置中心服务启动命令更新后重新上线,看看效果如何
修改Dockerfile
等待持续集成/部署
再次查看内存
一个服务省出了550M~600M的内存
查看400M能不能跑起来(要跑不起来就搞笑了)
可以看到Config服务已经在注册中心注册
分布式配置中心也能正常访问
#尾声
依照上面的操作,我将所有的服务JVM调优后重新上线,大家可以看看最终效果
相较于最开始的800M内存,我们比之前富余了2.4G内存,并且每个服务都能保证正常运行(见下图服务注册中心)
剩余的内存足够再上6~8个服务了,作为测试环境应该是足够了.
再不行就必须换服务器了.[手动滑稽脸]
–完--