本文结构:

  1. 介绍用命令行如何统计内存占用百分比

  2. 介绍用python 如何通过读取进程文件,统计进程的内存总大小,然后计算占系统内存的百分比


第一部分:

在linux 下,统计apache 进程的内存使用百分比,有很多方法:

使用命令将所有apache 的进程进行统计,然后相加,然后和系统的物理内存相除,求百分比。

1. 例如,用"ps   -e "命令就可以看到所有进程的详细信息:

wKiom1gIz-6xNeagAAB5e528rcA370.png如图,"ps   aux" 命令输出的第六个字段就是某个进程所占的物理内存,单位是KB.然后就可以将需要的apache 进程过滤出来,统计。


最后,用free 就可以看到系统的总内存:

wKiom1gI0TjiGyz2AAA15CrGyes213.png


第二部分:

2. 如果使用python 那么可以怎么实现?可以通过读取文件,获取各个apache 进程的VmRSS(物理内存)大小,以及系统的总内存。


2.1 通过什么文件查看进程占用内存的信息?

在"/proc" 目录下,那些数字目录,就是代表系统中的一个进程号的目录,该进程的状态都在这个目录下:

wKiom1gI0iWRNq8XAADp0YnK0bs487.png

例如进入29845进程的目录,29845 这个进程的状态信息都可以在status 这个文件查看:

wKiom1gI1aLBgfa9AABSQ8hoH3Y935.png

然后,打开/proc/29845/status 文件:

wKioL1gI1m6A5a1TAACBMfS9Fn4576.png

如上图,VmRSS 这行就是内存大小。


2.2 如何获取所有apache 的进程id号?

因为apache 通常都会fork 很多的子进程,这些子进程都会占用内存。linux下有这样一个命令"pidof".如果想查看系统里所有httpd 进程的pid 号,可以执行"pidof  httpd", 发现它和"ps aux|grep httpd" 命令统计的pid号是一样的:

wKiom1gI2O2h1ON1AACzD7aK5_0445.png

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 号。

wKioL1gI24iTxjMqAAAfYNv_zSA979.png

继续完善脚本,统计所有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, 输出的结果:

wKioL1gI79HwYwPSAAAdvf7p6Y4432.png



2.4 测试

安装一个elinks 工具,访问apache 看看内存百分比是否会增高,

yum install elinks

用elinks 访问,模拟测试都是在本机进行:

elinks   http://localhost

然后再运行python 10_httpd.py, 输出结果:

wKioL1gI8VvzYgOmAAAdGduZrXs080.png

只要,apache 有访问,占用的内存就会升高。