Python监控进程资源占用并发送邮件
项目新特性上线后,有时会因为包含内存泄露的问题导致服务资源被占满,以至于线上服务崩溃。
最简单的方式是对服务期CPU/内存占用进行监测和及时预警。
python中pyutil包是自动化运维常用的工具库之一,可以进行方便获取服务器CPU/内存及进程等相关信息。
安装方法
pip install psutil
检测当前CPU占用百分比
if psutil.cpu_percent(0.01) > 70:
print('CPU占用超过70%了')
检测当前内存占用百分比
if psutil.virtual_memory().percent > 70:
print('内存占用超过70%了')
获取top10资源占用进程
def get_top_process(option='mem',n=10,added=True):
process_list = []
for proc in psutil.process_iter():
process_list.append((proc.name(), proc.memory_percent(), proc.cpu_percent(0.01)))
process_list.sort(key=lambda process_list:process_list[0]) # 按进程名排序
if added:
# 累加相同进程名进程资源占用百分比
process_list = reduce(
lambda x,y: x+[y] if x==[] or x[-1][0]!=y[0] else x[0:-1]+[(x[-1][0],x[-1][1]+y[1],x[-1][2]+y[2])],
[[]] + process_list)
sort_index = 1 if option.lower() == 'mem' else 2 # 排序列,option=mem,按prcess_list第2列(index=1)排序
# 将process_list按相应列从大到小排序,无累加-------# todo 先累加再排序
process_list.sort(key=lambda process_list:process_list[2 if sort_index==1 else 1], reverse=True)
process_list.sort(key=lambda process_list:process_list[sort_index], reverse=True)
return process_list[0:n]
检测僵尸进程
def check_zombie_process():
zombie_process_list = []
for proc in psutil.process_iter():
if proc.status() == 'zombie':
zombie_process_list.append(
(proc.name(), proc.status(), proc.create_time(), proc.memory_percent(), proc.cpu_percent(0.01))
)
return zombie_process_list
检测php-fpm进程
def check_single_process(process_name='php-fpm'):
warn_process_list = []
for proc in psutil.process_iter():
if proc.name() == process_name:
if proc.memory_info().res()/1024/1024 >= int(RES_WARN):
warn_process_list.append(proc.name(), proc.create_time(), proc.memory_info().res(), proc.connections())
return warn_process_list