Python監控程序資源佔用併傳送郵件

韩志超發表於2024-09-04

專案新特性上線後,有時會因為包含記憶體洩露的問題導致服務資源被佔滿,以至於線上服務崩潰。

最簡單的方式是對服務期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

相關文章