文章目錄
- 問題排查
-
- 1 伺服器資訊檢視
-
- top指令使用
- 顯示資訊詳解
-
- top指令第一行
- top指令第二行--程序狀态
- top指令第三行--CPU狀态
- top指令第四行--記憶體狀态
- top指令第五行--swap交換分區
- top指令第七行--程序監控
- 2 資料庫分析
- 3 慢查詢分析
- 問題解決
- mysql索引相關傳送門
問題排查
1 伺服器資訊檢視
top指令使用
使用top指令進行伺服器相關資訊檢視,檢視是記憶體不夠、CPU處理能力不夠、IO讀寫過高….等。
伺服器為多核,是以需要按下按鍵“1”檢視全部CPU具體資訊。
顯示資訊詳解
top指令第一行
top - 11:01:20 up 486 days, 19:31, 1 user, load average: 0.21, 0.28, 0.30
依次對應:系統目前時間 up 系統到目前為止i運作的時間, 目前登陸系統的使用者數量, load average後面的三個數字分别表示距離現在一分鐘,五分鐘,十五分鐘的負載情況。
這行資訊與指令uptime顯示的資訊相同
注意:load average資料是每隔5秒鐘檢查一次活躍的程序數,然後按特定算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高于5的時候就表明系統在超負荷運轉了。
top指令第二行–程序狀态
Tasks: 183 total, 1 running, 182 sleeping, 0 stopped, 0 zombie
依次對應:tasks表示任務(程序),183 total則表示現在有183個程序,其中處于運作中的有1個,182個在休眠(挂起),stopped狀态即停止的程序數為0,zombie狀态即僵屍的程序數為0個。
top指令第三行–CPU狀态
%Cpu(s): 0.6 us, 0.2 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 4.1 st
依次對應:
us:user 使用者空間占用cpu的百分比
sy:system 核心空間占用cpu的百分比
ni:niced 改變過優先級的程序占用cpu的百分比
空閑cpu百分比
wa:IO wait IO等待占用cpu的百分比
hi:Hardware IRQ 硬中斷 占用cpu的百分比
si:software 軟中斷 占用cpu的百分比
st:被hypervisor偷去的時間
多核伺服器需要展開檢視具體CPU狀态
top指令第四行–記憶體狀态
KiB Mem : 32753588 total, 1142352 free, 25133012 used, 6478224 buff/cache
依次對應:實體記憶體總量;空閑記憶體總量;使用中的記憶體總量;緩沖記憶體量;
第四行中使用中的記憶體總量(used)指的是現在系統核心控制的記憶體數,空閑記憶體總量(free)是核心還未納入其管控範圍的數量。納入核心管理的記憶體不見得都在使用中,還包括過去使用過的現在可以被重複利用的記憶體,核心并不把這些可被重新使用的記憶體交還到free中去,是以在linux上free記憶體會越來越少,但不用為此擔心
top指令第五行–swap交換分區
KiB Swap: 4194300 total, 2880252 free, 1314048 used. 6677308 avail Mem
依次對應:交換區總量;空閑交換區總量;使用的交換區總量;在不交換的情況下,對啟動新應用程式可用記憶體的估計
對于記憶體監控,在top裡我們要時刻監控第五行swap交換分區的used,如果這個數值在不斷的變化,說明核心在不斷進行記憶體和swap的資料交換,這是真正的記憶體不夠用了。
top指令第七行–程序監控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 1
依次對應:
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 — 程序名稱(指令名/指令行)
2 資料庫分析
show PROCESSLIST
檢視資料庫程序資訊,從執行及等待時間查找慢語句
有時info的sql語句過長無法全部顯示,則需要使用下面指令
select * from information_schema.processlist;
show OPEN TABLES where In_use > 0;
查詢是否鎖表 ,使用下面指令可進行鎖表程序kill
SELECT CONCAT(‘kill ‘,trx_mysql_thread_id,’;’) FROM INFORMATION_SCHEMA.INNODB_TRX;
反複執行該語句檢視是否存在同一程序或程序過多,直接執行“kill 4147”則可殺死該程序
3 慢查詢分析
開啟并配置完慢查詢日志後,超過配置閥值的查詢時間語句會寫入slow.log中。【如何開啟及配置不做描述,可查閱相關資料】
使用tail指令動态閱讀慢查詢日志看是否存在長時間查詢語句,如下。
若日志重新整理過快可使用日志截取語句進行截取:
先進入log所在檔案夾下:
sed -n "/16:40:00/,/16:53:00/p" slow.log >2021slow.log
問題解決
由于大量通路造成的資料庫查詢壓力,排查慢查得知查詢過慢語句,添加索引進行優化處理。
mysql索引相關傳送門
MySQL索引的建立與使用
mysql 如何添加索引
USING BTREE 是什麼意思 有什麼作用 Mysql