对于开发者来说,windows是我们接触最多的操作系统了,但是Linux是我们必不可少的一项重要技能,很多服务或者应用都需要在Linux下运行,掌握Linux系统的基本使用也是非常重要的,今天有一个需求就是需要监控某一个应用程序的内存等消耗或者说是占用的情况,这个不难实现,进入Linux环境写几行命令就实现了。比如下面的方法:
python
import psutil
p = psutil.Process(你的进程号PID)
p.memory_info().rss/1024/1024
在linux环境下,依次执行下面的几条命令就可以查询指定的进行占用的内存大小了,上述的输出结构是MB为单位统计结果。如果想要换成是GB的统计结果只需要在最后一条语句后面再除以一个1024即可。
对于我这种比较喜欢自动化、一体化的人来说如果可以通过程序自动地来完成这项工作当然会是最好的了,今天就简单实现了这个功能。
方案一:
下面的函数可以再Linux环境下查询 python 进程的内存消耗情况
def lookMemory():
'''
查看内存,该函数需要放在Linux服务器中才能执行
'''
order='ps -aux | grep python'
res=os.system(order)
print res
测试结果如下:
root 4085 2.1 0.4 134616 36740 ? S 2018 1054:11 python AllData.py
root 8760 2.0 0.5 138788 41028 ? S 2018 1978:51 python AllData.py
root 10991 0.0 0.3 145484 27264 ? S 2018 0:08 python func.py
root 17136 0.0 0.4 128564 34752 ? S 2018 1:29 python test.py
上述实现方式是借助于python内置的os模块中的system函数来实现了在python程序中执行linux命令。
看到这里首先需要明确一下ps -aux| grep python命令结果的输出参数:
ps aux输出格式:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
结果参数说明:
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态,linux的进程有5种状态:
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process
注: 其它状态还包括W(无驻留页),
从参数说明中我们可以知道上述结果中下面一列数据就是我们要找的内存占用情况:
36740
41028
27264
34752
可是上面的方式必须要放到Linux环境中才能执行查询监控操作,能不能在本地,比如Windows环境中就可以执行查询操作呢,答案是可以的,python有非常丰富的第三方包可以帮助我们完成这项工作,这里我们需要用到paramiko模块,安装方式也是非常简单的,直接pip install paramiko就可以了,基于该模块我们实现了连接Linux服务器后自动执行Linux命令的功能,具体实践如下:
方案二:
def connectLinuxAndOrdered(hostname,username,password):
'''
连接 Linux 服务器并指定指定命令(windows本地环境即可执行)
'''
s=paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #取消安全认证
s.connect(hostname=hostname,username=username,password=password) #连接linux
order='ps -aux | grep python' #执行命令
stdin,stdout,stderr=s.exec_command(order)
result=stdout.read() #读取执行结果
s.close() #关闭linux连接
return result
测试了一下也是非常好用的哈,这里只需要传入Linux服务器的IP地址、连接用户名和密码就可以了。
执行后输出结果如下所示:
root 4085 2.1 0.4 134616 36740 ? S 2018 1054:11 python AllData.py
root 8760 2.0 0.5 138788 41028 ? S 2018 1978:51 python AllData.py
root 10991 0.0 0.3 145484 27264 ? S 2018 0:08 python func.py
root 17136 0.0 0.4 128564 34752 ? S 2018 1:29 python test.py
看到这里,我想更方便地去展示每个程序占用的内存消耗情况和所有python程序占用内存的情况,这里就又做了一层统计功能,目的就是实现将同一个程序下所有的进程所占用的内存累加求和,具体如下:
pid_dict={}
for one in rule_list:
one_list=[O for O in one.split(' ') if O]
pid_name=one_list[-1]
if pid_name in pid_dict:
pid_dict[pid_name]+=float(one_list[5])/1024
else:
pid_dict[pid_name]=float(one_list[5])/1024
for one_key in pid_dict:
print one_key,'Memory Consum:',str(int(pid_dict[one_key])),'MB'
print 'Total Memory Consum:',str(float(sum(pid_dict.values())/1024))+'GB'
输出结果如下:
PID nums: 4
test.py Memory Consum: 33 MB
func.py Memory Consum: 26 MB
AllData.py Memory Consum: 75 MB
Total Memory Consum: 0.133308410645 GB
这样就是非常的清洗明了了,如果需要程序定时去运行以达到实时监控的目的的话,可以再封装一层定时功能就可以了,时间间隔自己可以根据情况去适当设置就行了。