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}
可以查看原文:
关注公众号获取更多sre博文:五分钟学SRE