1. 程式人生 > >伺服器效能指標(一)——負載(Load)分析及問題排查

伺服器效能指標(一)——負載(Load)分析及問題排查

平常的工作中,在衡量伺服器的效能時,經常會涉及到幾個指標,load、cpu、mem、qps、rt等。每個指標都有其獨特的意義,很多時候在線上出現問題時,往往會伴隨著某些指標的異常。大部分情況下,在問題發生之前,某些指標就會提前有異常顯示。

對於這些指標的理解和檢視、異常解決等,是程式設計師們重要的必備技能。本文,主要來介紹一下一個比較重要的指標——機器負載(Load),主要涉及負載的定義、檢視負載方式、負載飆高排查思路等。

什麼是負載

負載(load)是linux機器的一個重要指標,直觀了反應了機器當前的狀態。

來看下負載的定義是怎樣的:

In UNIX computing, the system load is a measure of the amount of computational work that a computer system performs. The load average represents the average system load over a period of time. It conventionally appears in the form of three numbers which represent the system load during the last one-, five-, and fifteen-minute periods.(wikipedia)

簡單解釋一下:在UNIX系統中,系統負載是對當前CPU工作量的度量,被定義為特定時間間隔內執行佇列中的平均執行緒數。load average 表示機器一段時間內的平均load。這個值越低越好。負載過高會導致機器無法處理其他請求及操作,甚至導致宕機。

Linux的負載高,主要是由於CPU使用、記憶體使用、IO消耗三部分構成。任意一項使用過多,都將導致伺服器負載的急劇攀升。

檢視機器負載。

在Linux機器上,有多個命令都可以檢視機器的負載資訊。其中包括uptimetopw等。

uptime命令

uptime命令能夠列印系統總共運行了多長時間和系統的平均負載。uptime命令可以顯示的資訊顯示依次為:現在時間、系統已經運行了多長時間、目前有多少登陸使用者、系統在過去的1分鐘、5分鐘和15分鐘內的平均負載。

~ uptime
13:29  up 23:41,3 users, load averages:1.741.871.97

這行資訊的後半部分,顯示”load average”,它的意思是”系統的平均負荷”,裡面有三個數字,我們可以從中判斷系統負荷是大還是小。

1.74 1.87 1.97 這三個數字的意思分別是1分鐘、5分鐘、15分鐘內系統的平均負荷。我們一般表示為load1、load5、load15。

w命令

w命令的主要功能其實是顯示目前登入系統的使用者資訊。但是與who不同的是,w命令功能更加強大,w命令還可以顯示:當前時間,系統啟動到現在的時間,登入使用者的數目,系統在最近1分鐘、5分鐘和15分鐘的平均負載

。然後是每個使用者的各項資料,專案顯示順序如下:登入帳號、終端名稱、遠 程主機名、登入時間、空閒時間、JCPU、PCPU、當前正在執行程序的命令列。

~ w
14:08  up 23:41,3 users, load averages:1.741.871.97
USER     TTY      FROM              [email protected]  IDLE WHAT
hollis   console  -1423:40-
hollis   s000     -1420:24-zsh
hollis   s001     -15- w

從上面的w命令的結果可以看到,當前系統時間是14:08,系統啟動到現在經歷了23小時41分鐘,共有3個使用者登入。系統在近1分鐘、5分鐘和15分鐘的平均負載分別是1.74 1.87 1.97。這和uptime得到的結果相同。 下面還列印了一些登入的使用者的各項資料,不詳細介紹了。

top命令

top命令是Linux下常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員。

~ top
Processes:244 total,3 running,9 stuck,232 sleeping,1484 threads                                                                                                                               14:16:01LoadAvg:1.74,1.87,1.97  CPU usage:8.0% user,6.79% sys,85.19% idle   SharedLibs:116M resident,16M data,14M linkedit.MemRegions:66523 total,2152M resident,50Mprivate,930M shared.PhysMem:7819M used (1692M wired),370M unused. VM:682G vsize,533M framework vsize,6402060(0) swapins,7234356(0) swapouts.Networks: packets:383006/251Min,334448/60Mout.Disks:1057821/38G read,350852/40G written.

PID    COMMAND      %CPU TIME     #TH   #WQ  #PORT MEM    PURG   CMPRS  PGRP  PPID  STATE    BOOSTS          %CPU_ME %CPU_OTHRS UID  FAULTS    COW    MSGSENT   MSGRECV   SYSBSD    SYSMACH   CSW30845  top          3.000:00.491/10213632K0B0B308451394  running  *0[1]0.000000.0000003283+112203556+101770+8212+119901+823+30842GoogleChrom0.000:47.39170155130M0B0B11461146  sleeping *0[1]0.000000.00000501173746269711767837821364228444830310043

上面的輸出結果中,Load Avg: 1.74, 1.87, 1.97顯示的就是負載資訊。

機器正常負載範圍

對於機器的Load到底多少算正常的問題,一直都是很有爭議的,不同人有著不同的理解。對於單個CPU,有人認為如果Load超過0.7就算是超出正常範圍了。也有人認為只要不超過1都沒問題。也有人認為,單個CPU的負載在2以下都可以接受。

為什麼會有這麼多不同的理解呢,是因為不同的機器除了CPU影響之外還有其他因素的影響,執行的程式、機器記憶體、甚至是機房溫度等都有可能有區別。

比如,有些機器用於定時執行大量的跑批任務,這個時間段內,Load可能會飆的比較高。而其他時間可能會比較低。那麼這段飆高時間我們要不要去排查問題呢?

我的建議是,最好根據自己機器的實際情況,建立一個指標的基線(如近一個月的平均值),只要日常的load在基線上下範圍內不太大都可以接收,如果差距太多可能就要人為介入檢查了。

但是,總要有個建議的閾值吧,關於這個值。阮一峰在自己的部落格中有過以下建議:

當系統負荷持續大於0.7,你必須開始調查了,問題出在哪裡,防止情況惡化。

當系統負荷持續大於1.0,你必須動手尋找解決辦法,把這個值降下來。

當系統負荷達到5.0,就表明你的系統有很嚴重的問題,長時間沒有響應,或者接近宕機了。你不應該讓系統達到這個值。

以上指標都是基於單CPU的,但是現在很多電腦都是多核的。所以,對一般的系統來說,是根據cpu數量去判斷系統是否已經過載(Over Load)的。如果我們認為0.7算是單核機器負載的安全線的話,那麼四核機器的負載最好保持在3(4*0.7 = 2.8)以下。

還有一點需要提一下,在Load Avg的指標中,有三個值,1分鐘系統負荷、5分鐘系統負荷,15分鐘系統負荷。我們在排查問題的時候也是可以參考這三個值的。

一般情況下,1分鐘系統負荷表示最近的暫時現象。15分鐘系統負荷表示是持續現象,並非暫時問題。如果load15較高,而load1較低,可以認為情況有所好轉。反之,情況可能在惡化。

如何降低負載

導致負載高的原因可能很複雜,有可能是硬體問題也可能是軟體問題。

如果是硬體問題,那麼說明機器效能確實就不行了,那麼解決起來很簡單,直接換機器就可以了。

前面我們提過,CPU使用、記憶體使用、IO消耗都可能導致負載高。如果是軟體問題,有可能由於Java中的某些執行緒被長時間佔用、大量記憶體持續佔用等導致。建議從以下幾個方面排查程式碼問題:

1、是否有記憶體洩露導致頻繁GC 2、是否有死鎖發生 3、是否有大欄位的讀寫 4、會不會是資料庫操作導致的,排查SQL語句問題。

這裡還有個建議,如果發現線上機器Load飆高,可以考慮先把堆疊記憶體dump下來後,進行重啟,暫時解決問題,然後再考慮回滾和排查問題。

Java Web應用Load飆高排查思路

1、使用uptime檢視當前load,發現load飆高。

~ uptime
13:29  up 23:41,3 users, load averages:101010

2、使用top命令,檢視佔用CPU較高的程序ID。

~ top

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1893 admin     2007127m2.6g38m S 181.732.610:20.26 java

發現PID為1893的程序佔用CPU 181%。而且是一個Java程序,基本斷定是軟體問題。

3、使用 top命令,檢視具體是哪個執行緒佔用率較高

~ top -Hp1893
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
4519 admin     2007127m2.6g38m R 18.632.60:40.11 java

4、使用printf命令檢視這個執行緒的16進位制

~ printf %x 451911a7
~ jstack 1893|grep -A 20011a7"thread-5"#500 daemon prio=10 os_prio=0 tid=0x00007f632314a800 nid=0x11a2 runnable [0x000000005442a000]
java.lang.Thread.State: RUNNABLE
at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:684)
at sun.misc.URLClassPath.findResource(URLClassPath.java:188)
at java.net.URLClassLoader$2.run(URLClassLoader.java:569)
at java.net.URLClassLoader$2.run(URLClassLoader.java:567)
at java.security.AccessController.doPrivileged(NativeMethod)
at java.net.URLClassLoader.findResource(URLClassLoader.java:566)
at org.hibernate.validator.internal.xml.ValidationXmlParser.getInputStreamForPath(ValidationXmlParser.java:248)
at com.hollis.test.util.BeanValidator.validate(BeanValidator.java:30)

從上面的執行緒的棧日誌中,可以發現,當前佔用CPU較高的執行緒正在執行我程式碼的com.hollis.test.util.BeanValidator.validate(BeanValidator.java:30)類。那麼就可以去排查這個類是否用法有問題了。

6、還可以使用jstat(Java命令學習系列(四)——jstat)來檢視GC情況,看看是否有頻繁FGC,然後再使用jmap(Java命令學習系列(三)——Jmap)來dump記憶體,檢視是否存在記憶體洩露。

(全文完)
歡迎關注HollisChuang微信公眾賬號

相關推薦

伺服器效能指標——負載Load分析問題排查

平常的工作中,在衡量伺服器的效能時,經常會涉及到幾個指標,load、cpu、mem、qps、rt等。每個指標都有其獨特的意義,很多時候在線上出現問題時,往往會伴隨著某些指標的異常。大部分情況下,在問題發生之前,某些指標就會提前有異常顯示。對於這些指標的理解和檢視、異常解決等,

伺服器效能指標——CPU利用率分析問題排查

平常的工作中,在衡量伺服器的效能時,經常會涉及到幾個指標,load、cpu、mem、qps、rt等。每個指標都有其獨特的意義,很多時候在線上出現問題時,往往會伴隨著某些指標的異常。大部分情況下,在問題發生之前,某些指標就會提前有異常顯示。 在上一篇文章中,我們介紹了一個

伺服器linux系統啟動web專案環境配置_、jdk下載安裝

官網下載jdk(linux)  檢視linux 多少位 命令:getconf LONG_BIT    下載對應jdk 1.上傳壓縮包            cd ..回

C藝術篇 3-1 指標維陣列1

我們先來看指標與一維陣列的關係,例題如下: 從輸出結果得知,arr是陣列名,它是指標常量,而ptr是指標變數。 arr表示此陣列第一個元素的地址,即arr等同於&arr[0]。 arr可以使用指標變數的*表示符號,如*arr等同於arr[0],*(arr+1)等同於arr[1],依次

指標與陣列的關係維、二維

一、指標和一維陣列間的關係 前提條件: int a[10];//元素個數隨意自己定 int *p = a;//定義指標時直接初始化,也可以分為兩步:int *p; p=a; 第i個元素的地址: &am

Storm集群上的開發 ,Topology任務的編寫 之 WordCount Spout和Blot的分組策略張圖說明問題

topology 技術 流動 .com orm 使用 不同的 alt 分組 Storm的數據從Spout采集後,交給Blot組件處理,數據在Blot之間流動時,會涉及到數據流動的方向。這就是Storm的分組策略。 從WordCount的單詞拆分到單詞計數,會使用按字段的分組

rhcsa考證試題分析天更新五題

linux 運維 rhsca rhsca考試時間:2.5小時 滿分300分210分及格當時我考的是300分(雖然很簡單但是我還是高興)第一題破解redhat7 密碼按e輸入 rd.break再接著 ctrl + xmount -o remount,rw /sysrootchroot /sysro

跟著我從零開始入門FPGA周入門XXOO系列-1、Verilog語法

部分 同步 比較 跑馬燈 begin 寫代碼 人的 thread get (本連載共七部分,這是第一部分) 作者:McuPlayer2013 (EETOP FPGA版塊版主) 原帖地址:http://bbs.eetop.cn/thread-385362-1-1.htm

EF6 在原有數據庫中使用 CodeFirst 總復習、搭建基礎環境

width eight tle sca 使用 圖片 zh-cn span del 本來以為已經會了,可動手時發現許多問題還是模糊不清,正所謂眼高手低。只能重新查資料,再復習一遍。 vs.net2013 ef6 mvc5 sqlserver2008 一、建立數據

Java編程思想、對象導論

java源碼 簡單的 java java語言 綁定 收集 無法訪問 學習 內存池    記錄學習中的思考。主要為了幫助自己鞏固所學知識,也希望能通過自己的總結,為java初學者提供一些啟發。痛並快樂著,堅持就好。    一開始在各種大牛的網上博客上看到推薦《Java編程

ICPC2018南京網絡賽 AC Challenge維狀壓dp

boa tex rst should another fin lec solution cto AC Challenge 30.04% 1000ms 128536K Dlsj is competing in a contes

template,泛型實現閹割版的優先佇列次簡單的嘗試

水完棧和佇列之後,感覺常用的優先佇列也不錯,內部的排序是堆排序,感覺也不是很難,就直接寫上了,但是實現的時候出現了一些問題,幸好有學長在旁邊,幫助我解決了問題,在此感謝LYG學長; 對於排序,仍然自定義型別,然後對於優先順序,進行過載,寫完這個之後感覺對泛型的運用瞭解了一些,對堆的感覺也更強了點

一個線上音樂軟體的故事、故事的由來

這篇文章是講一款線上音樂播放軟體的開發過程,是我寫完這個軟體後的一些總結,我把它寫成了一則小故事,故事把開發過程中的重點部分寫了出來,有些細節的內容還是需要看原始碼。希望這則故事對已經有一些程式設計基礎,想繼續深入學習Python的童鞋起到拋磚引玉的作用。 很久很久以前,故事的由來

linux指令、目錄與檔案

一、文件與目錄 1.Linux檔案屬性 第一個字元代表這個檔案是『目錄、檔案或連結檔等等』: 當為[ d ]則是目錄; 當為[ - ]則是檔案; 若是[ l ]則表示為連結檔(

spring cloud、新建微服務

一、新建spring Cloud專案 選擇cloud discovery->eureka server建立新專案 二、新建一個服務註冊中心(eureka-client) 在啟動類上加上@EnableEurekaServer @EnableEurekaServer @Spring

spring cloud 、服務註冊demo_eureka

        首先我的部落格記理論知識很少,大家對spring boot、spring cloud  、分散式 、微服務什麼的一點概念都沒有的還請先去百度看看理論,知道了是做什麼用的,然後再寫下demo ,這樣學起來才沒有那麼迷糊!   &nbs

【死磕Java並發】—–J.U.C之AQS篇就夠了

ini tle 循環 針對 可能 width als 如果 boolean [隱藏目錄]1 獨占式1.1 獨占式同步狀態獲取1.2 獨占式獲取響應中斷1.3 獨占式超時獲取1.4 獨占式同步狀態釋放2 共享式2.1 共享式

深入理解jvm、ubuntu16編譯openjdk8

1.安裝Bootstrap JDK 直接執行命令: sudo apt-get install openjdk-7-jre sudo apt-get install openjdk-7-jdk 如果出現“沒有可用的軟體包 openjdk-7-jdk,但是它被其它的軟體包引用了。這可能意味著

Zookeeper學習、Linux搭建zookeeper

1.zookeeper單機搭建 下載:wget http://mirrors.shu.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz 解壓:tar -zxvf zookeeper-3.4.12.tar.gz 配置檔案

Spring基礎學習,XMLnew實力物件

與mybatis和hibernate一樣先匯入架包 建立類,專案大致類和包如下 BookServiceImpl 類 public class BookServiceImpl implements BookService{ //之前開發:介面 = 實現類 (serv