面試官都這么問了,我能說不能嗎?
生產服務器變慢了,一般都是從這幾點去分析:服務器整體情況, CPU 使用情況,內存,磁盤,磁盤 IO ,網絡 IO
一一來說
top
看服務器整體使用情況,一般都是 top 命令搞定
我知道當你看到這張圖的時候,肯定有點兒懵,特別是一個個的數字,這都是個啥?
阿粉帶你一行一行的看
第 1 行:系統時間、運行時間、登錄終端數、系統負載(三個數值分別為1分鍾、5分鍾、15分鍾內的平均值,數值越小意味着負載越低)
第 2 行:進程總數、運行中的進程數、睡眠中的進程數、停止的進程數、僵死的進程數。一般情況下,只要沒有僵死的進程,就沒啥大問題。
第 3 行:用戶占用資源百分比、系統內核占用資源百分比、改變過優先級的進程資源百分比、空閑的資源百分比等。
第 4 行:物理內存總量、內存空閑量、內存使用量、作為內核緩存的內存量
第 5 行:虛擬內存總量、虛擬內存空閑量、虛擬內存使用量、已被提前加載的內存量
第 6 行里面主要看 PID 和 COMMAND 這兩個參數,其中 PID 就是進程 ID , COMMAND 就是執行的命令,能夠看到比較靠前的兩個進程都是 java 進程
在當前這個界面,按下數字鍵盤 1 能夠看到各個 CPU 的詳細利用率
vmstat
想要了解 CPU 使用情況的話,常用的命令就是 vmstat 。
一般 vmstat 工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔,單位是秒,第二個參數是采樣的次數,阿粉這次的命令是:vmstat -n 3 2
意思就是隔 3 秒取樣一次,一共取樣 2 次
其中主要關注 procs 和 cpu 這兩個參數
procs :
- r :運行和等待 CPU 時間片的進程數,一般來說整個系統的運行隊列不要超過總核數的 2 倍,要不然系統壓力太大了
- b : 等待資源的進程數,比如正在等待磁盤 IO ,網絡 IO 這種
cpu :
- us :用戶進程消耗 CPU 時間百分比, us 值高的話,說明用戶進程消耗 CPU 時間比較長,如果長期大於 50% 的話,那就說明程序還有需要優化的地方
- sy :內核進程消耗的 CPU 時間百分比
- us + sy 參考值為 80% ,如果大於 80% 的話,說明可能存在 CPU 不足
free
查看內存情況用的就是 free , 它主要有三個命令:free
free -g
free -m
,阿粉是推薦free -m
為啥呢,咱們瞅瞅它們各自的運行結果就知道了
其中:free
命令運行結果顯示的非常不友好,看到 3880324 可以快速告訴我它是多大嗎?free -g
這個命令四舍五入了,明明給的內存是 4G ,結果使用free -g
一查看,竟然成了 3G ?excuse me ?如果線上環境出問題了,你說因為內存給的不夠,運維說,這鍋我可不背
相對來說,free -m
是比較容易看,而且結果也是比較精確的
如果應用程序可用內存/系統物理內存大於 70% 的話,說明內存是充足的,沒啥問題,但是如果小於 20% 的話,就要考慮增加內存了
linux 出錯 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”
現象服務器負載很高,但是CPU利用率不高。服務器經常夯住,網站打不開,SSH連接非常不穩定,輸入命令夯住。
一般情況下,linux會把可用內存的40%的空間作為文件系統的緩存。當緩存快滿時,文件系統將緩存中的數據整體同步到磁盤中。但是系統對同步時間有最大120秒的限制。如果文件系統不能在時間限制之內完成數據同步,則會發生上述的錯誤。這通常發生在內存很大的系統上。系統內存大,則緩沖區大,同步數據所需要的時間就越長,超時的概率就越大。
解決方法:縮小文件系統緩存大小
此種方案是降低緩存占內存的比例,比如由40%降到10%,這樣的話需要同步到磁盤上的數據量會變小,IO寫時間縮短,會相對比較平穩。
文件系統緩存的大小是由內核參數vm.dirty_ratio 和 vm.dirty_backgroud_ratio控制決定的。
vm.dirty_background_ratio指定當文件系統緩存臟頁數量達到系統內存百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等后台回寫進程運行,將一定緩存的臟頁異步地刷入外存。
vm.dirty_ratio則指定了當文件系統緩存臟頁數量達到系統內存百分之多少時(如10%),系統不得不開始處理緩存臟頁(因為此時臟頁數量已經比較多,為了避免數據丟失需要將一定臟頁刷入外存),在此過程中很多應用進程可能會因為系統轉而處理文件IO而阻塞。
通常情況下,vm.dirty_ratio的值要大於vm.dirty_background_ratio的值。
下面說一下修改這兩個參數的流程。
(1)首先查看系統當前的vm.dirty_ratio 和 vm.dirty_ background_ratio的值。
sysctl -a | grep dirty
由上可知,當前環境下,vm.dirty_ratio=20 ,vm.dirty_ background_ratio=10。在此情況下,會出現上述問題。
(2)修改vm.dirty_ratio和vm.dirty_ background_ratio的值。
把vm.dirty_ratio修改為10 ,vm.dirty_background_ratio修改為5。在命令行輸入如下命令:
./sbin/sysctl -w vm.dirty_ratio=10
./sbin/sysctl -w vm.dirty_background_ratio=5
(3)使參數修改立即生效。
sysctl -p
(4)永久修改內核參數
可以修改系統信息配置文件sysctl.conf,此配置文件在/etc目錄下。打開配置文件在最后添加如下兩行代碼:
vm.dirty_background_ratio=5
vm.dirty_ratio=10
手動釋放內存
/proc/sys/vm/drop_caches (since Linux 2.6.16) Writing to this file causes the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches; to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first. (盡量不要更改內核參數)
在釋放之前,通過sync命令將內存同步到磁盤
MESSAGE導致內存變大
原因是syslog記錄了許多Info日志,而應用程序因不嚴謹也會被統計到Message里面去,處理方法是清空 /var/log/messages,重啟systemctl restart rsyslog
df
如果排查磁盤問題的話,首先要看的就是磁盤空間夠不夠,還記得阿粉在上家公司的時候,用的還是 svn 出現了一個很神奇的問題,就是哪里都不報錯,就是提交不上代碼,排查到最后是磁盤空間不夠...
所以別問阿粉為啥排查磁盤問題時,第一就是看磁盤空間夠不夠!!!
查看磁盤空間就是df
或者df -h
這兩個命令了
還有一種情況是Inodes節點用完,無法創建文件,找到較多的文件刪除就可以釋放掉
iostat
說到磁盤 IO 相信你一定能夠想到,在對數據庫進行操作時,第一要考慮到的就是磁盤 IO 操作,因為相對來說,如果在某個時間段給磁盤進行大量的寫入操作會造成程序等待時間長,導致客戶端那邊好久都沒啥反應,用戶體驗就降低了嗎
檢查磁盤 IO 情況的命令就是 iostat ,如果你用的時候發現提示:-bash: iostat: command not found
,那是因為沒有安裝 sysstat ,安裝一下就可以了:yum install -y sysstat
接下來運行命令:iostat -xdk 3 2
,和vmstat
命令很像有沒有~
這么多指標咱們不需要都關注,只要看其中這幾個就可以了:
- rkB/s :每秒讀取數據量 kB ;
- wkB/s :每秒寫入數據量 kB ;
- svctm :I/O 請求的平均服務時間,單位毫秒;
- util :一秒中有百分之幾的時間用於 I/O 操作,如果接近 100% 說明磁盤帶寬跑滿了,這個時候就要優化程序或者增加磁盤了
sar
網絡 IO 的話,可以通過sar -n DEV 3 2
這條命令來看,和上面的差不多,意思就是每隔 3 秒取樣一次,一共取樣 2 次。
其中:
- IFACE :LAN 接口
- rxpck/s :每秒鍾接收的數據包
- txpck/s :每秒鍾發送的數據包
- rxKB/s :每秒接收的數據量,單位 KByte
- txKB/s :每秒發出的數據量,單位 KByte
- rxcmp/s :每秒鍾接收的壓縮數據包
- txcmp/s :每秒鍾發送的壓縮數據包
- rxmcst/s:每秒鍾接收的多播數據包
這種方式特別簡單直觀,對新手來說比較容易看到
OK ,下次面試官問你生產服務器變慢了,你能談談診斷思路嗎?咋不能呢,從服務器整體情況開始說,一直到網絡 IO ,再也不怕和面試官扯皮了