服務器為什么這么慢?耗盡了CPU、RAM和磁盤I/O資源


  機器運行緩慢通常是由於消耗了太多系統特定的資源。系統的主要資源包括CPU、RAM、磁盤I/O以及網絡。過度使用這些資源的任何一種都會讓系統陷入困境。不過,如果能登錄到系統之中,可以借助大量工具確定問題的起因。

1.系統負載

解決引起系統運行緩慢的問題時,平均系統負載可能是最先用到的基本度量標准。

最常用的命令是uptime:

  load average 后面的3個數字2.03、30.17 和 15.09分別代表了1分鍾、5分鍾和15分鍾內機器的平均負載。一個系統的平均負載等於處於運行或者不可打擾狀態進程的平均數。

  平均負載為1的單CPU系統意味着這個CPU處於恆定負載。如果單CPU系統的平均負載是4,那么這個系統處於它可承受負載能力的4倍,所以3/4的進程都在等待資源。負載狀態為1的單CPU系統與負載狀態為4的四CPU系統使用資源的量一樣。

  這個例子中,5分鍾內和15分鍾內的平均負載都很低,但是1分鍾內的平均負載卻很高,所以知道負載的飆升相對而言發生在最近。通常我們會連續運行多次uptime命令(或者使用top命令)來觀察負載是持續上升還是正在下降。

 什么是高平均負載:

  這取決於產生高負載的原因。因為負載描述了正在使用資源的活動進程的平均數量,所以負載的飆升透露了很多信息。明確負載是CPU密集型(等待CPU資源的進程)、RAM密集型(尤其是,頻繁使用的RAM被移入了交換區)還是I/O密集型(爭奪磁盤或網絡I/O資源的進程)非常重要。
  通常CPU密集型的系統會比I/O密集型的系統響應度更高。我見過數以白計CPU密集型的系統,仍然可以在這些系統上運行故障排除工具而且具有良好的響應時間。I/O負載相對較低的I/O密集型系統,只是登錄系統就需要花費一段時間,因為它們的磁盤I/O完全飽和了。用盡RAM資源的系統通常與I/O密集型的系統表現相同,因為一旦系統開始使用磁盤上的交換存儲,它就會消耗磁盤資源,導致進程逐漸變慢直至停止。

2.使用top命令解決負載問題

  當需要解決高負載問題的時候,第一個想到的工具是top命令。你能看到系統的實時信息,包括系統啟動了多久、負載平均值、系統中總共有多少進程在運行、總共有多少內存、使用了多少內存、還剩多少內存,最后還包含系統的進程列表以及它們占用的資源數量。top命令默認排序方式是按照進程的CPU使用情況從上到下排序,可以一眼就看到那些進程正在消耗CPU資源。

 

終止進程:

  top命令輸出的第一列是PID,想要終止某個進程,只需按下K鍵,然后輸入想要終止的PID,最后系統提示該進程將會終止與signal 15時,按下Enter鍵即可。

完整輸出:

  默認情況top命令是在非交互模式下,如果想看到top命令的完整輸出,或將信息重定向到文件中,-b選項可以開啟批處理模式,-n選項可以控制在退出top命令之前,刷新信息多少次。

查看完整的輸出,僅需運行一次top命令:

top -b -n 1

將信息存儲到名為top_output文件中:

top -b -n 1 > top_output

如果想看top命令的輸出,同時將該輸出寫入文件,那么可以使用tee工具:

top -b -n 1 | tee top_output

2.1了解top命令的輸出

top命令輸出的第一行與之前見到的uptime命令輸出一致。

top命令提供了額外的度量標准。例如,Cpu(s)這一行提供了當前CPU運行情況的信息。

縮寫代表的意義:
us:用戶CPU時間
運行非優雅的用戶進程所占CPU時間的百分比(優雅,英文“nicing”,是指一個進程允許你根據其他進程更改優先級)。
sy:系統CPU時間
運行內核和內核進程所占CPU時間的百分比。
ni:優雅CPU時間
如果更改過一些進程的優先級,這個指標能夠告訴你它們所占CPU時間的百分比。
id:CPU空閑時間
這是你希望具備很高數值的度量指標中的一個。它代表了CPU的空閑時間比。如果系統運行緩慢,但是這個指標特別高,那么你就可以確定問題的原因不是高CPU負載。
wa:I/O等待
這個數字代表了CPU時間用在等待執行I/O操作所占的百分比。當你解決運行緩慢的系統問題的時候,這是一個非常有價值的度量指標,如果這個數值很低,那么就能輕松排除磁盤或者網絡I/O的問題。
hi:硬件中斷
CPU用於處理硬件中斷所占時間的百分比。
si:軟件中斷
CPU用於處理軟件中斷所占時間的百分比。
st:流逝的時間
如果你正在運行虛擬機,這個度量指標會告訴你虛擬機中執行的其他任務所占CPU時間的百分比。

  從以上例子中,可以看出系統有超過50%的空閑時間,這與機器具備4個CPU、系統負載為1.70的指標項匹配。當處理一個運行緩慢的系統的時候,首先要觀察的度量指標之一就是I/O等待時間,它可以用來排除磁盤I/O的問題,如果I/O等待時間很低,那么可以看看CPU空閑時間百分比;如果I/O等待時間很高,那么下一步就是確定是什么因素導致I/O等待時間所占的比重這么高。如果I/O等待和CPU空閑時間百分比都很低,那么狠可能會看到一個非常高的用戶時間百分比,所以必須確定是什么原因導致了這么高的用戶時間百分比。如果I/O等待時間所占百分比很低,而空閑時間百分比很高,就知道系統運行緩慢不是CPU資源的原因,而應該從別的地方找原因。這可能意味着應該查看網絡問題或web服務器的問題,或查看MySQL查詢緩慢的問題等。

2.2 解決高用戶時間的問題

  解決故障的過程中一個常見而又相對簡單的問題是,由用戶CPU時間百分比高引起的高負載問題。如果發現用戶時間百分比高但I/O等待時間百分比卻很低,很顯然你需要確定系統中哪一個進程占用了大量的CPU資源。默認情況,top會按照各個進程CPU使用率由高到低排序。

  這個例子中,mysqld進程消耗了53%的CPU時間,nagios2db_status進程消耗了12%的CPU時間。這個數字代表的是鎖占單個CPU的百分比,如果擁有一台具備4個CPU的機器,可能會看到多個進程都消耗了99%的CPU時間。

  通常情況下很容易確定,top命令輸出中前一兩個進程都是非常高的CPU百分比,而其余進程所占CPU百分比相對很低,此時解決方法就是終止大量使用CPU資源的進程(按K鍵,然后輸入對應進程的PID)。

  在多進程的情況下,如果讓系統做了太多事。比如,在Web服務器中可能有大量Apache進程,還有cron中運行的部分日志解析腳本。這些進程會消耗差不多等量的CPU資源。這種問題的解決方案從長期來看相當復雜。以Web服務器為例,你的確需要運行全部Apache進程,同時你可能還需要日志解析工具。在短期內,你可以終止(或推遲)一些進程直到負載降低,但從長期來看,你可能需要考慮增加系統資源或將這些功能分拆到多台服務器上。

2.3解決內存不足的問題

top輸出中以下兩行提供了非常有價值的RAM使用情況的信息。在處理特定的系統問題之前,排除內存問題非常重要。

  第1行告訴我們有多少物理內存可用、占用了多少內存、空閑內存以及緩存了多少內存。第2行為我們提供了相似的信息,交換存儲以及Linux文件緩存使用了多少RAM。需要注意得是系統僅顯示26768KB空閑內存。

  想找出進程到底使用了多少RAM,必須刨除RAM中的文件緩存。在已用的997408KB的RAM中,有286040KB的RAM被文件緩存占用,所以說實際上僅使用了711368KB的RAM。在這個例子中,系統仍然有大量可用的內存資源,幾乎沒有使用任何交換存儲。即便看到使用了一些交換存儲,這也不足以作為問題的征兆。如果一個進程轉為空閑狀態,Linux通常會將它占用的RAM釋放,供其他進程使用。辨別是否耗盡了RAM的一個好方法是查看文件緩存。如果實際用的內存減去文件緩存的值很大,同時交換存儲的值也很高,很可能的確有內存問題。

  如果發現了內存問題,下一步就是確定哪些進程消耗了RAM。top默認按照CPU的使用率排序,所以你需要將其改為按照RAM使用率來排序,保持top的打開狀態,然后按下M鍵。這就會讓所有進程按照RAM的使用率排序。

注意%MEM這一列,會看到前幾個進程占用了大量RAM。如果找到大量使用RAM的進程,可以終止它們,或者根據程序,通過專門的故障排除方法來尋找是什么原因導致這些進程占用了大量RAM。

注意:
  實際上top命令的輸出可以根據任何列排序。想要更改top輸出的排序方式,按F鍵進入選擇排序列的界面。在按下對應特定列的按鍵之后(比如,K對應CPU列),再按Enter鍵就能回到top的輸出界面。
  Linux內核也有一個內存耗盡(OOM)終結者,如果低內存導致系統運行危險,它就會介入。當系統內存快要耗盡的時候,OOM終結者就會開始終結進程。有些情況下,終止的可能是占用大量RAM的進程,但它並不能保證不會終止未占用大量RAM的進程。有的時候它也會終止像sshd這樣的程序或者其他進程,而不是真正的罪魁禍首。很多時候,OOM終止了一些進程之后,系統就會變得不大穩定,所以你不得不重啟機器以確保所有的系統進程都在正常運行。如果OOM終結者介入了,在/var/log/syslog中你會看到如下行:

2.4 解決高I/O等待時間問題

  當看到I/O等待時間所占CPU時間的比重很高的時候,首先檢查機器是否正大量使用交換空間。因為磁盤操作的速度遠遠低於RAM,所以當系統內存耗盡,開始使用交換空間的時候,系統的性能會受到嚴重影響。任何想要訪問硬盤的操作都要完成與硬盤的I/O交換。所以,故障排除的第一步是看內存是否耗盡,如果是,先解決這個問題。如果還有大量可用的RAM,你需要明確哪個進程占用了大部分I/O操作。

  有的時候很難弄明白到底是哪個進程占用了大量I/O資源,但是如果系統中存在多個分區,可以縮小范圍,找到哪個分區正在執行大量I/O操作。想要做到這一點,需要使用iostat程序,基於Red Hat和基於Debian的系統的sysstat包中都提供了這個程序。如果機器沒安裝,可以通過包管理工具來安裝。

首先看到的是與top命令相似的CPU信息,下面緊跟着系統上所有硬盤設備以及分區的I/O狀態信息。各列代表的意義:

tps
這個值列出了設備每秒的傳輸量。“傳輸”(Transfer)是向設備發送I/O請求的另一種表達方式。
Blk_read/s
表示每秒從設備讀取的數據量。
Blk_wrtn/s
表示每秒從設備寫入的數據量。
Blk_read
這一列表示從設備讀取的數據總量。
Blk_wrtn
這一列表示寫入設備的數據總量。

  當系統處於高I/O負載狀態的時候,首先就是觀察每個分區,看看哪個分區的I/O負載最高。比如,有一台數據庫服務器,數據庫本身存儲在/dev/sda3分區。如果看到大量的I/O操作來自這里,這就是一個很高的線索:數據庫很可能占用了大量I/O資源。

  弄明白這一點后,下一步就是確定I/O操作大部分來自讀取還是寫入。假設懷疑備份工作導致了I/O操作的增長。因為備份工作的操作主要集中於從文件系統中讀取文件,然后通過網絡傳輸到備用服務器,如果大量的I/O操作都來自於寫入而不是讀取操作,那么大概就可以排除這個問題。

 注意:

  你可能需要運行iostat命令多次,以此得到系統當前的精確I/O狀況。如果在命令行指定一個數字參數,iostat就會持續運行並根據指定的秒數刷新輸出信息。比如說,如果你想要每2秒看到一次iostat的輸出,就可以輸入iostat 2。如果你有任何NFS共享,iostat另一個非常有用的參數是-n,當你指定了-n參數,iostat就會給出所有NFS共享的I/O統計信息。

 除了iostat,還有一個很簡單的工具,它是top和iostat程序的混合體,能夠顯示系統中所有運行進程並將進程根據I/O統計信息排序。在默認情況下沒有安裝這個程序,可以再iotop包中找到它。

在這個例子中,會看到rsync進程執行了大量I/O讀取操作。

2.3問題發生后的高負載處理

問題發生后的排查原因,只需要稍微多做一點工作,就能在服務器上安裝相應的工具,記錄全天的性能數據。

sysstat包中iostat工具能來解決高I/O的問題,sysstat也包含一些能報告CPU和RAM使用情況的工具。雖然可以使用top命令達到這個目的,但是sysstat更加強大,它能夠用一種簡單的機制來記錄系統的統計信息,如CPU負載、RAM以及I/O狀態。借助這些統計信息,當有人抱怨昨天中午系統很慢時,就可以查看日志,看看是什么原因引起的這個問題。

注意:
  現在可以很方便得通過zabbix監控做到。

3.1配置sysstat

  在基於Red Hat的系統上,需要修改/etc/sysconfig/sysstat文件,更改HISTORY選項,讓它可以記錄7天以上的統計信息。統計信息可以每10分鍾抓取一次並記錄每日總結。默認是記錄28天。
  一旦啟用了sysstat,它就會每10分鍾收集一次系統狀態並將它存儲到/var/log/sysstat或/var/log/sa文件中。除此之外,每天晚上再午夜之前,它還會分割統計文件。這些操作都是由/etc/cron.d/sysstat腳本執行的,所以如果想要更改sysstat收集信息的頻率,可以修改這個腳本文件。

3.2查看CPU統計信息

sysstat統計信息的時候,它將這些信息存儲在以sa開頭、以本月當前日期結尾的文件名的文件中(如sa03)。這就意味着你可以查看從當前日期起,一個月以內的統計數據。使用sar工具可以查看這些統計信息。默認情況下sar會輸出當天的CPU統計信息:

 

從輸出可以發現,CPU很多統計信息和top命令的輸出相同,在最后一行,sar還為每個值提供了平均值。

3.3查看RAM統計信息

sysstat計划任務不僅可以收集CPU負載信息,還能收集很多別的信息。使用-r選項就可以收集RAM的統計信息:

 

在這里可以看到使用了多少內存,空閑多少內存,同時還能查看交換空間的信息以及文件緩存的信息,這些信息與用top或free命令輸出的信息類似。與之不同的是,你可以及時查看之前的信息。

3.4查看磁盤統計信息

磁盤統計信息,使用-b選項能給出一些列磁盤I/O的基本信息。

  從這里可以看到每秒總共輸出的數據量(tps),它由總共讀取的數據量和寫入的數據量(分別是rtps和wtps)相加獲得。bread/s列並非用來衡量塊I/O,而是告訴你平均每秒讀取的數據量。bwrtn/s能告訴你平均每秒寫入的數據量。
  ar程序可以傳入很多參數,輸出特定的數據集,如果想看到所有數據。使用-A選項可以做到這點。它會顯示包括負載平均值、CPU負載、RAM、磁盤I/O、網絡I/O和其他一些有趣值在內的統計信息。通過閱讀sar的用戶手冊(輸入man sar)可以了解到想要看特定的統計信息應該傳入什么標志位。

3.5查看之前的統計信息

有時需要查看一天中部分時間段內的信息。想要獲得指定時間范圍內的信息,可以使用-s和-e參數分別指定你感興趣的開始時間和結束時間。例如,想查8:00pm—8:30pm這個時間段內的CPU數據,需要輸入:

 

如果想要獲取非當天的數據,使用-f選項,后面輸入存儲在/var/log/sysstat或/var/log/sa文件夾內統計信息文件的完整路徑。例如,想要獲取本月第6天的統計信息,輸入:

sar -f /var/log/sysstat/sa06

 

也可以混合使用任意其他sar選項,從而獲得特定類型的統計信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM