linux进程内存占用情况统计

来源:互联网 发布:看门狗2重要数据 编辑:程序博客网 时间:2024/05/05 20:09

free查看整体情况

[root@server01 work]# free -k         total       used       free     shared    buffers     cachedMem:      12201292   12055948     145344          0     246852    6433528-/+ buffers/cache:    5375568    6825724Swap:     12582904     886884   11696020

top查看进行情况

[root@server01 work]# toptop - 17:54:51 up 435 days,  6:29,  1 user,  load average: 0.22, 0.36, 0.32Tasks: 192 total,   1 running, 191 sleeping,   0 stopped,   0 zombieCpu(s):  2.9%us,  3.0%sy,  2.0%ni, 88.2%id,  0.0%wa,  0.0%hi,  0.7%si,  3.2%stMem:  12201292k total, 12034188k used,   167104k free,   250704k buffersSwap: 12582904k total,   886908k used, 11695996k free,  6404224k cached  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                        12988 work      20   0 6863m 1.5g 7812 S  1.0 13.0   3534:08 java                                                                                                                            15854 work      20   0 4588m 666m  11m S  1.0  5.6  44:57.38 java                                                                                                                            27347 work      20   0 4604m 664m  11m S  6.0  5.6  59:33.96 java                                                                                                                             8441 work      20   0 4588m 638m 7680 S  1.3  5.4 160:13.87 java                                                                                                                            31517 work      20   0 6567m 541m 7616 S  0.3  4.5  16:39.00 java                                                                                                                            12619 work      20   0 7260m 347m 4756 S  5.6  2.9   4440:26 mysqld

PR:进程的优先级别,越小越优先被执行
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称

ps命令

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'  其中rsz是是实际内存ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep java |  sort -nrk5其中rsz为实际内存,按内存排序,由大到小

统计当前所有进程占用的内存

使用ps命令统计

通常,很多用户会使用如下ps命令进行统计

ps aux | awk '{mem += $6} END {print mem/1024/1024}'

但是,这里存在一个问题是,free没有专门统计另一项缓存: Slab。所以上述ps命令统计的结果与free展示的结果存在较大出入。

Slab Allocation是Linux 2.2之后引入的一个内存管理机制,专门用于缓存内核的数据对象,可以理解为一个内核专用的对象池,可以提高系统性能并减少内存碎片。(Linux 2.6.23之后,SLUB成为了默认的allocator)。可查看meminfo文件了解slab信息。

cat /proc/meminfo | grep Slab

统计/proc/进程id/smaps

很多人通过累加 “ps aux” 命令显示的 RSS 列来统计全部进程总共占用的物理内存大小,这是不对的。RSS(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方法会重复计算共享内存,得到的结果是偏大的。

正确的方法是累加 /proc/[1-9]*/smaps 中的 Pss 。/proc//smaps 包含了进程的每一个内存映射的统计值,详见proc(5)的手册页。Pss(Proportional Set Size)把共享内存的Rss进行了平均分摊,比如某一块100MB的内存被10个进程共享,那么每个进程就摊到10MB。这样,累加Pss就不会导致共享内存被重复计算了。

命令如下:

grep Pss /proc/[1-9]*/smaps | awk ‘{total+=$2}; END {print total}’

需要注意的是,全部进程占用的内存并不等于 free 命令所显示的 “used memory”,因为“used memory”不仅包含了进程所占用的内存,还包含cache/buffer以及kernel动态分配的内存等等。

调整系统内存管理

/etc/sysctl.conf里有几个对内存管理影响比较大的配置,以下配置项的文档见vm.txt。

vm.vfs_cache_pressure

系统在进行内存回收时,会先回收page cache, inode cache, dentry cache和swap cache。vfs_cache_pressure越大,每次回收时,inode cache和dentry cache所占比例越大。

vfs_cache_pressure默认是100,值越大inode cache和dentry cache的回收速度会越快,越小则回收越慢,为0的时候完全不回收(OOM)。

linux kernel VFS layer

参考资料

内存问题排查

0 0
原创粉丝点击