1.系統信息的收集
????????系統信息的收集,對于服務質量的把控,服務的監控等來說是非常重要的組成部分,甚至是核心的基礎支撐部分。我們可以通過大量的核心指標數據,結合對應的檢測體系,快速的發現異常現象的苗頭,進行可控的措施。
????????我們的運維就像是醫生,如果我們在診斷之前對病人的信息以及癥狀都不了解的話,如何對癥下藥。
基礎信息之psutil模塊
要在Linux中下載和安裝psutil庫,可以按照以下步驟進行操作:
- 打開終端。
- 使用以下命令安裝pip(如果已經安裝了pip,請跳過此步驟):
- 對于Debian/Ubuntu系統:
sudo apt-get install python3-pip
- 對于CentOS/RHEL系統:
sudo yum install python3-pip
- 對于Debian/Ubuntu系統:
- 使用以下命令安裝psutil庫:
- 對于Python 2.x:
sudo pip install psutil
- 對于Python 3.x:
sudo pip3 install psutil
- 對于Python 2.x:
現在,您已經成功在Linux中安裝了psutil庫。您可以在Python腳本中導入它并開始使用它。例如:
psutil是一個跨平臺庫,我們主要去用它來獲取兩部分信息
? ? ? ? 進程信息:
? ? ? ? 系統利用率 - cpu、內存、磁盤、網絡等。
它實現了提供同等命令行的一些相關功能,比如:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap (感興趣的可以去百度一下這些命令的具體作用以及原理,學到就是賺到)
通常我們獲取操作系統信息往往采用編寫shell來實現,如獲取當前物理內存總大小以及使用大小、shell命令如下
物理內存total值: free -m | grep? Mem | awk '{print $2}'
物理內存used值:free -m | grep? Mem | awk '{print $3}'
這樣長長的一段shell? 往往我們編寫起來會很麻煩 容易出錯? 同時也不容易記憶
相較而言使用psutil庫實現則更加簡單明了
安裝完成之后我們就可以在python文件中使用啦
?當然也可以在終端中去使用
?psutil模塊已經封裝了這些方法,根據需要調用就可以
(1) CPU信息
User Time,執行用戶進程時間的百分比
System Time,執行內核進程和中斷的時間百分比
WaitIO,由于IO等待而使CPU處于idle(空閑)狀態的時間百分比
idle,CPU處于idle狀態的時間百分比
import psutil
psutil.cpu_times() # 使用cpu_time方法獲取cpu完整信息,需要現實所有邏輯CPU信息
# 指定方法變量 percpu=True即可,如psutil.cpu_times(percpu=True)
print(psutil.cpu_times())
psutil.cpu_times().user
print(psutil.cpu_times().user)
psutil.cpu_count() # 獲取CPU的邏輯個數,默認logical=True4
print(psutil.cpu_count())
psutil.cpu_count(logical=False) # 獲取CPU的物理個數
print(psutil.cpu_count(logical=False) )
我們使用Python的psutil.cpu_times()方法可以非常簡單的得到這些信息,同時也可以獲取CPU的硬件相關的信息,比如CPU的物理個數與邏輯個數
( 2)內存信息
linux系統的內存利用率信息涉及total(內存總數)、used(已使用的內存數)、free(空閑的內存數)、buffers(緩沖使用數)、cache(緩存使用數)、swap(交換分區使用數),分別使用psutil.virtual_memory()與psutil.swap_memory()方法獲取這些信息
import psutil
mem = psutil.virtual_memory() # 使用psutil.virtual_memory方法獲取內存完整信息
print(mem)mem.total # 獲取內存總數
print(mem.total)
mem.free # 獲取空閑內存數
print(mem.free)psutil.swap_memory() # 獲取swap分區信息
print(psutil.swap_memory())
(3)磁盤信息?
在系統的所有磁盤信息中,磁盤劉勇率使用psutil.disk_usage方法獲取。磁盤io信息包括read_count(讀io數)、write_count(寫io數)、read_bytes(io讀字節數)、warite_bytes(IO寫字節數)、read_time(磁盤讀時間)、write_time(磁盤寫時間)。這些io信息可以使用psutil.disk_io_counters()獲取
import psutil
psutil.disk_partitions() # 使用psutil.disk_partitions方法獲取磁盤完整信息
print(psutil.disk_partitions())psutil.disk_usage('/') # 使用psutil.disk_usage方法獲取分區參數的使用情況
print(psutil.disk_usage('/'))
?(4)網絡信息
系統的網絡信息和磁盤IO信息類似,涉及到幾個關鍵點,包括bytes_sent(發送字節數)、bytes_recv(接受字節數)、packets_sent=200987(發送數據包數)、packets_recv(接受數據包數)等。這些信息都可以使用psutil.net_io_counters()獲取
import psutil
psutil.net_io_counters() # 使用psutil.net_io_counters()獲取網絡總的IO信息,默認pernic = False
print(psutil.net_io_counters())psutil.net_io_counters(pernic = True) # 輸出每個網絡接口的IO信息
print(psutil.net_io_counters(pernic = True))
(5)其他系統信息
除了上面介紹的幾個獲取系統基本信息的方法,psutil模塊還支持獲取用戶登錄,開機時間等信息
import psutil,datetime
psutil.users() # 使用psutil.users方法返回當前登錄系統的用戶信息
print(psutil.users())
psutil.boot_time() # 獲取開機時間,以linux時間戳格式返回
print(psutil.boot_time())
# 使用psutil.boot_time方式獲取開機時間,以Linux時間戳格式返回
datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d%H:%M:%S")
print(datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d%H:%M:%S"))
2.系統進程管理方法
(1)進程信息
獲得當前系統的進程信息,可以讓運維人員得知應用程序的運行狀態,包括進程的啟動時間、查看或者設置CPU親和度、內存使用率、IO信息、socket鏈接、線程數等、這些信息可以呈現出指定進程是否存活、資源利用情況、問題定位提供很好的數據參考
import psutil
psutil.pids() # 列出所有進程
p = psutil.Process(2424) # 實例化一個Process對象,參考為一進程PID
p.name('java') # 進程名
p.exe('/usr/bin/java') # 進程bin路徑
p.cwd('/usr/local/hadoop-1') # 進程工作目錄絕對路徑
p.status('sleeping') # 進程狀態
p.create_time()
p.uids() # 進程信息
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.connections() # 返回打開進程socket的namedutples列表,包括fs、family、ladder等信息
p.num_threads() # 進程開啟的線程數
(2)popen類的使用
psutil提供的popen類的作用是獲取用戶啟動的應用程序的進程信息,以便跟蹤進程的運行狀態
import psutil
from subprocess import PIPE
# 通過psutil的Popen方法啟動應用程序,可以根據該程序運行的所有相關信息
p = psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout = PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times() # 得到進程運行的CPU時間