目的找出系統瓶頸
磁盤(存儲)瓶頸
CPU和記憶體瓶頸
網絡瓶頸
TOP指令
top 運作中可以通過 top 的内部指令對程序的顯示方式進行控制參數含義s改變畫面更新頻率
l關閉或開啟第一部分第一行 top 資訊的表示
t關閉或開啟第一部分第二行 Tasks 和第三行 Cpus 資訊的表示
m關閉或開啟第一部分第四行 Mem 和 第五行 Swap 資訊的表示
N以 PID 的大小的順序排清單示程序清單
P以 CPU 占用率大小的順序排列程序清單
M以記憶體占用率大小的順序排列程序清單
h顯示幫助
n設定在程序清單所顯示程序的數量
q退出 top
統計資訊前五行是系統的統計資訊,第一行是任務隊列資訊,同uptime指令的執行結果
備注:top指令終端下,鍵盤按l可以切換top顯示
第一行Top:01:06:48 表示目前系統時間
up 1:22 表示系統已經運作時間
1 user 表示目前登入使用者的數量
load average 0.06,0.60,0.48 表示相應最近5、10和15分鐘内的平均負載
第二行Tasks:29 total 程序總數
1 running 正在運作的程序數
28 sleeping 睡眠的程序數
0 stopped 停止的程序數
0 zombie 僵屍程序數
第三行Cpu(s):0.3% us 使用者态CPU 時間
1.0% sy 核心态CPU 使用率
0.0% ni 使用者程序空間内改變過優先級的程序占用CPU百分比
98.7% id 代表空閑時間
0.0% wa 代表等待 I/O的CPU時間
0.0% hi 硬體CPU中斷占用百分比
0.0% si 軟中斷占用百分比
0.0% st 虛拟機占用百分比
第四行:191272k total 實體記憶體總量
173656k used 使用的實體記憶體總量
17616k free 空閑記憶體總量
22052k buffers 緩存,主要用于目錄方面,inode值等(ls大目錄可看到這個值增加)
cached 緩存,用于已打開的檔案
第五行:192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閑交換區總量
123988k cached 緩沖的交換區總量,記憶體中的内容被換出到交換區,而後又被換入到記憶體,但使用過的交換區尚未被覆寫,該數值即為這些内容已存在于記憶體中的交換區的大小,相應的記憶體再次被換出時可不必再對交換區寫入。
主體含義:名額含義PID程序ID,程序的唯一辨別符
USER程序所有者的實際使用者名
PR程序的排程優先級。這個字段的一些值是'rt'。這意味這這些程序運作在實時态
NI程序的nice值(優先級)。越小的值意味着越高的優先級。負值表示高優先級,正值表示低優先級
VIRT程序使用的虛拟記憶體。程序使用的虛拟記憶體總量,機關kb。VIRT=SWAP+RES
RES駐留記憶體大小。駐留記憶體是任務使用的非交換實體記憶體大小。程序使用的、未被換出的實體記憶體大小,機關kb。RES=CODE+DATA
SHRSHR是程序使用的共享記憶體。共享記憶體大小,機關kb
SD - 不可中斷的睡眠态。R – 運作态 S – 睡眠态 T – 被跟蹤或已停止 Z – 僵屍态
%CPU自從上一次更新時到現在任務所使用的CPU時間百分比
%MEM程序使用的可用實體記憶體百分比
TIME+任務啟動後到現在所使用的全部CPU時間,精确到百分之一秒
COMMAND運作程序所使用的指令。程序名稱(指令名/指令行)
怎麼判斷系統是否負載過高?
理想每個核不超過1,是以先檢視自己處理器是幾何cat /proc/cpuinfo|grep "cores"|uniq
負載過高:每分鐘平均負載>=cpu核數*3
如何通過CPU名額排查問題?us和ni高,說明使用者态程序占用了較多的 CPU,是以應該着重排查程序的性能問題。
sy高,說明核心态占用了較多的 CPU,是以應該着重排查核心線程或者系統調用的性能問題。
wa 高,說明等待 I/O 的時間比較長,是以應該着重排查系統存儲是不是出現了 I/O 問題。
hi和si,說明軟中斷或硬中斷的處理程式占用了較多的 CPU,是以應該着重排查核心中的中斷服務程式。
CPU使用率計算公式?CPU使用率=1-空閑時間/總CPU時間
記憶體計算公式?total=used+freeused=buffers+cached
什麼是Cache Memory(緩存記憶體)?
當你讀寫檔案的時候,Linux核心為了提高讀寫性能與速度,會将檔案在記憶體中進行緩存,這部分記憶體就是Cache Memory(緩存記憶體)。即使你的程式運作結束後,Cache Memory也不會自動釋放。這就會導緻你在Linux系統中程式頻繁讀寫檔案後,你會發現可用實體記憶體會很少,沒必要手動釋放。
Cache Memory導緻異常?在Linux中頻繁存取檔案,實體記憶體很快用光,而cached一直在增長。Linux會對每次請求過的資料緩存在cache裡,好處就是CPU的處理速度遠遠高于記憶體,是以在CPU和記憶體通訊的時候可以快速從cache中命中結果傳回。
Swap被占用。記憶體可能不夠了,才會占Swap,是以Swap可以作為伺服器監控的一項名額,引起注意。
如何釋放Cache Memory?
drop_caches的值可以是0-3之間的數字,代表不同的含義:不釋放(系統預設值)
釋放頁緩存
釋放dentries和inodes
釋放所有緩存echo 1 > /proc/sys/vm/drop_caches
Linux OOM-killer 記憶體不足時kill高記憶體程序的政策?
Linux 核心有個機制叫OOM killer(Out Of Memory killer),該機制會監控那些占用記憶體過大,尤其是瞬間占用記憶體很快的程序,然後防止記憶體耗盡而自動把該程序殺掉。核心檢測到系統記憶體不足、挑選并殺掉某個程序的過程可以參考核心源代碼linux/mm/oom_kill.c,當系統記憶體不足的時候,out_of_memory()被觸發,然後調用select_bad_process()選擇一個”bad”程序殺掉。如何判斷和選擇一個”bad程序呢?linux選擇”bad”程序是通過調用oom_badness(),挑選的算法和想法都很簡單很樸實:最bad的那個程序就是那個最占用記憶體的程序。
檢視oom-killer服務日志#
grep "Out of memory" /var/log/messages
# 檢視系統日志方法
egrep -i -r 'killed process' /var/log
#
dmesg
為什麼要禁用swap?
swap,這個當記憶體不足時,linux會自動使用swap,将部分記憶體資料存放到磁盤中,這個這樣會使性能下降,為了性能考慮推薦關掉。# /etc/sysctl.conf
vm.swappiness = 0
檢視記憶體占用top10?ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
檢視cpu占用top10?ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
有關記憶體消耗最大程序ps aux --sort -rss | head
檢視程序内部線程占用分析?top -H -P 實際PID
Linux程序及線程限制?# 檢視使用者最大程序數(max user processes)
ulimit -a
# 檢視系統可生成最大線程數
cat /proc/sys/kernel/threads-max
# 檢視單個項目線程數
ps -eLf | grep 項目名 | wc -l
# 檢視程序最大線程數
cat /proc/sys/vm/max_map_count
# 檢視pid上限
cat /proc/sys/kernel/pid_max
# 檢視目前已用的程序或線程數
pstree -p | wc -l
# 檢視linux的線程模型
getconf GNU_LIBPTHREAD_VERSION
修改root使用者最大程序數?echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* hard nproc 65535" >> /etc/security/limits.conf
僵屍程序的産生、危害、規避方法?
含義:子程序終止後,直到父程序調用wait()前的時間裡,子程序被稱為zombie;
具體原因:子程序結束後向父程序發出SIGCHLD信号,父程序預設忽略了它。
父程序沒有調用wait()或waitpid()函數來等待子程序的結束。
網絡原因有時會引起僵屍程序;
危害:僵屍程序會占用系統資源,如果很多,則會嚴重影響伺服器的性能;
規避方法:
讓僵屍程序成為孤兒程序,由init程序回收;(手動殺死父程序)
調用fork()兩次;
捕捉SIGCHLD信号,并在信号處理函數中調用wait函數;