前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[linux性能优化]python第三方库-PSUtil库

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

原创
作者头像
五分钟学SRE
修改2023-11-18 18:35:01
3380
修改2023-11-18 18:35:01
举报
文章被收录于专栏:五分钟学SRE

PSUtil库介绍

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

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

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

实际应用的demo程序

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

检测系统句柄

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

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

代码语言:javascript
复制
import psutil
def check_handles():
    process = psutil.Process()
    open_files = process.open_files()
    handle_count = len(open_files)
    if handle_count > 1000:
        print("Handle count is too high: %d" % handle_count)

检测系统内存瓶颈

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

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

代码语言:javascript
复制
import psutil
def check_memory():
    mem = psutil.virtual_memory()
    mem_percent = mem.percent
    if mem_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代码

代码语言:javascript
复制
import psutil
def check_io():
    disk_io = psutil.disk_io_counters()
    read_speed = disk_io.read_bytes / disk_io.read_time
    write_speed = disk_io.write_bytes / disk_io.write_time
    if read_speed > 10000000 or write_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示例代码:

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

系统运行状态监控

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

代码语言:javascript
复制
import psutil
import time
def check_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)
    if handle_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.")
def check_memory():
    mem = psutil.virtual_memory()
    mem_percent = mem.percent
    print("mem_percent: ", mem_percent)
    mem_limit = int(open('/proc/sys/vm/swappiness').read())
    print("mem_limit : ",mem_limit)
    if mem_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.")
def check_io():
    disk_io = psutil.disk_io_counters()
    read_speed = disk_io.read_bytes / disk_io.read_time
    write_speed = disk_io.write_bytes / disk_io.write_time
    print("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)
    if read_speed > int(max_io_speed*0.8) or write_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.")
def check_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)
    if process_count > int(max_processes*0.8):
        print("WARNING: Too many processes: %d" % process_count)
    else:
        print("INFO: Process count is within the normal range.")
while True:
    try:
        check_handles()
        check_memory()
        check_io()
        check_processes()
        time.sleep(10)
    except KeyboardInterrupt:
        exit()

使用PSUtil库的开源项目

Glances

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

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

代码语言:javascript
复制
import psutil
def get_cpu_usage():
    cpu_percent = psutil.cpu_percent(interval=1)
    return cpu_percent

Supervisor

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

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

代码语言:javascript
复制
import psutil
def get_process_status(pid):
    process = psutil.Process(pid)
    return process.status()

Sentry

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

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

代码语言:javascript
复制
import psutil
def get_system_info():
    cpu_count = psutil.cpu_count()
    mem_total = psutil.virtual_memory().total
    disk_total = psutil.disk_usage('/').total
    return {'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

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PSUtil库介绍
  • 实际应用的demo程序
    • 检测系统句柄
      • 检测系统内存瓶颈
        • 检测系统IO瓶颈
          • 检测系统进程数量
            • 系统运行状态监控
            • 使用PSUtil库的开源项目
              • Glances
                • Supervisor
                  • Sentry
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档