千家信息网

基于python的Linux系统指定进程性能监控思路详解

发表于:2025-02-13 作者:千家信息网编辑
千家信息网最后更新 2025年02月13日,监控Linux服务器的工具、组件和程序网上有很多,但是一台服务器上会有很多进程同时运行,特别是做性能测试的时候,可能一台服务器上部署多个服务,如果只监控整个服务器的CPU和内存,当某个服务出现性能问题
千家信息网最后更新 2025年02月13日基于python的Linux系统指定进程性能监控思路详解

监控Linux服务器的工具、组件和程序网上有很多,但是一台服务器上会有很多进程同时运行,特别是做性能测试的时候,可能一台服务器上部署多个服务,如果只监控整个服务器的CPU和内存,当某个服务出现性能问题时,并不能有效准确的定位出(当然通过其他工具也可以实现),因此,很有必要只监控指定的进程。需求明确了,于是动手撸了一个性能监控脚本。

一、整体思路

1、为了方便的启动监控和停止监控,在想查看监控结果的时候随时查看监控结果,用flask开启了一个服务,通过发送get请求可以随时启停监控和查看监控结果。
2、针对控制是否监控cpu、内存、IO,开启多线程监控。
3、为了减少对其他组件的依赖,将监控结果写到日志中。
4、为了方便查看监控结果,直接将结果以html方式返回。

二、配置文件

config.py

IP = '127.0.0.1'PORT = '5555'LEVEL = 'INFO' # log levelBACKUP_COUNT = 9 # log backup counterLOG_PATH = 'logs' # log pathINTERVAL = 1 # interval, run command interval.SLEEPTIME = 3 # interval, when stopping monitor, polling to start monitor when satisfying condition.ERROR_TIMES = 5 # times, number of running command. When equal, automatically stopped monitor.IS_JVM_ALERT = True # Whether to alert when the frequency of Full GC is too high.IS_MONITOR_SYSTEM = True # Whether to monitor system's CPU and Memory.IS_MEM_ALERT = True # Whether to alert when memory is too low. Alert by sending email.MIN_MEM = 2  # Minxium memory, uint: G# 0: don't clear cache, 1: clear page caches, 2: clear dentries and inodes caches, 3: include 1 and 2;# echo 1 >/proc/sys/vm/drop_cachesECHO = 0SMTP_SERVER = 'smtp.sina.com' # SMTP serverSENDER_NAME = '张三'  # sender nameSENDER_EMAIL = 'zhangsan@qq.com' # sender's emailPASSWORD = 'UjBWYVJFZE9RbFpIV1QwOVBUMDlQUT09' # email password, base64 encode.RECEIVER_NAME = 'baidu_all' # receiver nameRECEIVER_EMAIL = ['zhangsan@qq.com', 'zhangsi@qq.com'] # receiver's emailDISK = 'device1' # Which disk your application runsSTART_TIME = 'startTime.txt' # Store the time of start monitoring.FGC_TIMES = 'FullGC.txt' # Store the time of every FullGC time.# htmlHTML = '{}'ERROR = '

{}

'HEADER = ''ANALYSIS = '
{}
'

IP和PORT:开启服务的服务器IP和端口,必须和所监控的服务在同一台服务器上;
BACKUP_COUNT:默认为9,即只保留最近9天监控结果;
INTERVAL:两次监控的时间间隔,默认为1s,主要用于cpu和内存监控,当同时监控多个端口或进程时,请将该值设小一点;
ERROR_TIMES:命令执行失败次数,当大于该次数时,则会自动停止监控;主要用于监控指定的进程,如果进程被杀掉,则必须自动停止监控,且必须手动触发再次开始监控;如果监控指定的端口,当端口的进程被杀掉后,也会停止监控,如果端口被重新启动,则自动开始监控;
IS_JVM_ALERT:仅针对java应用,如果频繁FullGC,则邮件提醒;一般性能测试,FullGC的频率不得小于3600秒;
IS_MONITOR_SYSTEM :是否监控系统总CPU使用率和剩余内存;
IS_MEM_ALERT:当系统剩余内存过低时,是否邮件提醒;
MIN_MEM:允许系统最小剩余内存,单位为G;
ECHO:当系统剩余内存过低时,是否释放缓存;0为不释放,1为释放页面缓存,2为释放dentries和inodes缓存,3为释放1和2;
DISK:磁盘号,如果监控IO,需要输入磁盘号,通过df -h 文件名查看当前文件挂在哪个磁盘下;
START_TIME:记录每次手动触发开始监控的时间;
FGC_TIMES:记录每次FullGC的时间,用于排查问题;

三、接口和服务

server.py

server = Flask(__name__)permon = PerMon()# 开启多线程t = [threading.Thread(target=permon.write_cpu_mem, args=()), threading.Thread(target=permon.write_io, args=())]for i in range(len(t)): t[i].start()# 开始监控# http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600@server.route('/runMonitor', methods=['get'])def runMonitor():......# 画监控结果图# http://127.0.0.1:5555/plotMonitor?type=pid&num=23121@server.route('/plotMonitor', methods=['get'])def plotMonitor():.......server.run(port=cfg.PORT, debug=True, host=cfg.IP) # 开启服务

通过在浏览器地址栏输入对应的url,即可启停监控和查看监控结果

url传参:

1、开始监控

http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600
isRun:1为开始监控,0为停止监控;
type和num:type=pid时,表明num为进程号,type=port,表明num为端口号;可以同时监控多个端口或进程,多个端口或进程用英文逗号隔开;
totalTime:为监控总时间,单位为秒;如果不传入totalTime,则默认一直监控;

2、查看监控结果

http://127.0.0.1:
5555/plotMonitor?type=port&num=23121&system=1&startTime=2019-08-03 08:08:08&duration=3600
type和num:type=pid时,表明num为进程号,type=port,表明num为端口号;
system:表示查看系统监控结果;如果传了type和num,不管sysytem是否传值,都只能看到进程的监控结果;不传type和num,只传system,则可以查看系统监控结果;
startTime:查看监控结果开始时间;
duration:查看监控结果的时长,单位为秒;
如果不传startTime和duration,则默认查看最近一次开始监控以来的所有结果;如果需要查看某一段时间内的监控结果,则需要传startTime和duration,查看监控结果的时间范围为从startTime开始到startTime+duration为止。
注:如果在查看监控结果输入的一段时间内,服务被重启过,则进程号会有变化,此时仍输入重启前的进程号,则只能查看对应进程号在对应时间段内的监控结果。一般情况下,端口号不会轻易变化,建议查看监控结果时输入端口号。

四、监控

performance_monitor.py

使用top命令监控CPU和内存,使用jstat命令监控JVM内存(仅java应用),使用iotop命令监控进程读写磁盘,使用iostat命令监控磁盘IO,使用netstat命令根据端口查进程,使用ps命令查看服务启动时长。因此,服务器必须支持以上命令,如不支持,请安装。

注:由于进程可以开启多个线程,在查看进程的IO时,是看不到任何IO;而查看进程开启的某个线程IO时,是可以看到IO的,但是线程是一直是在变化的;故目前暂不支持监控指定进程IO的。

五、查看监控结果

draw_performance.py

1、分别画CPU图、内存和JVM图、IO图和句柄数图;
2、为方便统计CPU和IO使用情况,计算百分位数;
3、为方便统计垃圾回收信息,计算java应用的ygc、fgc,以及各自的频率。

监控结果效果图如下:

六、扩展函数

extern.py 有两个功能

1、端口转进程

try: result = os.popen(f'netstat -nlp|grep {port} |tr -s " "').readlines() res = [line.strip() for line in result if str(port) in line] p = res[0].split(' ') pp = p[3].split(':')[-1] if str(port) == pp: pid = p[-1].split('/')[0]except Exception as err: logger.logger.error(err)

2、查找包含监控结果的日志

整体思路:

(1)根据输入的开始时间和结束时间,查找包含这段时间的所有日志文件;
(2)根据查找出来的日志文件,找出包含监控结果的所有日志;
(3)画图的时候遍历找出的所有日志。

补充

1、为了方便查看最近一次开始监控的时间,会将每一次开始监控的时间写到startTime.txt文件中;

2、为了方便排查java应用可能出现的问题,将每一次Full GC的时间写到FullGC.txt文件中。

项目地址:https://github.com/leeyoshinari/performance_monitor

总结

以上所述是小编给大家介绍的基于python的Linux系统指定进程性能监控,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

监控 结果 进程 服务 时间 内存 端口 命令 系统 文件 服务器 日志 输入 多个 磁盘 线程 性能 口号 剩余 应用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 传奇单机版装备数据库英文翻译 NCBI管理多少个数据库 机柜服务器维修服务 邢台微信软件开发多少钱 怎样玩方舟手游服务器 丽水网络安全防护公司服务 软件开发项目分工怎么做 sdq sdz数据库 教育网络安全应急预案怎么制作 实验室gpu服务器购买 网络安全防御技术报告摘要 达梦数据库测试转正式授权 网吧服务器自动死机是怎么回事 大逃杀怎么选服务器 信息网络安全的第二个时代 游戏检测软件开发 网络安全申论文章标题 为党代会召开提供网络安全保障 中卫商场系统软件开发 设计题有一个学生课程数据库 数据库是信息管理吗 网络服务器配置与管理论文 苹果手机怎么连接数据库交互 vc数据库怎么改名称 数据库部署的主要工作内容 合肥鲲鹏服务器在哪买 会计专硕数据库 汉王怎么导出考勤数据库 数据服务器组装 易语言快速查找资料的数据库
0