系統性能信息模塊psutil

前言

psutil 是一個跨平臺庫,可以輕鬆實現獲取系統運行的金岑個系統利用率,包括CPU、內存、磁盤、網絡等信息,它主要應用於系統監控,分析和限制系統資源及進程的管理。它實現了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、free等shell

一般咱們獲取系統信息每每採用編寫shell來實現,如獲取當前物理內存總大小緩存

[root@192.168.32.130 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:           981        899         81         15         44        149
-/+ buffers/cache:        705        275
Swap:         1983        999        984
[root@192.168.32.130 ~]$

使用python 的psutil庫獲取更爲方便網絡

那麼psutil 是一個第三方模塊,須要安裝運維

Windows:socket

pip3 install psutil函數

Linux:工具

wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.1.tar.gz --no-check-certificate
tar zxvf psutil-3.2.1.tar.gz
cd psutil-3.2.1
python3 setup.py install

使用以下:性能

import psutil                       # 導入psutil模塊
mem = psutil.virtual_memory()       # 實例化出來mem對象
print(mem)                          # 查看完整內存信息
print(mem.total)                    # 查看內存總大小,單位是字節
print(mem.used)                     # 查看內存使用大小

獲取大小以後咱們可使用轉換工具進行轉換優化

獲取系統性能信息

CPU

Linux 操做系統的CPU 利用率有如下幾個部分:

  • User Time:執行用戶進程的時間百分比
  • System Time:執行內核進程和中斷的時間百分比
  • Wait IO:因爲IO等待而使CPU處於idle(空閒)狀態的時間百分比
  • Idle: CPU 處於空間狀態的時間百分比
print(psutil.cpu_times())           # 獲取CPU 完整的信息
print(psutil.cpu_times().user)      # 獲取用戶user的cpu時間比
print(psutil.cpu_count())           # 獲取CPU 的邏輯個數
print(psutil.cpu_count(logical=False))  # 獲取CPU 的物理個數
print(psutil.cpu_percent())         # 獲取cpu的使用率
print(psutil.cpu_percent(1))

內存

Linux 操做系統的內存利用率有如下幾個部分:

  • total(內存總數)
  • used(已使用的內存數)
  • free(空閒內存數)
  • buffers(緩衝使用數)
  • cache(緩存使用數)
  • swap(交換分區使用數)
mem = psutil.virtual_memory()       # 實例化出來mem對象
print(mem)                          # 查看完整內存信息
print(mem.total)                    # 查看內存總大小
print(mem.used)                     # 查看內存使用大小

磁盤

在系統磁盤信息中,咱們更加關注磁盤利用率即IO 信息。獲取磁盤利用率能夠用psutil.disk_usage方法獲取

print(psutil.disk_partitions())     # 獲取磁盤完整信息
print(psutil.disk_usage("/"))       # 獲取分區的使用參數
print(psutil.disk_io_counters())    # 獲取磁盤的讀寫信息

網絡信息

網絡信息包括bytes_sent(發送字節數)、接收字節數等

print(psutil.net_io_counters())     # 獲取完整的網絡信息

其餘系統信息

除了以上介紹的幾個獲取系統基本信息的方法,psutil模塊還支持獲取用戶登陸、開機時間等信息

print(psutil.users())               # 獲取當前登陸系統的用戶信息
print(psutil.boot_time())           # 獲取開機時間,以時間戳格式返回
import datetime
res = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d" "%H:%M:%S")
print(res)                          # 格式化爲人們看得懂的時間

系統進程管理方法

獲取當前系統進程信息,可讓運維人員得知應用程序的運行狀態,包括進程的啓動時間、查看或設置CPU親和度、內存使用率、IO信息、socket鏈接、線程數等,這些信息能夠呈現出指定進程是否存活、資源利用狀況,爲開發人員的代碼優化、問題定位提供良好的數據參考

進程信息

psutil 獲取進程信息

print(psutil.pids())                # 獲取全部進程PID,以列表形式返回
p = psutil.Process(9236)            # 實例化一個對象,參數爲一個進程ID
print(p.name())                     # 經過name屬性能夠獲得這個進程的名稱
print(p.exe())                      # 經過exe屬性能夠獲得這個進程的路徑
print(p.cwd())                      # 經過cwd屬性能夠進入工做目錄絕對路徑
print(p.status())                   # 經過status屬性能夠看到這個進程的狀態
print(p.create_time())              # 經過create_time屬性能夠看到這個進程的建立時間,時間戳形式
print(p.uids())                     # 經過uids屬性能夠看到進程的uid信息
print(p.gids())                     # 經過gids屬性能夠看到進程的gid信息
print(p.cpu_times())                # 經過cpu_times能夠看到user、system兩個cpu的時間
print(p.cpu_affinity())             # 獲取cpu親和度,若是要設置親和度,將cou號做爲參數便可。
print(p.memory_percent())           # 經過memory_percent能夠看到進程的內存利用率
print(p.memory_info())              # 經過memory_info能夠看到進內存的rss、vms信息
print(p.io_counters())              # 經過io_counters能夠看到進程的io信息
print(p.connections())              # 經過connections能夠看到進程的socket鏈接數
print(p.num_threads())              # 經過num_threads能夠看到進程開啓的線程數

popen類

popen的做用是獲取用戶啓動的應用程序進程信息,以便跟蹤程序進程的運行狀態

from subprocess import PIPE
p = psutil.Popen(["python3 psutil_使用.py"],stdout=PIPE)
print(p.name())
print(p.username())
print(p.cpu_times)

查看系統硬件的小腳本

#!/usr/bin/env python
#coding:utf-8

import psutil
import datetime
import time

# 當前時間
now_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
print(now_time)

# 查看cpu物理個數的信息
print(u"物理CPU個數: %s" % psutil.cpu_count(logical=False))

#CPU的使用率
cpu = (str(psutil.cpu_percent(1))) + '%'
print(u"cup使用率: %s" % cpu)

#查看內存信息,剩餘內存.free  總共.total
#round()函數方法爲返回浮點數x的四捨五入值。

free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
print(u"物理內存: %s G" % total)
print(u"剩餘物理內存: %s G" % free)
print(u"物理內存使用率: %s %%" % int(memory * 100))
# 系統啓動時間
print(u"系統啓動時間: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))

# 系統用戶
users_count = len(psutil.users())
#
# >>> for u in psutil.users():
# ...   print(u)
# ...
# suser(name='root', terminal='pts/0', host='61.135.18.162', started=1505483904.0)
# suser(name='root', terminal='pts/5', host='61.135.18.162', started=1505469056.0)
# >>> u.name
# 'root'
# >>> u.terminal
# 'pts/5'
# >>> u.host
# '61.135.18.162'
# >>> u.started
# 1505469056.0
# >>>

users_list = ",".join([u.name for u in psutil.users()])
print(u"當前有%s個用戶,分別是 %s" % (users_count, users_list))

#網卡,能夠獲得網卡屬性,鏈接數,當前流量等信息
net = psutil.net_io_counters()
bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
print(u"網卡接收流量 %s 網卡發送流量 %s" % (bytes_rcvd, bytes_sent))

io = psutil.disk_partitions()
# print(io)
# print("io[-1]爲",io[-1])
#del io[-1]

print('-----------------------------磁盤信息---------------------------------------')

print("系統磁盤信息:" + str(io))

for i in io:
    o = psutil.disk_usage(i.device)
    print("總容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G")
    print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G")
    print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")

print('-----------------------------進程信息-------------------------------------')
# 查看系統所有進程
for pnum in psutil.pids():
    p = psutil.Process(pnum)
    print(u"進程名 %-20s  內存利用率 %-18s 進程狀態 %-10s 建立時間 %-10s " \
    % (p.name(), p.memory_percent(), p.status(), p.create_time()))

硬件信息腳本
相關文章
相關標籤/搜索