專案新特性上線後,有時會因為包含記憶體洩露的問題導致服務資源被佔滿,以至於線上服務崩潰。
最簡單的方式是對服務期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