linux下进程的内存占用分析及异常占用清理缓存【测试成功】

艺帆风顺 发布于 2025-04-03 27 次阅读


一、linux 查看进程的内存占用

cat /proc/pid/status    命令查看内存

VmPeak: 表示进程所占用最大虚拟内存大小
VmSize: 表示进程当前虚拟内存大小
VmLck: 表示被锁定的内存大小
VmHWM: 表示进程所占用物理内存的峰值
VmRSS: 表示进程当前占用物理内存的大小(与procrank中的RSS)
VmData: 表示进程数据段的大小
VmStk: 表示进程堆栈段的大小
VmExe: 表示进程代码的大小
VmLib: 表示进程所使用共享库的大小
VmPTE: 表示进程页表项的大小

top 命令下的内存占用分析

二、清理系统缓存

  • VIRT:Virtual memory Size 虚拟内存
    1、虚拟耗用内存(包含共享库占用的内存),即单个进程全部可访问的地址空间,其大小可能包括还尚未在内存中驻留的部分。
    2、进程需要的虚拟内存大小,包括进程使用的库、代码、数据等
    3、 VIRT是申请的虚拟内存总量,VIRT=SWAP+RES

  • SWAP :进程使用的虚拟内存中,被换出的大小

  • RES:resident memory size 常驻内存
    1、实际使用物理内存(包含共享库占用的内存),即单个进程实际占用的内存大小,RES不太准确的地方在于它包括该进程所使用共享库全部内存大小
    2、进程使用的、未被换出的物理内存大小,RES=CODE+DATA+HEAP

  • SHR:shared memory 共享内存
    1、除了自身进程的共享内存,也包括其他进程的共享内存
    2、映射到文件里可能被其他进程共享的内存

    在linux中, 可以通过对/proc/sys/vm/drop_caches设置不同的数值,从而实现不同内容的回收,从linux官方文档中可以看到:

释放物理页缓存

    echo 1 > /proc/sys/vm/drop_caches释放可回收的slab对象,包含inode and dentryecho 2 > /proc/sys/vm/drop_caches同时释放 页、目录、索引节点缓存:echo 3 > /proc/sys/vm/drop_caches

    操作影响

    1. 上述操作是无害的操作,并且智慧释放完全没有使用的内存对象。脏对象(dirty objects)将继续被使用直到它们被写入到磁盘中,所以内存脏对象不会被释放。

    2. 如果在执行drop_caches之前执行sync指令,则会将脏对象刷新到磁盘中,这样drop_caches操作会释放出更多内存。

    3. 回收内存过程中可能会导致cpu和io比较高,也可以在进程运行过程中进行回收,但是更多的建议在停止进程后回收,影响较小。

    注意:drop_caches需要花费一些时间(在终端中可以看到大约几十秒时间),此时再次使用cat /proc/buddyinfo可以看到立即出现了大量高阶内存页。

    但是drop_caches这个触发动作是一次性的,也就是说,并不因为cat /proc/sys/vm/drop_caches时显示输出内容是3就表示系统不缓存内容。相反,一旦完成drop_caches,系统立即自动对后续内存对象进行缓存。所以要再次触发缓存清理,需要再次执行 echo 3 > /proc/sys/vm/drop_caches。

    建议操作为:sync && echo 2 > /proc/sys/vm/drop_caches

    三、加入定时优化脚本

    vim /usr/local/sh/clean-ram.sh

      #!/bin/bashsync && echo 2 > /proc/sys/vm/drop_caches

      加入crontab定时任务:

      0 2 * * * /usr/local/sh/clean-ram.sh
        版权声明:本文内容来自简书:小灰灰1999 & CDSN:Bigtime007;,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。原文链接:https://www.jianshu.com/p/6ad6bf1c2123https://blog.csdn.net/BigTime_IOT/article/details/128605181如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。