Linux性能優化和監控系列(一)——top工具

解釋服務器發生了什麼——top工具


在檢查服務器的詳細工作性能狀態前,系統管理員需要對當前服務器狀態有總體的瞭解. top是檢查服務器總體狀態的強有力工具, 通過top可以獲取CPU, Memory, Process運行信息, 如下是運行top命令後的數據顯示:

top - 20:08:09 up 10 min,  1 user,  load average: 0.00, 0.02, 0.01
Tasks: 104 total,   1 running, 103 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3924700k total,   260016k used,  3664684k free,    13552k buffers
Swap:  4063224k total,        0k used,  4063224k free,    75816k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 6284 root      20   0 15028 1308 1000 R  0.3  0.0   0:00.03 top
    1 root      20   0 19356 1580 1268 S  0.0  0.0   0:01.80 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.02 migration/0
    4 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
    5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    7 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 migration/1
    8 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/1
    9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1
   10 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/1


用top監控CPU性能

在用top分析服務器性能時,首先注意的是load average, load average包括三個信息, 分別指最後一分鐘, 最後5分鐘, 最後15分鐘系統平均性能, 該數值的錨固值(anchor value)是1.0. 對於一個單核CPU, 當錨固值達到1.0時, 系統會處於忙碌狀態, 但應用也可以正常運行, 沒有任何應用排隊等待CPU.


需要注意的是load average是系統的平均性能而不是CPU的, 有可能load average遠高於1.0, 但是CPU沒有做任何工作, 如系統忙於等待I/O.


使系統總是工作在anchor value爲1.0也許很好, 但也許沒有必要, 因此在判斷系統工作在anchor value爲1.0時是好是壞之前, 需要系統管理員更加深入的瞭解特定工作量. 比如對於如下兩個任務:

Task 1: while true; do true; done

Task 2: dd if=/dev/sda of=/dev/null

當執行Task 1時, Task 1會使CPU的一個核使用率達到100%, anchor value值也會超過1.0, 如果系統CPU只有一個核, 那麼系統會處於完全忙碌狀態, 這時新的進程不會再開始, 會被放入隊列中排隊, 直到有空閒的CPU資源.

當執行Task 2時, Task 2也會使anchor value大於或等於1.0, 但是這時該任務只是在等待I/O資源, CPU任然可以繼續給其他進程使用.


如果系統CPU非常忙碌, 你需要通過top命令的CPU行深入的分析系統正在做什麼, CPU行提供如下CPU性能信息:

us
us表示user space負載, 通常運行在user space下的應用程序由終端用戶啓動, 不以root權限運行, 如果us負載高, 這意味着應用程序消耗CPU高.
sy
sy表示system space負載, 通常運行在system space下的進程由操作系統內核調用, 正常情況下sy不會很高.
nini表示已經啓動的用nice命令調整的任務數.
idid表示CPU空閒的時間.
wawa表示CPU正在等待I/O, 如果wa連續大於30, 這表示關聯storage和network的I/O channel有問題,需要檢查network和storage的性能問題.
hihi表示CPU用在處理硬件終端的時間.
sisi跟軟件中斷有關, 通常是些由內核創建的低優先級軟件終端, 幾乎很少會遇到si使用率很高.
stst跟一個被虛擬化使用的環境有關, 在某些虛擬化環境中, 虛擬機會宿主操作系統偷取CPU時間, 如果這種情況發生, st會有使用率, 若使用率很高, 需考慮從服務器卸載虛擬機.


用top監控內存性能

top命令的Mem行跟內存和交換分區有關, Mem行包括五個參數:

total
服務器總的物理內存.
used
當前使用的總得內存, 包括buffers和cache.
free當前沒有使用的內存.
buffers
buffer跟服務器使用的write cache有關, 也包括文件系統表和一些服務器需要放在內存的結構. 所有需要寫到磁盤的數據首先寫到write cache, 從終端用戶的角度來看, 用戶使用的應用程序不需要等待數據寫入. 如果系統需要更多的內存, 而不能從free的內存分配時, write cache能被刷新, 然後將write cache使用的內存給其他應用程序使用. 總之, buffer使系統變得更快.
cached
當用戶從服務器請求文件時,通常文件需要從磁盤讀取, 由於磁盤比內存大約慢1000倍, 因此每次從磁盤獲取文件後都放到cache來加速下次讀取該文件. 如果分配給cahce的內存需要給其他應用程序使用, cache可以被立即釋放加入到free內存中以便使用. 對於那些讀次數多的服務器,cache內存通常很高,如果cache內存低於總內存的40%, 那麼服務器性能可能很慢, 這時需增加內存.
swapswap space是在硬盤上模擬內存, 如果系統開始使用swap, 這可不好, 因爲swap比內存大約慢1000倍. 但swap並不是總是不好, 如內核使用它把不需要的數據從內存移除, 以便釋放更多內存空間.


監控Buffer和Cache內存

1. 重啓服務器.

2. 觀察當前服務器Buffer和Cache.

top - 03:17:03 up 1 min,  3 users,  load average: 0.25, 0.11, 0.04
Tasks: 108 total,   1 running, 107 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3924700k total,   199948k used,  3724752k free,     9448k buffers
Swap:  4063224k total,        0k used,  4063224k free,    55316k cached

3. 運行如下命令填滿Cache, 並觀察Cache數量.

cd /etc
for I in *
do
    cat $I
done

top - 03:19:09 up 3 min,  3 users,  load average: 0.09, 0.08, 0.03
Tasks: 108 total,   1 running, 107 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3924700k total,   212968k used,  3711732k free,    10556k buffers
Swap:  4063224k total,        0k used,  4063224k free,    65124k cached

4. 運行如下命令填滿Buffer, 並觀察Buffer數量.

ls -Rl / > /dev/null &

top - 03:22:07 up 6 min,  3 users,  load average: 0.44, 0.22, 0.08
Tasks: 108 total,   1 running, 107 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3924700k total,   329528k used,  3595172k free,    39116k buffers
Swap:  4063224k total,        0k used,  4063224k free,    65176k cached

5. 通過如下命令清除服務器Buffer和Cache.

echo 3 > /proc/sys/vm/drop_caches


用top監控進程

PID
進程ID.
USER啓動這個進程的用戶.
PR進程的優先級.
NI已啓動進程的nice值.
VIRT進程首次啓動時要求的內存大小.
RES常駐內存, 表示進程運行實際需要的內存, 實際內存可能比virt內存要小.
SHR當前進程與其他進程共享的內存.
S進程狀態.
%CPU當前進程使用的CPU時間百分比.
%MEM當前進程使用的內存百分比.
TIME+
當前進程使用CPU週期的總時間.
COMMAND進程命令.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章