石家莊做網(wǎng)站最好的公司有哪些搜狗收錄入口
文章目錄
- 問(wèn)題描述
- 原因分析
- 分析1
- 分析2
- 驗(yàn)證猜想
- 結(jié)論和經(jīng)驗(yàn)
問(wèn)題描述
運(yùn)維新增對(duì)某服務(wù)的監(jiān)控后發(fā)現(xiàn):內(nèi)存不斷上漲的現(xiàn)象。進(jìn)一步確認(rèn),是因?yàn)橛卸鄠€(gè)導(dǎo)出日志操作導(dǎo)致的內(nèi)存上漲問(wèn)題。
進(jìn)一步的測(cè)試得出的結(jié)果是:容器剛啟動(dòng)是占用內(nèi)存約為50M左右,在多次地導(dǎo)出日志操作后,內(nèi)存能漲到2G以上。
問(wèn)題:為什么日志導(dǎo)出會(huì)導(dǎo)致容器的內(nèi)存不斷上漲?
原因分析
分析1
在宿主機(jī)器中,使用docker stats 查看服務(wù),內(nèi)存占用內(nèi)存792MB
在docker 容器中,通過(guò)ps aux命令查看容器中使用的總內(nèi)存=29MB+147MB+139MB=315MB左右
使用kill命令殺死服務(wù)的workerman子進(jìn)程(父進(jìn)程不跑業(yè)務(wù),并且在容器中殺不死),可以看到:
- workerman子進(jìn)程重新拉起后內(nèi)存24MB+21MB=45MB,重新拉起后的進(jìn)程內(nèi)存占用減少239MB
- doker stats 內(nèi)存在kill后的內(nèi)存減少了229MB
猜測(cè):容器中只有wokerman的子進(jìn)程會(huì)在執(zhí)行導(dǎo)出后占用內(nèi)存,并且使用ps命令也沒(méi)有看到其他進(jìn)程。懷疑:容器本身存在緩存,并且docker stat命令查看的內(nèi)存值應(yīng)該包含這部分緩存的內(nèi)存。
分析2
使用docker stat查看容器的內(nèi)存使用為:666MB
在容器中,使用htop命令查看容器中各個(gè)進(jìn)程的總內(nèi)存約為:27MB+118MB+85MB = 230MB左右(包含部分的代碼緩存等)
在 /sys/fs/cgroup/memory/docker//memory.stat 中查看內(nèi)存情況
驗(yàn)證猜想
為了驗(yàn)證確實(shí)是 cache占用的內(nèi)存,我們手動(dòng)清理cache緩存驗(yàn)證一下,如下
運(yùn)行以下命令可以清理 PageCache:
- sudo sh -c “echo 1 > /proc/sys/vm/drop_caches” (這將清空 PageCache 中的緩存數(shù)據(jù),但不會(huì)影響正在使用的程序數(shù)據(jù)。)
可以看到,docker stats 的內(nèi)存也從 666.MB降到了182MB,和 /sys/fs/cgroup/memory/docker//memory.stat 中查看內(nèi)存情況基本一致。
結(jié)論和經(jīng)驗(yàn)
結(jié)論:不是代碼中的內(nèi)存泄露,是cache緩存占用的內(nèi)存。
經(jīng)驗(yàn):
ps aux
查看的RSS只包含了物理內(nèi)存,不包含buffer/cache
內(nèi)存- 使用docker stats 命令查看到的內(nèi)存數(shù)據(jù)不是實(shí)際上的物理內(nèi)存,而是包含了cache部分,使用該數(shù)據(jù)用于監(jiān)控不一定準(zhǔn)確。
- 從
/sys/fs/cgroup/memory/docker/<container-id>/memory.stat
可以看到docker容器實(shí)際的內(nèi)存使用情況(很有用!!) - 如有必要,可以使用
sudo sh -c "echo 1 > /proc/sys/vm/drop_caches"
釋放cache內(nèi)存