python统计httpd 进程的内存占

发布时间:2019-08-29 07:35:36编辑:auto阅读(1546)


    本文结构:

    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 有访问,占用的内存就会升高。


关键字