发布时间:2019-08-29 07:35:36编辑:auto阅读(1546)
本文结构:
介绍用命令行如何统计内存占用百分比
介绍用python 如何通过读取进程文件,统计进程的内存总大小,然后计算占系统内存的百分比
第一部分:
在linux 下,统计apache 进程的内存使用百分比,有很多方法:
使用命令将所有apache 的进程进行统计,然后相加,然后和系统的物理内存相除,求百分比。
1. 例如,用"ps -e "命令就可以看到所有进程的详细信息:
如图,"ps aux" 命令输出的第六个字段就是某个进程所占的物理内存,单位是KB.然后就可以将需要的apache 进程过滤出来,统计。
最后,用free 就可以看到系统的总内存:
第二部分:
2. 如果使用python 那么可以怎么实现?可以通过读取文件,获取各个apache 进程的VmRSS(物理内存)大小,以及系统的总内存。
2.1 通过什么文件查看进程占用内存的信息?
在"/proc" 目录下,那些数字目录,就是代表系统中的一个进程号的目录,该进程的状态都在这个目录下:
例如进入29845进程的目录,29845 这个进程的状态信息都可以在status 这个文件查看:
然后,打开/proc/29845/status 文件:
如上图,VmRSS 这行就是内存大小。
2.2 如何获取所有apache 的进程id号?
因为apache 通常都会fork 很多的子进程,这些子进程都会占用内存。linux下有这样一个命令"pidof".如果想查看系统里所有httpd 进程的pid 号,可以执行"pidof httpd", 发现它和"ps aux|grep httpd" 命令统计的pid号是一样的:
2.3 知道了apache 的pid 号,还有在什么文件查看内存使用情况,就可以写python 脚本了,先统计所有的pid号:
#!/usr/bin/env python """filename: 10_httpd.py""" from subprocess import Popen, PIPE # 因为要执行linux 的命令,需要使用subprocess 模块 """定义一个函数,用于获取所有的httpd 的pid号""" def getPid(): p = Popen(["pidof", "httpd"], stdout=PIPE, stderr=PIPE) pids = p.stdout.read().split() #通过管道,读出的结果是字符串,然后用split分割,保存在一个list return pids if __name__ == "__main__" : print getPid()
先测试一下,执行python 10_httpd.py,输出的结果,如图,输出了全部httpd 的pid 号。
继续完善脚本,统计所有httpd 的内存,需要通过/proc/pid/status 文件:
#!/usr/bin/env python """filename: 10_httpd.py""" from subprocess import Popen, PIPE # 因为要执行linux 的命令,需要使用subprocess 模块 import os """定义一个函数,用于获取所有的httpd 的pid号""" def getPid(): p = Popen(["pidof", "httpd"], stdout=PIPE, stderr=PIPE) pids = p.stdout.read().split() #通过管道,读出的结果是字符串,然后用split分割,保存在一个list return pids """ 定义一个函数,统计所有httpd 进程的内存 参数:pids 是getPid() 返回的列表 """ def parsePidFile(pids): sum = 0 for i in pids: fn = os.path.join('/proc', i, 'status') #返回status文件的绝对路径 with open(fn) as fd: for line in fd: if line.startswith('VmRSS'): #遍历文件,找到以"VmRSS"开头的行 mem = int(line.split()[1]) #以空格分割,返回第二部分,内存数 sum += mem break return sum """ 函数,打开"/proc/meminfo",获取总的内存 """ def total_mem(fn): with open(fn) as fd: for line in fd: if line.startswith("MemTotal"): total_memory = int(line.split()[1]) return total_memory if __name__ == "__main__" : pids = getPid() sum_mem = parsePidFile(pids) total_memory = total_mem("/proc/meminfo") print "Httpd sum memory is: %s KB" % sum_mem print "Mmeory percent: %.2f%%" % ((sum_mem/float(total_memory))*100)
测试一下,执行 python 10_httpd.py, 输出的结果:
2.4 测试
安装一个elinks 工具,访问apache 看看内存百分比是否会增高,
yum install elinks
用elinks 访问,模拟测试都是在本机进行:
elinks http://localhost
然后再运行python 10_httpd.py, 输出结果:
只要,apache 有访问,占用的内存就会升高。
上一篇: python 错误处理:try..exc
下一篇: python3.5操作office Ex
47880
46445
37333
34773
29346
26008
24960
19978
19580
18074
5821°
6449°
5962°
5988°
7093°
5937°
5979°
6472°
6435°
7818°