psutil-获取系统性能信息模块

摘要:
通过它实现率同等命令行工具提供的功能,ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。支持32位及64位的Linux、Windows、OSX、FreeBSD和SunSolaris等操作系统,2.4以上的python版本。

内容目录:

    • 简介
    • psutil模块
      • 安装

      • 基本使用

      • 获取系统总内存和使用内存

      • 获取主机cpu核数和物理cpu个数

      • 获取磁盘信息

      • 获取网络信息

      • 获取用户登录信息

      • 获取系统开机时间

      • 获取系统进程信息

简介

psutil 是一个垮平台库,能够轻松实现获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息。通过它实现率同等命令行工具提供的功能,ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。支持32位及64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统,2.4以上的python版本。

psutil使用

1、源码安装步骤

wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz 
tar zxf psutil-2.0.0.tar.gz 
cd psutil-2.0.0
python setup.py  install 

2、基本使用

psutil获取内存等信息大小单位一般都采用字节方式

1)获取系统总内存和使用内存

mem =  psutil.virtual_memory() #内存总信息
mem.total #总内存
8589934592L
mem.used #系统使用内存
6736408576L
psutil.swap_memory() #swap总信息
sswap(total=3221225472L, used=1972371456L, free=1248854016L, percent=61.2, sin=54952632320L, sout=3776888832L)  

2)获取主机cpu核数和物理cpu个数 

import psutil
psutil.cpu_count() #cpu逻辑个数
4
psutil.cpu_count(logical=False) #cpu物理个数
2

3)获取磁盘信息

在系统的所有磁盘中我们关注的笔调多的是磁盘的使用率和io信息,磁盘的利用率可以用psutil.disk_usage方法获取。磁盘的IO信息可以通过psutil.disk_io_counters()获取,其中io信息包括

read_count:读io数

write_count:写io数

read_bytes:IO读字节数

write_byte:IO写字节数

read_time:磁盘读时间

write_time:磁盘写时间

>>> psutil.disk_partitions() #获取磁盘分区读写信息等
[sdiskpart(device='/dev/vda1', mountpoint='/', fstype='ext4', opts='rw,relatime,data=ordered')]
>>> 
>>> psutil.disk_usage('/') #获取根目录磁盘使用情况,参数为路径path
sdiskusage(total=120108089344, used=108555464704, free=11290480640, percent=90.4)
>>> 
>>> psutil.disk_io_counters() #获取硬盘总的io个数、读写信息
sdiskio(read_count=4699627L, write_count=2000421L, read_bytes=98468618240L, write_bytes=66542867456L, read_time=2026157L, write_time=612921L)
>>> psutil.disk_io_counters(perdisk=True) #perdisk=True参数获取单个分区IO个数、读写信息
{'disk0': sdiskio(read_count=4700548L, write_count=2001237L, read_bytes=98479378432L, write_bytes=66562835456L, read_time=2026586L, write_time=613130L)}
>>> 

4)获取网络信息

系统网络信息与磁盘io类似,获取的各个字段数据含义

bytes_sent:发送字节数

bytes_recv:接收字节数

packets_sent:发送数据包数

packets_recv:接收数据包数

>>> psutil.net_io_counters()#网络进出数据总IO信息  
snetio(bytes_sent=745142254L, bytes_recv=4592756042L, packets_sent=4926867L, packets_recv=5772501L, errin=0L, errout=0L, dropin=0L, dropout=0)
>>> psutil.net_io_counters().bytes_sent
745202707L
>>> psutil.net_io_counters(pernic=True)  #输出单个网口的IO信息
{'gif0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'utun0': snetio(bytes_sent=268L, bytes_recv=0L, packets_sent=3L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'bridge0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'en0': snetio(bytes_sent=711968154L, bytes_recv=4560084221L, packets_sent=4457290L, packets_recv=5303595L, errin=0L, errout=0L, dropin=0L, dropout=0), 'en1': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'lo0': snetio(bytes_sent=33112941L, bytes_recv=33112941L, packets_sent=469278L, packets_recv=469278L, errin=0L, errout=0L, dropin=0L, dropout=0), 'utun1': snetio(bytes_sent=77994L, bytes_recv=94413L, packets_sent=759L, packets_recv=416L, errin=0L, errout=0L, dropin=0L, dropout=0), 'p2p0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'stf0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'awdl0': snetio(bytes_sent=72716L, bytes_recv=0L, packets_sent=325L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0)}
>>> 

5)获取用户登录信息

>>> psutil.users()
[suser(name='user1', terminal='console', host=None, started=1522855040.0)]

6)获取系统开机时间

>>> psutil.boot_time() #返回系统系统开机时间戳
1522855040.0
>>> import datetime
>>> datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H:%M:%S") #转换为标准格式
'2018-04-04 23:17:20'

7)获取系统进程信息

通过获取的进程信息可以知道应用程序的运行状态,包括进程的启动时间、查看或设置cpu亲和度、内存使用率、IO信息、socket链接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况。

  • 进程信息

使用psutil.pids()方法获取所有的进程PID,使用psutil.Process()方法可以获取单个进程的名称、路径、状态、系统资源利用率等。

>>> import psutil
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 25, 26, 27, 28, 36, 38, 39, 40, 59, 91, 224, 233, 234, 235, 236, 239, 248, 259, 260, 327, 346, 431, 443, 466, 468, 471, 472, 477, 483, 490, 760, 823, 1069, 1074, 1104, 1303, 1332, 1487, 4966, 6312, 7600, 7804, 8015, 11557, 11559, 11560, 11561, 11562, 11563, 11573, 11597, 11785, 12058, 22552, 22554, 22638, 22642, 22654, 22706, 22823, 22825, 22842, 22847, 22849, 22875, 22899, 22933, 22934, 22937, 22954, 22956, 22976, 31834]
>>> psutil.Process(11557)
psutil.Process(pid=11557, name='php-fpm', started='2018-03-07 09:33:03')
>>> 
p.name()   #进程名
p.exe()    #进程的bin路径
p.cwd()    #进程的工作目录绝对路径
p.status()   #进程状态
p.create_time()  #进程创建时间
p.uids()    #进程uid信息
p.gids()    #进程的gid信息
p.cpu_times()   #进程的cpu时间信息,包括user,system两个cpu信息
p.cpu_affinity()  #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
p.memory_percent()  #进程内存利用率
p.memory_info()    #进程内存rss,vms信息
p.io_counters()    #进程的IO信息,包括读写IO数字及参数
p.connectios()   #返回进程列表
p.num_threads()  #进程开启的线程数
  • popen类的使用

psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。

>>> import psutil
>>> from subprocess import PIPE
#通过psutil 的Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息
>>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE)
>>> p.name()
'python'
>>> p.username()
'root'
>>> p.communicate()
('hello
', None)
>>> p.cpu_times() #获得进程运行的cpu时间

免责声明:文章转载自《psutil-获取系统性能信息模块》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ExtJS的使用方法汇总(1)——配置和表格控件使用WordPress 插件开发实例 – 详细注释的 Widget 开发例子下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何优化 Java 性能?

对于 Java 性能比较关心的同学大概都知道《Java Performance》这本书,一般而言,很多同学在日常写 Java Code 的时候很少去关心性能问题,但是在我们写 Code 的过程中必须考虑到性能对程序的影响。小到我们使用位运算来实现算术运算,大到我们对 Java 代码的总体架构设计,「性能」其实离我们很近。本篇文章主要提到几个点,希望能够对大...

Linux监控分析

一、linux硬件 CPU(计算、逻辑判断、逻辑处理)、内存(cpu在内存中处理数据(记忆片段))、IO(对磁盘在一段时间内的读写操作) cpu和内存间有块区域缓存(二级缓存) cpu高:检查cpu,查看系统的瓶颈点是否在cpu上,看cpu把时间花费在哪个地方了,如果说,在这过程中,cup没有浪费时间,只能加cpu;如果cpu确实有浪费时间的地方,解决这个...

【Java并发基础】加锁机制解决原子性问题

前言 原子性指一个或多个操作在CPU执行的过程不被中断的特性。前面提到原子性问题产生的源头是线程切换,而线程切换依赖于CPU中断。于是得出,禁用CPU中断就可以禁止线程切换从而解决原子性问题。但是这种情况只适用于单核,多核时不适用。 以在 32 位 CPU 上执行 long 型变量的写操作为例来说明。 long 型变量是 64 位,在 32 位 CPU 上...

linux性能评估-cpu案例操作篇

1.平均负载案例分析 场景一:CPU 密集型进程 场景二:I/O密集型进程 场景三:大量进程的场景 2.CPU 上下文切换案例 2.1怎么查看系统的上下文切换情况 2.2查看每个进程上下文切换的情况 2.3 案例实操 3.CPU使用率的案例 3.1CPU 使用率很高,但为啥却找不到高 CPU 的应用? 3.2 等待 I/O 的 CPU的使用...

减少 Linux 电耗,第 1 部分 CPUfreq 子系统

满足 System x 上的 Linux 的所有电源效率调优组件 任何人在考虑业务成本或环境问题时都不得不重视电源效率。 在本文中,我们将讨论如何使用 Linux CPUfreq 子系统和内核调控器来修改处理器的频率,从而改善系统效率,而不会对性能造成显著影响。 但是,根据实际硬件的不同,电源效率调优存在一些限制(详见本系列的第 2 部分)。 Linux...

μC/OS-III---I笔记13---中断管理

中断管理先看一下最常用的临界段进入的函数:进入临界段 OS_CRITICAL_ENTER() 退出临界段OS_CRITICAL_EXIT()他们两个的宏是这样的. 在使能中断延迟提交时: #if OS_CFG_ISR_POST_DEFERRED_EN > 0u /* Deferred ISR P...