python运维开发常用模块psutil

Posted benjamin77

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python运维开发常用模块psutil相关的知识,希望对你有一定的参考价值。

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

以上是关于python运维开发常用模块psutil的主要内容,如果未能解决你的问题,请参考以下文章

初识Python自动化运维

初识Python自动化运维

运维常用python库&模块

[新星计划] Python psutil模块 | 使用Python实现运维监控

[新星计划] Python psutil模块 | 使用Python实现运维监控

《Python自动化运维之路》 系统基础信息模块