[linux性能优化]python第三方库-PSUtil库

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: PSUtil库是Python的一个第三方库,它可以访问各种系统信息和资源利用率,如CPU,内存,磁盘,网络接口,进程等。在Linux、Windows、Mac OS X、FreeBSD等操作系统中,PSUtil提供了一致的接口,这使得它成为了Python系统管理和监控的有力工具。

PSUtil库介绍

PSUtil库是Python的一个第三方库,它可以访问各种系统信息和资源利用率,如CPU,内存,磁盘,网络接口,进程等。在Linux、Windows、Mac OS X、FreeBSD等操作系统中,PSUtil提供了一致的接口,这使得它成为了Python系统管理和监控的有力工具。PSUtil支持Python2和Python3版本,使用非常方便,安装后只需import就可以使用了。

PSUtil提供了许多有用的函数,以帮助我们了解系统的状态和性能。下面是一些常用的函数:

cpu_percent(): 获取CPU使用率
virtual_memory(): 获取系统内存使用情况
disk_usage(): 获取磁盘使用情况
net_io_counters(): 获取网络接口的输入/输出流量
process_iter(): 迭代当前运行的进程
Process(): 获取特定进程的信息

实际应用的demo程序

现在我们来实际使用PSUtil库来优化和检测Linux系统的一些常见瓶颈,包括句柄,内存和IO。我们将使用Python编写一个程序来检测系统上的这些问题。

检测系统句柄

首先,我们来检测系统上的句柄瓶颈。句柄是指在操作系统中用于访问文件、网络等资源的标识符,如果系统上有太多的句柄被打开,就会导致系统性能下降。我们可以使用PSUtil库的“process_open_files()”函数来获取进程打开的文件列表,然后计算打开的句柄数量。

   下面是一个检测句柄瓶颈的Python示例代码:

importpsutildefcheck_handles():
process=psutil.Process()
open_files=process.open_files()
handle_count=len(open_files)
ifhandle_count>1000:
print("Handle count is too high: %d"%handle_count)

检测系统内存瓶颈

检测系统上的内存瓶颈。内存是系统性能的关键因素之一,如果系统上的内存不足,就会导致应用程序崩溃或者性能下降。我们可以使用PSUtil库的“virtual_memory()”函数来获取系统的内存使用情况,然后计算可用内存的比例。

   下面是一个检测内存瓶颈的Python示例代码:

importpsutildefcheck_memory():
mem=psutil.virtual_memory()
mem_percent=mem.percentifmem_percent>80:
print("Memory usage is too high: %d%%"%mem_percent)

检测系统IO瓶颈

检测系统上的IO瓶颈。IO是指磁盘读写和网络传输等操作,如果系统上的IO负载太高,就会导致应用程序崩溃或者性能下降。我们可以使用PSUtil库的“disk_io_counters()”函数来获取磁盘的IO负载情况,然后计算读写速率。

disk_io_counters()函数返回一个namedtuple对象,包含了有关磁盘IO统计信息的字段,这些字段的含义如下:

  • read_count: 磁盘读取操作的次数write_count: 磁盘写入操作的次数read_bytes: 读取的字节数write_bytes: 写入的字节数read_time: 读取操作的时间(以毫秒为单位)write_time: 写入操作的时间(以毫秒为单位)busy_time: 磁盘繁忙时间(以毫秒为单位)

demo代码

importpsutildefcheck_io():
disk_io=psutil.disk_io_counters()
read_speed=disk_io.read_bytes/disk_io.read_timewrite_speed=disk_io.write_bytes/disk_io.write_timeifread_speed>10000000orwrite_speed>10000000:
print("IO usage is too high: read=%d write=%d"% (read_speed, write_speed))
#得到的读取和写入速率单位是字节/毫秒(Bytes/ms)#将速率单位转换为字节/秒(Bytes/s)read_speed=disk_io.read_bytes/ (disk_io.read_time/1000)
write_speed=disk_io.write_bytes/ (disk_io.write_time/1000)
#将速率单位转换为兆字节/秒(MB/s)read_speed=disk_io.read_bytes/ (disk_io.read_time/1000) / (1000*1000)
write_speed=disk_io.write_bytes/ (disk_io.write_time/1000) / (1000*1000)

检测系统进程数量

可以使用PSUtil库的“process_iter()”函数来获取当前运行的进程列表,然后计算进程数量。下面是一个检测进程数量的Python示例代码:

import psutil
def check_processes():
    process_count = len(list(psutil.process_iter()))
    if process_count > 500:
        print("Too many processes: %d" % process_count)复制复制

系统运行状态监控

   可以结合系统配置,当实际使用率大于80%时,告警出来

importpsutilimporttimedefcheck_handles():
process=psutil.Process()
open_files=process.open_files()
handle_count=len(open_files)
print("handle_count: ", handle_count)
max_handles=int(open('/proc/sys/fs/file-max').read())
print("max_handles : ",max_handles)
ifhandle_count>int(max_handles*0.8):
print("WARNING: Handle count is too high: %d"%handle_count)
else:
print("INFO: Handle count is within the normal range.")
defcheck_memory():
mem=psutil.virtual_memory()
mem_percent=mem.percentprint("mem_percent: ", mem_percent)
mem_limit=int(open('/proc/sys/vm/swappiness').read())
print("mem_limit : ",mem_limit)
ifmem_percent>int(mem_limit*0.8):
print("WARNING: Memory usage is too high: %d%%"%mem_percent)
else:
print("INFO: Memory usage is within the normal range.")
defcheck_io():
disk_io=psutil.disk_io_counters()
read_speed=disk_io.read_bytes/disk_io.read_timewrite_speed=disk_io.write_bytes/disk_io.write_timeprint("read_speed: ", read_speed)
print("write_speed: ", write_speed)
max_io_speed=int(open('/proc/sys/fs/file-max').read())
print("max_io_speed : ",max_io_speed)
ifread_speed>int(max_io_speed*0.8) orwrite_speed>int(max_io_speed*0.8):
print("WARNING: IO usage is too high: read=%d write=%d"% (read_speed, write_speed))
else:
print("INFO: IO usage is within the normal range.")
defcheck_processes():
process_count=len(list(psutil.process_iter()))
print("process_count: ", process_count)
max_processes=int(open('/proc/sys/kernel/pid_max').read())
print("max_processes : ",max_processes)
ifprocess_count>int(max_processes*0.8):
print("WARNING: Too many processes: %d"%process_count)
else:
print("INFO: Process count is within the normal range.")
whileTrue:
try:
check_handles()
check_memory()
check_io()
check_processes()
time.sleep(10)
exceptKeyboardInterrupt:
exit()

使用PSUtil库的开源项目

Glances

Glances是一个跨平台的系统监控工具,它可以监控CPU使用率,内存使用情况,网络传输情况,硬盘空间等。它的界面清晰易懂,支持CLI和Web界面。

下面是一个使用PSUtil库监控CPU使用率的Glances示例代码:

importpsutildefget_cpu_usage():
cpu_percent=psutil.cpu_percent(interval=1)
returncpu_percent

Supervisor

Supervisor是一个进程管理工具,它可以启动、停止和监控后台进程。它使用了PSUtil库来监控和管理进程。

下面是一个使用PSUtil库监控进程状态的Supervisor示例代码:

importpsutildefget_process_status(pid):
process=psutil.Process(pid)
returnprocess.status()

Sentry

Sentry是一个开源的错误跟踪工具,它可以监控应用程序中的错误,并提供详细的错误报告。Sentry使用了PSUtil库来获取系统和进程信息。

下面是一个使用PSUtil库获取系统信息的Sentry示例代码:

importpsutildefget_system_info():
cpu_count=psutil.cpu_count()
mem_total=psutil.virtual_memory().totaldisk_total=psutil.disk_usage('/').totalreturn {'cpu_count': cpu_count, 'mem_total': mem_total, 'disk_total': disk_total}

可以查看原文:

https://mp.weixin.qq.com/s?__biz=MzA5NTgwNzY1NA==&mid=2247483972&idx=1&sn=636371a82b7c58db5db2320814939f44&chksm=90b8f38da7cf7a9b7b2c63d70de2db18d373904ec2d2b8ef4ca4b72af14f5df9484efb81bb86&token=2069274630&lang=zh_CN#rd

关注公众号获取更多sre博文:五分钟学SRE

相关文章
|
1月前
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
695 101
|
2月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
4月前
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
172 20
|
1月前
|
程序员 测试技术 开发工具
怎么开发Python第三方库?手把手教你参与开源项目!
大家好,我是程序员晚枫。本文将分享如何开发Python第三方库,并以我维护的开源项目 **popdf** 为例,指导参与开源贡献。Popdf是一个PDF操作库,支持PDF转Word、转图片、合并与加密等功能。文章涵盖从fork项目、本地开发、单元测试到提交PR的全流程,适合想了解开源贡献的开发者。欢迎访问[popdf](https://gitcode.com/python4office/popdf),一起交流学习!
104 21
怎么开发Python第三方库?手把手教你参与开源项目!
|
5月前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
1467 141
|
2月前
|
数据采集 搜索推荐 C语言
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化和调试技巧,涵盖使用内置函数、列表推导式、生成器、`cProfile`、`numpy`等优化手段,以及`print`、`assert`、`pdb`和`logging`等调试方法。通过实战项目如优化排序算法和日志记录的Web爬虫,帮助你编写高效稳定的Python程序。
|
3月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
117 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
225 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
5月前
|
XML JSON 数据库
Python的标准库
Python的标准库
236 77
|
3月前
|
Web App开发 数据采集 数据安全/隐私保护
Selenium库详解:Python实现模拟登录与反爬限制的进阶指南
Selenium库详解:Python实现模拟登录与反爬限制的进阶指南