关于psutil 模块:
用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps
,top
,free
等等。要获取这些系统信息,在Python中获取系统信息的另一个好办法是使用psutil
这个第三方模块。它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维不可或缺的必备模块。
1. 安装 psuil
pip install psutil
2. 如何获取信息资源:
2.1 统计CPU的用户/系统/空闲时间:
>>> psutil.cpu_times() scputimes(user=51.38, nice=0.22, system=42.4, idle=17594.59, iowait=66.39, irq=0.43, softirq=23.28, steal=0.0, guest=0.0)
user:正常进程在用户模式下执行所花费的时间;在Linux上,这还包括客户时间。
nice:niced(优先级)进程在用户模式下执行所花费的时间;在Linux上,这也包括guest_nice time。
idle:cpu空闲时间。
system:运行在内核态的进程所消耗的cpu时间。
iowait:等待I/O完成的时间。
irq:用于服务硬件中断的时间
sotirq:用于服务软件中断的时间
另外: psutil.cpu_times(percpu=True) 结果是以列表的形式返回
2.2 实现类似与 top 命令的 CPU使用率,每秒刷新一次
>>> for i in range(10): ... psutil.cpu_percent(interval=1, percpu=True) ... [1.0] [0.0] [0.0]
percent 百分率
percpu=True 已列表的形式 打印
interval=1 间隔时间为1秒
3. 获取内存信息
>>> psutil.virtual_memory() #获取内存完整信息 svmem(total=498319360, available=332267520, percent=33.3, used=154488832, free=170827776, active=107458560, inactive=106196992, buffers=19234816, cached=153767936, shared=557056, slab=81408000)
也可以获取单一的内存:
>>> psutil.virtual_memory().total # 获取单个内存信息
结果:498319360
virtual memory 虚拟内存
# 物理内存大小 = 物理已使用的内存 + 物理没使用的内存
total = used + free #内存总数
# 可用内存大小 = 物理没使用的内存 + 缓冲 + 缓存
available = free + buffers + cached
# 内存使用率 = (物理内存大小 - 可用内存大小) / 物理内存大小 * 100
percent = (total - available) / total * 100
used: 已使用的内存数
free : 空闲内存数
buffers : 缓冲使用数
cached : 缓存使用数
使用间的转换 :
memory = 1024 * 1024
total = psutil.virtual_memory().total
total_M = total / memory + 'M'
4. swap交换分区使用
>>> psutil.swap_memory()
sswap(total=2147479552, used=0, free=2147479552, percent=0.0, sin=0, sout=0)
返回的是字节为单位的整数,可以看到,总内存大小是8589934592 = 8 GB,已用7201386496 = 6.7 GB,使用了66.6%。而交换区大小是1073741824 = 1 GB
5. 磁盘空间:
在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信息,其中磁盘利用率使用psutil.disk_usage(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/mapper/VolGroup-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext4', opts='rw')] >>> psutil.disk_usage('/') # 磁盘的使用情况 sdiskusage(total=18369396736, used=1746006016, free=15683448832, percent=10.0) >>> psutil.disk_io_counters() # 磁盘的IO sdiskio(read_count=16440, write_count=11513, read_bytes=293014528, write_bytes=69329920, read_time=201925, write_time=442674, read_merged_count=2765, write_merged_count=5397, busy_time=186237)
6. 进程获取:
通过psutil可以获取到所有进程的详细信息:
>>> psutil.pids() # 所有进程ID [3865, 3864, 3863, 3856, 3855, 3853, 3776, ..., 45, 44, 1, 0] >>> p = psutil.Process(3776) # 获取指定进程ID=3776,其实就是当前Python交互环境 >>> p.name() # 进程名称 'python3.6' >>> p.exe() # 进程exe路径 '/Users/michael/anaconda3/bin/python3.6' >>> p.cwd() # 进程工作目录 '/Users/michael' >>> p.cmdline() # 进程启动的命令行 ['python3'] >>> p.ppid() # 父进程ID 3765 >>> p.parent() # 父进程 <psutil.Process(pid=3765, name='bash') at 4503144040> >>> p.children() # 子进程列表 [] >>> p.status() # 进程状态 'running' >>> p.username() # 进程用户名 'michael' >>> p.create_time() # 进程创建时间 1511052731.120333 >>> p.terminal() # 进程终端 '/dev/ttys002' >>> p.cpu_times() # 进程使用的CPU时间 pcputimes(user=0.081150144, system=0.053269812, children_user=0.0, children_system=0.0) >>> p.memory_info() # 进程使用的内存 pmem(rss=8310784, vms=2481725440, pfaults=3207, pageins=18) >>> p.open_files() # 进程打开的文件 [] >>> p.connections() # 进程相关网络连接 [] >>> p.num_threads() # 进程的线程数量 1 >>> p.threads() # 所有线程信息 [pthread(id=1, user_time=0.090318, system_time=0.062736)] >>> p.environ() # 进程环境变量 {'SHELL': '/bin/bash', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:...', 'PWD': '/Users/michael', 'LANG': 'zh_CN.UTF-8', ...} >>> p.terminate() # 结束进程
***********************后续在更新