Linux服務器性能(一)-CPU

轉載自:https://blog.csdn.net/hguisu/article/details/39373311

  

1、前言簡介

Linux性能評估與優化:cpu,內存,IO, 網絡

1.1、系統性能分析工具

1.常用系統命令
vmstat、sar、iostat、netstat、free、ps、top等

2.常用組合方式

  • 用vmstat、sar、iostat檢測是否是CPU瓶頸
  • 用free、vmstat檢測是否是內存瓶頸
  • 用iostat檢測是否是磁盤I/O瓶頸
  • 用netstat檢測是否是網絡帶寬瓶頸(netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c) netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

1.2、系統工具圖:

  

2、負載:整體性能評估

2.1系統整體性能評估(uptime/top)

  • uptime
16:38:00 up 118 days,  3:01,  5 users,  load average: 1.22, 1.02, 0.91

這裏需要注意的是:load average這個輸出值,這三個值的大小一般不能大於系統CPU的個數,例如,本輸出中系統有8個CPU,如果load average的三個值長期大於8時,說明CPU很繁忙,負載很高,可能會影響系統性能,但是偶爾大於8時,倒不用擔心,一般不會影響系統性能。相反,如果load average的輸出值小於CPU的個數,則表示CPU還有空閒的時間片,比如本例中的輸出,CPU是非常空閒的。

  • top
    系統負載指運行隊列的平均長度,也就是等待CPU的平均進程數。Load越高說明系統響應越慢,如果load是0,代表進程不需要等待,立刻就能獲得cpu運行。可以通過查詢文件/proc/loadavg獲取系統在前一分鐘、前五分鐘和前十五分鐘的平均負載以及當前運行的進程、系統的進程數和上一次調度運行的進程。
    top顯示中,RES:進程佔用的物理內存大小,VIRT:物理內存+虛擬內存。

  • sar
    利用sar命令監控系統CPU,sar功能很強大,可以對系統的每個方面進行單獨的統計,但是使用sar命令會增加系統開銷,不過這些開銷是可以評估的,對系統的統計結果不會有很大影響。


什麼場景會造成負載很高但CPU低?
  負載總結爲一句話就是:需要運行處理但又必須等待隊列前的進程處理完成的進程個數。具體來說,也就是如下兩種情況:
  1)等待被授權予CPU運行權限的進程
  2)等待磁盤I/O完成的進程

  ps -eLf可以查看系統的線程。cpu低而負載高也就是說等待磁盤I/O完成的進程過多,就會導致隊列長度過大,這樣就體現到負載過大了,但實際是此時cpu被分配去執行別的任務或空閒,通過以下命令查看:

1、IOWAIT:通過top命令查看CPU等待IO時間,即%wa;
2、磁盤IO: 通過iostat -d -x -m 1 10查看磁盤IO情況;
3、網絡IO:通過sar -n DEV 1 10查看網絡IO情況;

通過如下命令查找佔用IO的程:
ps -e -L h o state,cmd | awk ‘{if($1==“R”||$1==“D”){print $0}}’ | sort | uniq -c | sort -k 1nr

具體場景有如下幾種:

  • 場景1:內存耗盡,如果沒有開啓swap內存,也將會導致負載特別高,cpu使用很低。
  • 場景2:磁盤讀寫請求過多就會導致大量I/O等待。cpu的工作效率要高於磁盤,而進程在cpu上面運行需要訪問磁盤文件,這個時候cpu會向內核發起調用文件的請求,讓內核去磁盤取文件,這個時候會切換到其他進程或者空閒,這個任務就會轉換爲不可中斷睡眠狀態。當這種讀寫請求過多就會導致不可中斷睡眠狀態的進程過多,從而導致負載高,cpu低的情況。
  • 場景3:MySQL中存在沒有索引的語句或存在死鎖等情況。我們都知道MySQL的數據是存儲在硬盤中,如果需要進行sql查詢,需要先把數據從磁盤加載到內存中。當在數據特別大的時候,如果執行的sql語句沒有索引,就會造成掃描表的行數過大導致I/O阻塞,或者是語句中存在死鎖,也會造成I/O阻塞,從而導致不可中斷睡眠進程過多,導致負載過大。具體解決方法可以在MySQL中運行show full processlist命令查看線程等待情況,把其中的語句拿出來進行優化。
  • 場景4:外接硬盤故障,常見有掛了NFS,但是NFS server故障。比如我們的系統掛載了外接硬盤如NFS共享存儲,經常會有大量的讀寫請求去訪問NFS存儲的文件,如果這個時候NFS Server故障,那麼就會導致進程讀寫請求一直獲取不到資源,從而進程一直是不可中斷狀態,造成負載很高。
  • 場景5:訪問第三方api接口。如果我們訪問第三方http api,例如接口的響應時間很慢,readTimeout=2000ms,在高併發的情況下,很多線程都被中斷等待api的網絡IO。導致cpu使用率很低,但是load很高。
  • 場景6:系統出現大量的僵死進程。ps -aux | grep D | grep df,出現此種情況時,可能是由於僵死進程導致的。可以通過指令 ps -axjf 查看是否存在 D 狀態進程。D 狀態是指不可中斷的睡眠狀態。該狀態的進程無法被 kill,也無法自行退出。只能通過恢復其依賴的資源或者重啓系統來解決。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章