python学习笔记40-监控linux程序内存占用情况
以下代码, 通过读取/proc/pid/status文件,获取{pid}/status文件, 获取pid/status文件,获取{pid}对应的程序对内存的使用情况.import os import re def get_mem_size(s_pid): _dict dict() filename f/proc/{s_pid}/status #这个文件存储了该pid运行时的内存等情况 fin open(filename, r) for line in fin: _o_match_vmpeak re.match(r^\s*VmPeak\s*:\s*(\d)\s*(\w)\s*$, line) _o_match_vmsize re.match(r^\s*VmSize\s*:\s*(\d)\s*(\w)\s*$, line) if _o_match_vmpeak: # 占用内存的峰值 _dict[vmpeak] {value: _o_match_vmpeak.group(1), dimension: _o_match_vmpeak.group(2)} elif _o_match_vmsize: # 占用内存的当前值 _dict[vmsize] {value: _o_match_vmsize.group(1), dimension: _o_match_vmsize.group(2)} fin.close() return _dict def print_mem_size(pid): _dict_mem_size get_mem_size(pid) print(VmPeak: {} {}.format(_dict_mem_size[vmpeak][value], _dict_mem_size[vmpeak][dimension])) print(VmSize: {} {}.format(_dict_mem_size[vmsize][value], _dict_mem_size[vmsize][dimension])) if __name__ __main__: s_pid os.getpid() print_mem_size(s_pid)以下是一个/proc/${pid}/status文件示例:#进程名 Name: xxx.py #状态, 常见的状态有: # R (running) # S (sleeping) # D (disk sleep) # T (stopped) # T (tracing stop) # Z (zombie) # X (dead) State: S (sleeping) #线程组的ID, 一个线程一定属于一个线程组(进程组) Tgid: 13858 # 进程ID, 更准确的说是线程的ID, 通过ps命令会列出 Pid: 13858 # 当前进程的父进程 PPid: 185077 # 跟踪当前进程的进程ID, 如果是0, 表示没有跟踪 TracerPid: 0 # 第一列: RUID, 实际用户ID, 指进程执行者是谁. # 第二列: EUID, 有效用户ID, 指进程执行时对文件的访问权限. # 第三列: SUID, 保存设置用户ID, 作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID. # 第四列: FSUID, 目前进程的文件系统的用户识别码.一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的. Uid: 11041 11041 11041 11041 Gid: 50000 50000 50000 50000 # FDSize是当前分配的文件描述符, FDSize: 64 # 这里的groups表示启动这个进程的用户所在的组. Groups: 10000 10004 10013 10019 10115 ... # 当前进程运行过程中占用内存的峰值. 包括程序申请的内存以及加载动态链接库而占用的内存. VmPeak: 124940 kB # 进程现在正在占用的内存, 这个值与pmap pid的值基本一致,如果略有不同,可能是内存裂缝所造成的. VmSize: 124940 kB # 已经锁住的物理内存大小, 锁住的物理内存不能交换到硬盘. VmLck: 0 kB # 程序得到分配到物理内存的峰值. VmHWM: 5468 kB # 程序现在使用的物理内存. VmRSS: 1420 kB VmData: 2936 kB # 进程数据段的大小 VmStk: 136 kB # 进程堆栈段的大小 VmExe: 2264 kB # 进程代码的大小 Vmlib: 3108 kB # 进程所使用LIB库的大小 VmPTE: 72 Kb # 进程占用的页表的大小 VmSwap: 0 Kb # 进程占用的Swap的大小 Threads: 1 # 当前进程组有几个线程 SigQ: 0/1844674...1615 # 当前待处理信号的个数 SigPnd: 0000000000000000 # 屏蔽位, 存储了该线程的待处理信号,等同于线程的PENDING信号. ShnPnd: 0000000000000000 # 屏蔽位, 存储了该线程组的待处理信号.等同于进程组的PENDING信号. SigBlk: 0000000000000000 # 存放被阻塞的信号,等同于BLOCKED信号. SigIgn: 0000000001001000 # 存放被忽略的信号,等同于IGNORED信号. SigCgt: 0000000180000002 # 存放捕获的信号,等同于CAUGHT信号. ...