返回顶部

docker服务多节点使用内存不一致的情况

docker服务多节点使用内存不一致的情况

背景

最近服务扩容节点出现服务内存使用不一致的情况,五个节点限制6G内存,总有一个内存节点使用特别高占用超过90%以上.

登录服务器查看发现内存使用即将超过限制内存

 

 分析

五台配置相同的服务,有单台老是内存跑高,告警的指标是通过docker  stats指标抓取【从总内存使用中减去缓存使用来报告内存使用情况】,因此需要关注堆栈的占用和内存相关因素。

 使用arthas查看堆栈使用率较正常

从而怀疑是内存页堆积过大,清除内存页发现各个服务占用内存一致,找到原因:服务打印日志过多导致内存页未释放占用内存

 解决方法

清除系统内存页

#清除页面缓存
echo 1 > /proc/sys/vm/drop_caches

#建议操作
sync && echo 1 > /proc/sys/vm/drop_caches


#释放页面缓存
echo 1 >/proc/sys/vm/drop_caches

#释放数据区和信息节点
echo 2 >/proc/sys/vm/drop_caches

#释放页面缓存、数据区和信息节点
echo 3 >/proc/sys/vm/drop_caches

#可通过计划任务优化使用
$ crontable -e
* */4 * * * flock -xn /tmp/process-clean.lock -c 'sync && echo 1 > /proc/sys/vm/drop_caches  &'

页面缓存介绍

In order to speed up operations and reduce disk I/O, the kernel usually does as much caching as it has memory. By design, pages containing cached data can be repurposed on-demand for other uses (e.g., apps). Repurposing memory for use in this way is no slower than claiming pristine untouched pages.

为了加速操作和减少磁盘输入输出,内核通常会尽可能多地缓存内存。根据设计,包含缓存数据的页面可以按需重新用于其他用途(例如,应用程序)。以这种方式重新调整内存的用途并不比要求原始的未接触页面慢。

Writing to /proc/sys/vm/drop_caches allows one to request the kernel immediately drop as much clean cached data as possible. "Clean" cached data is eligible for dropping. "Dirty" cached data needs to be written somewhere. Using vm.drop_caches will never trigger the kernel to drop dirty cache.

写入/proc/sys/VM/drop_caches允许用户请求内核立即丢弃尽可能多的干净缓存数据。

 

页缓存是一个相对独立的概念,其根本目的是为了加速对后端设备的IO效率,比如文件的读写。页缓存顾名思义是以页为单位的,在两个地方页缓存的作用比较明显: 1、在文件的读写中;2、在普通进程的匿名映射区操作中。

在文件的读写中,进程对一个文件发起读请求,如果没有对应的物理内存页,则内核处理程序首先在页缓存中查找,如果找到直接返回。如果没找到,那么再分配空间,把内容从文件读入内存,插入页缓存,并返回,这里读操作虽然是一个页面发生的未命中,但是很大程度上会读取多个连续页面到内存中,只不过返回调用指定页面,因为实际情况中,很少仅仅需要读取一个页面,这样后续如果在需要访问还是需要进行磁盘IO,磁盘寻道时间往往比读取时间还要长,为了提高IO效率,就有了上述的预读机制。

在普通进程的匿名映射中,比如进程申请的比较大的堆空间(大于128kb的都是利用MMAP映射的),这些空间的内容如果在一段时间内没被释放 且在一段时间内没被访问,则有可能被系统内存管理器交换到外存以腾出更多的物理内存空间。下次在进程访问该内容,根据页表查找发现物理页面不在内存,则需要调用缺页异常处理程序。异常处理程序判断该页时被换出到外存,那么首先也是在页缓存中找,如果找到就返回;否则,从交换分区或者交换文件中把对应的文件读入内存。这里所说的页缓存和1中描述的页缓存是一类缓存,但是并不是一个,1中的页缓存是文件系统相关的,在磁盘上对应着具体的文件;在页面回收的时候需要回写到磁盘即同步一下;而2中的页缓存其实是一种交换缓存,在页面回收的时候只能是换出到交换分区或者交换文件,不存在同步的操作。

参考链接

https://docs.docker.com/engine/reference/commandline/stats/

 

posted @ 2023-05-13 00:01  九尾cat  阅读(216)  评论(0编辑  收藏  举报