缘起:
dubbo-monitor容器swap使用率超过 20% ,而且在不断上升,为什么呢?
下面是容器dubbo-monitor在drop-caches前后的对比:
1 2 3 4 5 6 7 8 |
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dubbo_monitor 6.25% 1.4 GiB / 2 GiB 69.99% 0 B / 0 B 6.306 GB / 54.5 GB 0 [root@CX-DOCKER-BASE-1-10.139.105.202 ~]# echo 3 > /proc/sys/vm/drop_caches [root@CX-DOCKER-BASE-1-10.139.105.202 ~]# docker stats dubbo_monitor CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dubbo_monitor 3.87% 595.7 MiB / 2 GiB 29.09% 0 B / 0 B 6.373 GB / 54.5 GB 0 |
drop-cache后,容器的swap使用率没有变化
结论:
- docker stats 显示的内存使用是包含cache的
该容器的部分cache信息会被swap出内存cache和swap之间存在一些不默契;cache认为内存够多,还可以cache更多信息;swap机制为,经内存充裕,只要是不常被访问的内存数据,尽量swap出来; 于是乎,就形成了一个恶性循环,导致swap占用越来越大解决办法: 定期drop一下cache
- 系统不会傻到把cache内容换出到swap中的,swap确实为进程使用的(虚拟)内存的一部分
- 一个允许最大使用2g内存的java进程,swap出来500m或1g不足为奇,如果给他的swap大小为2g的话,占用50%的swap都有可能