導緻cpu負載增高的三個場景:
1.cpu密集型程序
2io密集型,等待io也會導緻負載升高,但是cpu使用率不一定很高
3.大量等待cpu的程序排程
cpu寄存器:是cpu内置的容量小,速度極快的記憶體【儲存程式運作時的一些資料】
cpu計數器:用來儲存cpu正在執行的指令位置或者即将執行的下一條指令位置
cpu上下文切換就是儲存目前運作的cpu寄存器和計數器中的資料然後跳轉到新的程式計數器位置執行其他程序
頻繁的上下文切換會提高cpu負載。
系統調用通常稱為特權模式的切換,從ring0切換到ring3,雖然系統調用也會發生上下文切換但是和程序的上下文切換是不一樣的,程序上下文切換是一個程序切換到另一個程序運作,而系統調用過程一直是同一個程序在運作
stress 系統壓測工具
sysbench 多程序下資料庫性能測試工具,也可以用來多線程壓測linux系統。
sysstat 系統檢測工具軟體包:可以對cpu,記憶體,io等次元監控linux
mpstat:多核cpu檢測工具,實時檢視每個cpu性能名額
mpstat -P ALL 5 #每5秒檢測一次cpu并輸出
pidstat:程序性能分析工具,檢視程序cpu,記憶體,io以及上下文切換等名額
pidstat -u 5 1 #每5秒輸出一次cpu檢測資料
程序上下文切換分為資源切換和非自願切換:
自願切換:程序無法擷取所需資源,如io,記憶體等資源不足
非自願切換:由于時間片已到被系統強制排程,大量程序争奪cpu時容易發生非自願切換
檢視方式:
pidstat -u -w 1 #-u 輸出程序切換名額,
cat cat /proc/interrupts
cpu上下文切換數百到一萬以内都算正常,如果超過一萬或者成數量級增長就很可能出現了cpu性能瓶頸
檢視具體應用的哪個函數引起的cpu負載高:
perf top -g -p 21515 #-g 開啟調用關系分析,-p 指定 php-fpm 的程序号...
節拍率 HZ 是核心的可配選項,可以設定為 100、250、1000 等。不同的系統可能設定不同數值,你可以通過查詢 /boot/config 核心選項來檢視它的配置值。比如在我的系統中,節拍率設定成了 250,也就是每秒鐘觸發 250 次時間中斷。
$ grep 'CONFIG_HZ=' /boot/config-$(uname -r)
cat /proc/stat | grep ^cpu #檢視cpu使用統計資訊
cat /proc/[pid]/stat | grep ^cpu #檢視指定程序cpu使用統計資訊

不同工具測出的cpu使用率可能不一緻, 比如,對比一下 top 和 ps 這兩個工具報告的 CPU 使用率,預設的結果很可能不一樣,因為 top 預設使用 3 秒時間間隔,而 ps 使用的卻是程序的整個生命周期。
碰到正常問題無法解釋的 CPU 使用率情況時,首先要想到有可能是短時應用導緻的問題,比如有可能是下面這兩種情況:
1.應用裡直接調用了其他二進制程式,這些程式通常運作時間比較短,通過 top 等工具也不容易發現
2.應用本身在不停地崩潰重新開機,而啟動過程的資源初始化,很可能會占用相當多的 CPU
對于這類程序,我們可以用 pstree 或者 execsnoop 找到它們的父程序,再從父程序所在的應用入手,排查問題的根源。
################################
strace -p PID #實時跟蹤程序的系統調用
當iowait過多到隻cpu負載過高時【dstat 1 4 #可以同時檢視程序的io和cpu使用情況】:
1.用top找出cpu使用率高的程序
2.pidstat -d -p <PID> 1 4 #檢視指定程序的磁盤io情況
iowait高不一定代表io有性能瓶頸,當系統中隻有io程序運作時iowait也會高,但遠遠沒有達到io的性能瓶頸。
僵屍程序的問題相對容易排查,使用 pstree 找出父程序後,去檢視父程序的代碼,檢查 wait() / waitpid() 的調用,檢查父程序是否遺漏了退出時子程序銷毀
################################
cpu中斷:
為了解決中斷處理程式執行過長和中斷丢失的問題,Linux 将中斷處理過程分成了兩個階段,也就是上半部分和下半部分
上半部用來快速進行中斷,它在中斷禁止模式下運作,主要處理跟硬體緊密相關的或時間敏感的工作。上半部直接處理硬體請求,也就是我們常說的硬中斷,特點是快速執行;
下半部用來延遲處理上半部未完成的工作,通常以核心線程的方式運作,而下半部則是由核心觸發,也就是我們常說的軟中斷,特點是延遲執行。
上半部會打斷 CPU 正在執行的任務,然後立即執行中斷處理程式。而下半部以核心線程的方式執行,并且每個 CPU 都對應一個軟中斷核心線程,名字為 “ksoftirqd/CPU 編号”,比如說, 0 号 CPU 對應的軟中斷核心線程的名字就是 ksoftirqd/0。
/proc/softirqs 提供了軟中斷的運作情況;
/proc/interrupts 提供了硬中斷的運作情況。
一般來說,ps 的輸出中,名字括在中括号裡的,一般都是核心線程。
軟中斷過導緻cpu使用率高的解決思路:
從系統的軟中斷使用率高這個現象出發,通過觀察 /proc/softirqs 檔案的變化情況,判斷出軟中斷類型是網絡接收中斷
# -n DEV 表示顯示網絡收發的報告,間隔 1 秒輸出一組資料
sar -n DEV 1
tcpdump 抓包找出可疑發包ip
防火牆禁用ip
##########
OOM(OUT OF MEMORY):
echo -16 > /proc/$(pidof sshd)/oom_adj
oom_adj 的範圍是 [-17, 15],數值越大,表示程序越容易被 OOM 殺死;數值越小,表示程序越不容易被 OOM 殺死,其中 -17 表示禁止 OOM。
cachetop #檢視程序緩存使用情況
cachestat #檢視系統緩存使用情況
/pro/zoneinfo #檢視記憶體情況(page_min page_high page_low)
/proc/sys/vm/swappiness 選項,用來調整使用 Swap 的積極程度。swappiness 的範圍是 0-100,數值越大,越積極使用 Swap,也就是更傾向于回收匿名頁;數值越小,越消極使用 Swap,也就是更傾向于回收檔案頁。
#建立基于檔案的swap
# 建立 Swap 檔案
$ fallocate -l 8G /mnt/swapfile
# 修改權限隻有根使用者可以通路
$ chmod 600 /mnt/swapfile
# 配置 Swap 檔案
$ mkswap /mnt/swapfile
# 開啟 Swap
$ swapon /mnt/swapfile
轉載于:https://www.cnblogs.com/dufeixiang/p/10914402.html