项目新特性上线后,有时会因为包含内存泄露的问题导致服务资源被占满,以至于线上服务崩溃。

最简单的方式是对服务期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