本文结构:
介绍用命令行如何统计内存占用百分比
介绍用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 有访问,占用的内存就会升高。
转载于:https://blog.51cto.com/hellocjq/1864082