前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python统计httpd 进程的内存占

python统计httpd 进程的内存占

作者头像
py3study
发布2020-01-10 17:10:55
1.3K0
发布2020-01-10 17:10:55
举报
文章被收录于专栏:python3python3

本文结构:

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

第一部分:

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

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

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

wKiom1gIz-6xNeagAAB5e528rcA370.png
wKiom1gIz-6xNeagAAB5e528rcA370.png

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

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

wKiom1gI0TjiGyz2AAA15CrGyes213.png
wKiom1gI0TjiGyz2AAA15CrGyes213.png

第二部分:

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

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

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

wKiom1gI0iWRNq8XAADp0YnK0bs487.png
wKiom1gI0iWRNq8XAADp0YnK0bs487.png

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

wKiom1gI1aLBgfa9AABSQ8hoH3Y935.png
wKiom1gI1aLBgfa9AABSQ8hoH3Y935.png

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

wKioL1gI1m6A5a1TAACBMfS9Fn4576.png
wKioL1gI1m6A5a1TAACBMfS9Fn4576.png

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

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

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

wKiom1gI2O2h1ON1AACzD7aK5_0445.png
wKiom1gI2O2h1ON1AACzD7aK5_0445.png

2.3 知道了apache 的pid 号,还有在什么文件查看内存使用情况,就可以写python 脚本了,先统计所有的pid号:

代码语言:javascript
复制
#!/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
wKioL1gI24iTxjMqAAAfYNv_zSA979.png

继续完善脚本,统计所有httpd 的内存,需要通过/proc/pid/status 文件:

代码语言:javascript
复制
#!/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
wKioL1gI79HwYwPSAAAdvf7p6Y4432.png

2.4 测试

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

yum install elinks

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

elinks   http://localhost

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

wKioL1gI8VvzYgOmAAAdGduZrXs080.png
wKioL1gI8VvzYgOmAAAdGduZrXs080.png

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档