實際的生產環境下,不論是研發還是運維,或多或少的得面對在linux上定位問題這個關卡,這裡介紹一下linux環境下一些狀態檢視常用的命令。
系統資源監控
總體資源佔用情況檢視
命令:top
像windows一樣,linux也有一個“程式管理”,可以在命令列執行 top ,就可以整體的檢視當前機器的資源及程式情況。
這裡第一行 (top) 顯示的資訊包含:
系統時間:19:27:01
執行時間:up 54 min,
當前登入使用者: 1 user
負載均衡(uptime) load average: 0.02, 0.03, 0.00
average後面的三個數分別是1分鐘、5分鐘、15分鐘的負載情況。
load average資料是每隔5秒鐘檢查一次活躍的程式數,然後按特定演算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了
第二行 (Tasks)顯示的當前的程式整體統計
第三行 (%CPU)是CPU狀態資訊,具體為:
0.0%us【user space】— 使用者空間佔用CPU的百分比。
0.1%sy【sysctl】— 核心空間佔用CPU的百分比。
0.0%ni【】— 改變過優先順序的程式佔用CPU的百分比
99.9%id【idolt】— 空閒CPU百分比
0.0%wa【wait】— IO等待佔用CPU的百分比
0.0%hi【Hardware IRQ】— 硬中斷佔用CPU的百分比
0.0%si【Software Interrupts】— 軟中斷佔用CPU的百分比
第四行 (KiB Mem)整體記憶體的狀態,分別為總量,已用,空閒,快取
第五行 (KiB Swap)交換區記憶體
最後是各程式的狀況
這裡說一下第四行和第五行,第四行中使用中的記憶體總量(used)指的是現在系統核心控制的記憶體數,空閒記憶體總量(free)是核心還未納入其管控範圍的數量。
對於記憶體監控,也就是說我們對於記憶體的監控主要是看第五行swap交換分割槽的used,如果這個數值在不斷的變化,說明核心在不斷進行記憶體和swap的資料交換,這是真正的記憶體不夠用了。
命令:top -p [pid]
除了整體來看,我們也可以鎖定單個程式的資源情況進行檢視。
例如: top -p 1864
詳細內容為
PID — 程式id
USER — 程式所有者
PR — 程式優先順序
NI — nice值。負值表示高優先順序,正值表示低優先順序
VIRT — 程式使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
RES — 程式使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA
SHR — 共享記憶體大小,單位kb
S —程式狀態。D=不可中斷的睡眠狀態 R=執行 S=睡眠 T=跟蹤/停止 Z=殭屍程式
%CPU — 上次更新到現在的CPU時間佔用百分比
%MEM — 程式使用的實體記憶體百分比
TIME+ — 程式使用的CPU時間總計,單位1/100秒
COMMAND — 程式名稱(命令名/命令列)
計算機埠關聯程式檢視
這裡也是我們最經常用到的,不管是安裝新應用,還是排查應用的程式情況,都需要一個去了解埠是否被佔用,或者根據埠來拿到一個程式的pid。
命令:lsof -i: [埠號]
例如:lsof -i:22
這裡,我們以檢視22埠被監聽的程式為例,這一就能得出,22這個埠被哪一程式監聽,從而得到Pid等多個引數。
COMMAND 程式名稱 | PID 程式識別符號 | USER 程式所有者 | FD 檔案描述符 | TYPE 檔案型別 | DEVICE 指定磁碟名稱|SIZE 檔案大小 | NODE 索引節點 | NAME 開啟檔案的確切名稱
有些系統可能並沒有lsof命令,如果系統在網際網路環境下,可以執行 yum install lsof 進行安裝。
命令:netstat -tunlp | grep [埠號]
有些環境下的linux可能並沒有安裝lsof,並不支援lsof命令,我們又無法安裝losf的時候,我們可以使用linux自帶的netstat來定位。
例如: netstat -tunlp | grep 22
這裡,根據netstat提供的資訊,可以知道哪些程式在監聽22埠,並且得知程式唯一標識pid 。
關於 netstat命令的其他引數這裡不過多解釋,可以自行某度,同樣,若系統無該命令,可以使用 yum -y install net-tools 進行安裝。
計算機記憶體狀態檢視
命令:free -g
除了前面的top可以檢視記憶體的情況,也可以單獨的檢視當前linux記憶體的狀況,那就是 free -g 命令
例如:free -g
詳細欄位解釋為:
total:表示 總計實體記憶體的大小。
used:表示 已使用多少。
free:表示 可用記憶體多少。
Shared:表示多個程式共享的記憶體總額。
Buffers/cached:表示 磁碟快取的大小。
這裡對於記憶體的監控同top一樣,我們還是主要關心 swap 這一欄。
命令:cat /proc/meminfo
確切地說,這個不能叫做命令,只是一個開啟系統級引數檔案的檢視,proc目錄下放著系統的一些資源情況的檔案。
清空快取:echo3 >/proc/sys/vm/drop_caches
當在Linux下頻繁存取檔案後,實體記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放,而是一直作為caching,一直被佔用著,會導致上面的top以及free命令檢視的記憶體計算不夠準確,這時候我們可以通過執行 echo3 >/proc/sys/vm/drop_caches 來進行手動釋放快取。
關於清除快取的詳細細節可以看一下 https://blog.csdn.net/qq_36357820/article/details/79798788
計算機CPU狀態檢視
命令:cat /proc/cpuinfo
和上面的記憶體一樣,這也是在proc這個目錄下檢視當前機器的cpu狀況
例如:cat /proc/cpuinfo
詳細欄位解釋:
processor :系統中邏輯處理核的編號。對於單核處理器,則課認為是其CPU編號,對於多核處理器則可以是物理核、或者使用超執行緒技術虛擬的邏輯核
vendor_id :CPU製造商
cpu family :CPU產品系列代號
model :CPU屬於其系列中的哪一代的代號
model name:CPU屬於的名字及其編號、標稱主頻
stepping :CPU屬於製作更新版本
cpu MHz :CPU的實際使用主頻
cache size :CPU二級快取大小
physical id :單個CPU的標號
siblings :單個CPU邏輯物理核數
core id :當前物理核在其所處CPU中的編號,這個編號不一定連續
cpu cores :該邏輯核所處CPU的物理核數
apicid :用來區分不同邏輯核的編號,系統中每個邏輯核的此編號必然不同,此編號不一定連續
fpu :是否具有浮點運算單元(Floating Point Unit)
fpu_exception :是否支援浮點計算異常
cpuid level :執行cpuid指令前,eax暫存器中的值,根據不同的值cpuid指令會返回不同的內容
wp :表明當前CPU是否在核心態支援對使用者空間的防寫(Write Protection)
flags :當前CPU支援的功能
bogomips :在系統核心啟動時粗略測算的CPU速度(Million Instructions Per Second)
clflush size :每次重新整理快取的大小單位
cache_alignment :快取地址對齊單位
address sizes :可訪問地址空間位數
power management :對能源管理的支援,有以下幾個可選支援功能:ts: temperature sensor
fid: frequency id control
vid: voltage id control
ttp: thermal trip
tm:
stc:
100mhzsteps:
hwpstate:
命令:uptime
如果再細緻一點,檢視當前系統的負載情況,可以使用 uptime來進行檢視
例如:uptime
這裡,第一項是當前時間,up 表示系統正在執行,5:53 是系統啟動的總時間,最後是系統的負載load資訊。
系統負載是處於可執行runnable或不可中斷uninterruptable狀態的程式的平均數。可執行狀態的程式要麼正在使用 CPU 要麼在等待使用 CPU。
不可中斷狀態的程式則正在等待某些 I/O 訪問,例如等待磁碟 IO。
有三個時間間隔的平均值。負載均值的意義根據系統中 CPU 的數量不同而不同,負載為 1 對於一個只有單 CPU 的系統來說意味著負載滿了,而對於一個擁有
4 CPU 的系統來說則意味著 75% 的時間裡都是空閒的。
計算機儲存狀態檢視
命令:df -h
可以對整體的Linux進行一下磁碟整體使用情況的檢視
例如:df -h
Filesystem:檔案系統
Size: 分割槽大小
Used: 已使用容量
Avail: 還可以使用的容量
Use%: 已用百分比
Mounted on: 掛載點
此外,還有部分額外命令
df -hl:檢視磁碟剩餘空間
df -h:檢視每個根路徑的分割槽大小
du -sh [目錄名]:返回該目錄的大小
du -sm [資料夾]:返回該資料夾總M數
du -h [目錄名]:檢視指定資料夾下的所有檔案大小(包含子資料夾)
殺死程式
命令:kill
殺死一個程式 ,在linux中我們使用kill命令,kill命令的基本格式是 kill [引數] [程式號],這裡要說一下這個引數位置,這個引數可放kill的基本引數,具體這裡就不多說了,可以自行去了解,另外可以放訊號,訊號的意思是向作業系統傳送一個殺死程式的命令,並攜帶額外的資訊,例如是強制殺死,還是由你係統稍後殺死。
kill命令可以帶訊號號碼選項,也可以不帶。如果沒有訊號號碼,kill命令就會發出終止訊號(15),這個訊號可以被程式捕獲,使得程式在退出之前可以清理並釋放資源。也可以用kill向程式傳送特定的訊號。
例如我想強制殺死一個程式,立即執行,那訊號值為9 即:kill -9 12342