1.模块简介

psutil是一个跨平台库(http://code.google.com/p/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到3.4的 Python版本,目前最新版本为2.0.0。

通常我们获取操作系统信息往往采 用编写shell来实现,如获取当前物理内存总大小及已使用大小,shell命 令如下:

相比较而言,使用psutil库实现则更加简单明了。psutil大小单位一 般都采用字节,如下:

2.获取系统性能信息

采集系统的基本性能信息包括CPU、内存、磁盘、网络等,可以 完整描述当前系统的运行状态及质量。psutil模块已经封装了这些方法, 用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单 实用。

(1)CPU信息 Linux操作系统的CPU利用率有以下几个部分: ·

User Time,执行用户进程的时间百分比; ·

System Time,执行内核进程和中断的时间百分比; ·

Wait IO,由于IO等待而使CPU处于idle(空闲)状态的时间百分 比; ·

Idle,CPU处于idle状态的时间百分比。

我们使用Python的psutil.cpu_times()方法可以非常简单地得到这 些信息,同时也可以获取CPU的硬件相关信息,比如CPU的物理个数与 逻辑个数,具体见下面的操作例子:

获取全部cpu信息

>>> psutil.cpu_times()
scputimes(user=55.56, nice=0.0, system=28.83, idle=2811.87, iowait=71.64, irq=0.0, softirq=0.4, steal=0.0, guest=0.0, guest_nice=0.0)

获取cpu某个指标的cpu 信息

>>> psutil.cpu_times().user   #cpu用户时间百分比
57.08
>>> psutil.cpu_count() #逻辑cpu的数量
1
>>> psutil.cpu_count(logical=False) #物理cpu的数量
1

(2)内存信息

Linux系统的内存利用率信息涉及total(内存总数)、used(已使 用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、 cache(缓存使用数)、swap(交换分区使用数)等,分别使用 psutil.virtual_memory()与psutil.swap_memory()方法获取这些信 息,具体见下面的操作例子:

获取全部内存信息

>>> mem=psutil.virtual_memory()
>>> mem
svmem(total=1928081408, available=1635614720, percent=15.2, used=117481472, free=1023430656, active=433111040, inactive=346320896, buffers=55558144, cached=731611136, shared=524288, slab=91049984)

获取内存某个指标信息

>>> mem.total #总内存
1928081408
>>> mem.free #空闲内存
1023430656
>>> psutil.swap_memory() #swap分区信息
sswap(total=0, used=0, free=0, percent=0.0, sin=0, sout=0)

(3)磁盘信息

在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信 息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括 read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节 数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、 write_time(磁盘写时间)等。这些IO信息可以使用 psutil.disk_io_counters()获取,具体见下面的操作例子:

>>> psutil.disk_partitions()  #获取磁盘的挂载信息
[sdiskpart(device='/dev/vda1', mountpoint='/', fstype='ext4', opts='rw,noatime,data=ordered')]
>>> psutil.disk_usage('/') #获取根目录的磁盘使用情况
sdiskusage(total=52709261312, used=1797283840, free=48210923520, percent=3.6)
>>> psutil.disk_io_counters() #获取磁盘整体io的信息
sdiskio(read_count=17654, write_count=16921, read_bytes=336112640, write_bytes=1199091712, read_time=94260, write_time=2551193, read_merged_count=251, write_merged_count=12212, busy_time=111944)
>>> psutil.disk_io_counters(perdisk=True) #更细粒度的获取每块盘的磁盘io信息
{'vda': sdiskio(read_count=16442, write_count=17139, read_bytes=296236032, write_bytes=1200701440, read_time=93595, write_time=2554037, read_merged_count=251, write_merged_count=12330, busy_time=111885), 'sr0': sdiskio(read_count=1212, write_count=0, read_bytes=39876608, write_bytes=0, read_time=665, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=513), 'loop0': sdiskio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, read_time=0, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=0), 'vda1': sdiskio(read_count=16412, write_count=16436, read_bytes=295162880, write_bytes=1200701440, read_time=93521, write_time=2552650, read_merged_count=251, write_merged_count=12330, busy_time=110707)}

(4)网络信息

系统的网络信息与磁盘IO类似,涉及几个关键点,包括 bytes_sent(发送字节数)、bytes_recv=28220119(接收字节数)、 packets_sent=200978(发送数据包数)、packets_recv=212672(接收数 据包数)等。这些网络信息使用psutil.net_io_counters()方法获取,具 体见下面的操作例子:

>>> psutil.net_io_counters()  #使用psutil.net_io_counters获取网络总的IO信 息,默人pernic=False
snetio(bytes_sent=3097792, bytes_recv=84277258, packets_sent=30395, packets_recv=76803, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_io_counters(pernic=True) #pernic=True获取每个网络接口的网络io信息
{'lo': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'eth0': snetio(bytes_sent=3151297, bytes_recv=84313463, packets_sent=30879, packets_recv=77288, errin=0, errout=0, dropin=0, dropout=0)}

(5)其他系统信息

除了前面介绍的几个获取系统基本信息的方法,psutil模块还支持 获取用户登录、开机时间等信息,具体见下面的操作例子:

>>> psutil.users()
[suser(name='root', terminal='pts/0', host='58.101.51.163', started=1556753152.0, pid=10408), suser(name='root', terminal='pts/1', host='58.101.51.163', started=1556755328.0, pid=13692)]
>>> import psutil,datetime
>>> psutil.boot_time() #系统开机时间,时间戳的形式
1556752934.0
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") #格式转化成自然时间
'2019-05-02 07:22:14'

系统进程管理方法 获得当前系统的进程信息,可以让运维人员得知应用程序的运行 状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO 信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存 活、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据 参考。

(1)进程信息 psutil模块在获取进程信息方面也提供了很好的支持,包括使用 psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取 单个进程的名称、路径、状态、系统资源利用率等信息,具体见下面的 操作例子:

>>> import psutil

>>> psutil.pids() #列出所有进程PID
[1, 2, 3, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 27, 28, 29, 30, 38, 39, 40, 41, 42, 43, 56, 102, 221, 228, 229, 230, 231, 233, 234, 238, 253, 254, 328, 358, 360, 443, 468, 470, 473, 474, 476, 679, 783, 858, 864, 879, 880, 1240, 3015, 3304, 3576, 3586, 3587, 9028, 9119, 10387, 10408, 13377, 13690, 13692, 18041, 18450, 18874, 18947]
>>> p=psutil.Process(10387) #实例化一个Process对象,参数为一进程PID
>>> p.name() #进程名
'sshd'
>>> p.exe() #进程执行路径
'/usr/sbin/sshd'
>>> p.cwd() #进程工作目录绝对路径
'/'
>>> p.status() #进程状态

  'sleeping'

>>> p.create_time()  #进程创建时间,时间戳格式
1556753100.62
>>> p.uids() #进程uid信息
puids(real=0, effective=0, saved=0)
>>> p.gids() #进程gid信息
pgids(real=0, effective=0, saved=0)
>>> p.cpu_times() #进程CPU时间信息,包括user、system两个CPU时间
pcputimes(user=0.11, system=0.18, children_user=0.0, children_system=0.0)
>>> p.memory_percent() #进程内存利用率
0.28764262634288107
>>> p.io_counters() #进程IO信息,包括读写IO数及字节数
pio(read_count=4335, write_count=3971, read_bytes=0, write_bytes=0, read_chars=403466, write_chars=301488) >>> p.connections() #返回打开进程socket的namedutples列表,包括fs、family、 laddr
[pconn(fd=3, family=2, type=1, laddr=addr(ip='172.27.0.7', port=22), raddr=addr(ip='58.101.51.163', port=38431), status='ESTABLISHED')]
>>> p.num_threads() #进程开启的线程数
1

#进程开启的线程数

psutil提供的popen类的作用是获取用户启动的应用程序进程信息, 以便跟踪程序进程的运行状态。具体实现方法如下:

>>> import psutil
>>> from subprocess import PIPE
>>> p=psutil.Popen(["/usr/bin/python","-c" "print ('hello')"],stdout=PIPE)
>>> p.name()
'python'
>>> p.username()
'root'
>>> p.communicate()
('hello\n', None)
>>> p.cpu_times() #得到进程运行的CPU时间
pcputimes(user=0.01, system=0.0, children_user=0.0, children_system=0.0)

3.关于psutil模块更多用法

>>> dir(psutil)
['AF_LINK', 'AIX', 'AccessDenied', 'BSD', 'CONN_CLOSE', 'CONN_CLOSE_WAIT', 'CONN_CLOSING', 'CONN_ESTABLISHED', 'CONN_FIN_WAIT1', 'CONN_FIN_WAIT2', 'CONN_LAST_ACK', 'CONN_LISTEN', 'CONN_NONE', 'CONN_SYN_RECV', 'CONN_SYN_SENT', 'CONN_TIME_WAIT', 'Error', 'FREEBSD', 'IOPRIO_CLASS_BE', 'IOPRIO_CLASS_IDLE', 'IOPRIO_CLASS_NONE', 'IOPRIO_CLASS_RT', 'LINUX', 'MACOS', 'NETBSD', 'NIC_DUPLEX_FULL', 'NIC_DUPLEX_HALF', 'NIC_DUPLEX_UNKNOWN', 'NoSuchProcess', 'OPENBSD', 'OSX', 'POSIX', 'POWER_TIME_UNKNOWN', 'POWER_TIME_UNLIMITED', 'PROCFS_PATH', 'Popen', 'Process', 'RLIMIT_AS', 'RLIMIT_CORE', 'RLIMIT_CPU', 'RLIMIT_DATA', 'RLIMIT_FSIZE', 'RLIMIT_LOCKS', 'RLIMIT_MEMLOCK', 'RLIMIT_MSGQUEUE', 'RLIMIT_NICE', 'RLIMIT_NOFILE', 'RLIMIT_NPROC', 'RLIMIT_RSS', 'RLIMIT_RTPRIO', 'RLIMIT_RTTIME', 'RLIMIT_SIGPENDING', 'RLIMIT_STACK', 'RLIM_INFINITY', 'STATUS_DEAD', 'STATUS_DISK_SLEEP', 'STATUS_IDLE', 'STATUS_LOCKED', 'STATUS_PARKED', 'STATUS_RUNNING', 'STATUS_SLEEPING', 'STATUS_STOPPED', 'STATUS_TRACING_STOP', 'STATUS_WAITING', 'STATUS_WAKING', 'STATUS_ZOMBIE', 'SUNOS', 'TimeoutExpired', 'WINDOWS', 'ZombieProcess', '_LOWEST_PID', '_PY3', '_TOTAL_PHYMEM', '__all__', '__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_as_dict_attrnames', '_assert_pid_not_reused', '_common', '_compat', '_cpu_busy_time', '_cpu_times_deltas', '_cpu_tot_time', '_last_cpu_times', '_last_cpu_times_2', '_last_per_cpu_times', '_last_per_cpu_times_2', '_lock', '_pmap', '_ppid_map', '_pprint_secs', '_pslinux', '_psplatform', '_psposix', '_psutil_linux', '_psutil_posix', '_timer', '_wrap_numbers', 'boot_time', 'collections', 'contextlib', 'cpu_count', 'cpu_freq', 'cpu_percent', 'cpu_stats', 'cpu_times', 'cpu_times_percent', 'datetime', 'disk_io_counters', 'disk_partitions', 'disk_usage', 'errno', 'functools', 'getloadavg', 'long', 'net_connections', 'net_if_addrs', 'net_if_stats', 'net_io_counters', 'os', 'pid_exists', 'pids', 'process_iter', 'pwd', 'sensors_battery', 'sensors_fans', 'sensors_temperatures', 'signal', 'subprocess', 'swap_memory', 'sys', 'test', 'threading', 'time', 'users', 'version_info', 'virtual_memory', 'wait_procs']

psutil官网:https://psutil.readthedocs.io/en/latest/

psuti的git:https://github.com/giampaolo/psutil

最新文章

  1. .NET4.5新特性之异步编程(Async和Await)的使用
  2. WPF PlacementTarget技巧
  3. 玩转单元测试之DBUnit
  4. Leetcode 345 Reverse Vowels of a String 字符串处理
  5. SOA资料
  6. git Unstaged changes after reset
  7. 简单讲解iOS应用开发中的MD5加密的相关使用
  8. java读取CSV文件添加到sqlserver数据库
  9. [转载] zookeeper应用——集中配置管理系统的实现
  10. 》》vue
  11. Oracle ADG搭建
  12. go入门
  13. 二、tableau常用难点操作
  14. Linux查看硬件等基本参数
  15. 用单进程、多线程并发、多线程分别实现爬一个或多个网站的所有链接,用浏览器打开所有链接并保存截图 python
  16. asp.net针对SQLSERVER数据库备份和恢复的一揽子问题解决
  17. 《转》利用cxf实现webservice
  18. Windows系统中设置Python程序定时运行方法
  19. Android RelativeLayout属性介绍
  20. Struts2中使用OGNL表达式语言访问静态方法和静态属性

热门文章

  1. Zookeeper的安装与配置、使用
  2. 【mysql】Mysql的profile的使用 --- Profilling mysql的性能分析工具
  3. C# Large Files MD5 C# 获取大文件MD5
  4. WPF ItemsSource Order by Getter
  5. C#之初识异步
  6. AspNetCore.Identity详解1——入门使用
  7. NetCoreApi框架搭建(一、swagger插件使用)
  8. Win10 手动安装 WSL 并修改默认登录用户为 root
  9. 大话区块链【Blockchain】
  10. minggw 安装