博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每日一道shell练习(03)
阅读量:6554 次
发布时间:2019-06-24

本文共 813 字,大约阅读时间需要 2 分钟。

1 . 习题

写一个脚本计算linux系统所有进程占用内存大小的和

2. 习题分析

2.1.第一个问题,在哪里收集进程的数据

用top或者ps都可以获取每个进程的内存使用大小。获得大小之后,就可以通过一个循环计算它们的和了。

2.2. ps 命令的问题

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

2.3. 应该如何获取正确的使用内存

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

3. 习题答案

grep  Pss  /proc/[0-9]*/smaps | awk '{sum+=$2};END{print sum}'69275

【分析】

  1. grep 命令可以遍历目录里的文件,然后将符合匹配字符的行抓取出来;
  2. awk 命令遍历grep 输出的结果,统计进程使用内存的和。
  3. 在 /proc 目录下,有很多和进程有关的数据,读者可以自己去研究一下。

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

转载于:https://blog.51cto.com/hellocjq/2096807

你可能感兴趣的文章
JS仿FLASH特效可跳转回首页的CSS二级联动菜单
查看>>
页面导入样式时,使用link和@import有什么区别?
查看>>
类成员与类的实例成员
查看>>
Spark源码编译并在YARN上运行WordCount实例
查看>>
Spring AOP + AspectJ annotation example
查看>>
Spring VS EJB 3 的若干认识误区(转)
查看>>
数据归一化和两种常用的归一化方法
查看>>
React.js初探(一)
查看>>
Neo4j CQL -(17)- NULL值
查看>>
BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057
查看>>
json_encode后的中文不编码成unicode
查看>>
iOS 导航栏title显示右偏移
查看>>
字符串处理 2015百度之星资格赛 1002 列变位法解密
查看>>
修改纵断面图标注栏
查看>>
Linux 杂记
查看>>
Flex创建带有空间信息的椭圆(Polygon)
查看>>
【转】参照protobuf,将json数据转换成二进制在网络中传输。
查看>>
wpf 输入停止一段时间后。执行事件
查看>>
享元模式
查看>>
Python中的str与bytes之间的转换的三种方法
查看>>