若是你須要經過 Python 代碼來監控服務器資源信息,好比內容佔用狀況、cpu 資源消耗以及資源不足發送警報等,那麼這篇文章很適合你。python
香香的口味,你吃過沒?
辣辣的感受,你嘗過沒?
網爆紅人的歌聲,你聽過沒?
Python 系統資源信息獲取的工具,你用過沒?
真正的烤麪筋
可帶勁啦!~~~
讓你吃到真正的實惠!
不同的滋味!!!
複製代碼
致敬那個不屈的男人(麪筋哥 程書林)git
psutil(process and system utilities)是一個跨平臺的庫,github、官方文檔github
咱們能夠用它來查看系統運行進程以及資源利用率。它主要用於系統監控、過程資源分析和限制以及運行過程的管理。psutil 的主要功能結構以下圖所示緩存
它有三大功能模塊,分別是 System related function、Processes 和 Windows Service。bash
psutil 實現了UNIX命令行工具提供的許多功能,好比 top、free、netstat、kill 等,而且還兼容各大操做系統:服務器
咱們能夠一邊翻閱 psutil 的官方文檔,一邊編寫代碼,這樣就可以更快的學習。微信
在 Python 環境下安裝,直接使用 pip 命令便可:網絡
pip install psutil
複製代碼
可是,若是你只但願當前用戶可用,而不是整個系統全部用戶都能使用,你就須要調整你的命令:數據結構
pip install -user psutil
複製代碼
除此以外,它還提供瞭如 wget、curl 等多種安裝方式,具體可參閱文檔的 install 部分,可是一般來講 pip install psutil
命令已經知足咱們的需求了。運維
它爲咱們提供了一些系統經常使用的操做內容 可參閱文檔。其中包括了 CPU、內存、磁盤、網絡、傳感器和進程等方面。
能夠經過 cpu_times 模塊對 cpu 資源進行查看,好比:
>>> import psutil
>>> psutil.cpu_times()
scputimes(user=477.29, nice=0.0, system=262.86, idle=6074.83)
複製代碼
cpu_times 中的參數有哪些含義呢?文檔中也給出了具體的釋義
翻譯一下,咱們能夠看到它給使用者提供了比較細緻的信息監控:
將系統CPU時間做爲命名元組返回。每一個屬性表示CPU在給定模式下花費的秒數。屬性可用性因平臺而異:
user:正常進程在用戶模式下執行所花費的時間; 在Linux上,這還包括訪客時間
system:在內核模式下執行的進程所花費的時間
閒置:無所事事的時間
特定於平臺的字段:
nice (UNIX):在用戶模式下執行的niced(優先級)進程所花費的時間; 在Linux上,這還包括guest_nice時間
iowait (Linux):等待I / O完成所花費的時間
irq (Linux,BSD):服務硬件中斷所花費的時間
softirq (Linux):服務軟件中斷所花費的時間
steal (Linux 2.6.11+):在虛擬化環境中運行的其餘操做系統所花費的時間
guest (Linux 2.6.24+):在Linux內核的控制下爲客戶操做系統運行虛擬CPU所花費的時間
guest_nice (Linux 3.2.0+):運行niced guest虛擬機所花費的時間(Linux內核控制下的來賓操做系統的虛擬CPU)
interrupt (Windows):服務硬件中斷所花費的時間(相似於UNIX上的「irq」)
dpc (Windows):服務延遲過程調用(DPC)所花費的時間;DPC是以比標準中斷低的優先級運行的中斷。
複製代碼
往下看還能夠看到其餘的 cpu 監控模塊,好比咱們最須要的 cpu 資源消耗百分比,cpu_percent(interval=None, percpu=False) 能夠返回一個浮點數,表示當前系統範圍的CPU利用率百分比。當interval爲> 0.0比較間隔以前和以後通過的系統CPU時間(阻塞)。當interval是0.0或None比較自上次調用或模塊導入後通過的系統CPU時間,當即返回。這意味着第一次調用它將返回一個無心義的0.0 值,你應該忽略它。在這種狀況下,建議0.1在調用之間至少調用此函數的準確性。當percpu是True返回表示利用率的浮點數列表,以每一個CPU的百分比表示。列表的第一個元素是指第一個CPU,第二個元素是第二個CPU,依此類推。列表的順序在調用之間是一致的。
而經過 cpu_count() 能夠查看 cpu 核心數量,它能夠返回系統中 cpu 的數量(與 os.cpu_count 的返回相同)
我電腦的 cpu 是 i3 ,可是獲得的 cpu 是 4(應該獲得的是2) ,爲何呢?
cpu_count() 返回的是 cpu 邏輯數量,物理數量得加上參數cpu_count(logical = True ) 運行獲得的 cpu 數量爲 2,也就是咱們常說的雙核四線程。
若是咱們但願獲得相似於 top 命令的使用率排行,那咱們應該如何作呢?鑑於前面學習的 cpu_percent 咱們來嘗試一下:
psutil.cpu_percent(interval=3, percpu=True)
複製代碼
其中的 interval 表明比較間隔以前和以後通過的系統CPU時間,也就是比較 3 秒間隔中 cpu 的佔用率
若是要實現排行,那麼就須要不少的記錄,意味着咱們能夠嘗試經過 for 循環來實現(此處將時間間隔設爲 1 便可):
固然,這僅僅只是將信息輸出了 10 次,若是要進行排行,那麼還須要其餘的處理。
上圖是我電腦的資源信息截圖,結合截圖來看,咱們經過代碼獲取的系統資源信息仍是比較可信的
關於 cpu 信息獲取的其餘知識,請翻閱 psutil 官方文檔的 cpu 部分,接下來要學習內存的信息獲取了。
virtual_memory()將有關係統內存使用狀況的統計信息做爲命名元組返回,包括以字節表示的如下字段。主要指標:
總計:總物理內存。
可用:能夠在沒有系統進入交換的狀況下當即提供給進程的內存。這是經過根據平臺對不一樣的內存值求和來計算的,而且它應該用於以跨平臺方式監視實際內存使用狀況。
其餘指標:
used:使用的內存,根據平臺的不一樣計算,僅供參考。總計 - 免費不必定匹配使用。
free:內存不被使用(歸零),隨時可用; 請注意,這並不反映可用的實際內存( 請改用)。總計 - 使用不必定與免費匹配 。
active (UNIX):當前正在使用或最近使用的內存,所以它在RAM中。
inactive (UNIX):標記爲未使用的內存。
buffers (Linux,BSD):緩存文件系統元數據之類的東西。
cached (Linux,BSD):緩存各類事物。
shared (Linux,BSD):可由多個進程同時訪問的內存。
slab (Linux):內核數據結構緩存。
wired (BSD,macOS):標記爲始終保留在RAM中的內存。它永遠不會移動到磁盤。
複製代碼
固然,咱們並不會關注太細緻的內存信息,只須要獲取內容總量、當前可用量或者當前已用量等信息便可。
如今有這麼一個需求,當監控到內存不足 300M 的時候經過代碼發出警告信息,咱們能夠將需求簡化爲:內存不足、發出提示
固然,上面的代碼並不可以真正的給咱們發出警告,由於它只是向你表達它可以作到的事。若是須要作到監控,還須要編寫更多的代碼、設計更好的處理邏輯。
swap_memory() 將系統交換內存統計信息做爲命名元組返回:
total:總交換內存(以字節爲單位)
used:以字節爲單位使用的swap內存
free:以字節爲單位的自由交換內存
percent:計算的百分比使用率(total - available) / total * 100
sin:系統從磁盤交換的字節數(累計)
sout:系統從磁盤換出的字節數(累計)
複製代碼
不過正常狀態下,咱們用得並很少,由於它並非返回系統全部的內存資源信息,而是交換內存的統計信息。
進程信息文檔定位,進程信息也是咱們比較關注的方面,psutil.pids() 能夠返回當前運行的PID列表,例如:
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, ..., 32498]
複製代碼
文檔中有一個比較有意思的介紹
咱們能夠按名稱過濾進程信息,爲何說他有意思呢?
好比咱們能夠經過記錄 Python 的進程信息、內存資源信息、cpu 資源信息,來分析咱們所寫的 Python 代碼在服務器上的資源佔用狀況。咱們嘗試篩選出 Python 相關的 pid:
>>> [p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']]
[{'name': 'python3.6', 'pid': 1447}]
>>>
複製代碼
pid 1447 的這個進程,正好是我在控制檯中演示代碼時,啓動的 Python 進程。
好了,關於 psutil 的簡單介紹就到這裏,感受好像沒有學到什麼高大上的知識?感受輕輕略過了一遍,並無留下什麼深入映像?
由於做者也是這麼認爲的,可是這並不妨礙咱們腦中的騷思路
可能下一回,咱們就會經過 psutil 實現一個服務器資源監控和比對的工具,好比這樣的:
有可能很完善,可是也有可能不須要那麼多功能。
學習更多 Python、爬蟲以及深度學習相關的知識,能夠關注微信公衆號【進擊的Coder】,和大佬一塊兒 Coding 共同進步。
請在評論區爲 麪筋哥-程書林打 call