新聞中心
概述

專注于為中小企業(yè)提供網(wǎng)站設(shè)計、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)黃山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
在Linux系統(tǒng)中,Top命令是一個非常有用的工具,可以幫助用戶在實(shí)時環(huán)境中監(jiān)控系統(tǒng)的性能。通過Top命令,用戶可以查看所有正在運(yùn)行的進(jìn)程,以及它們的CPU使用率、內(nèi)存使用情況、進(jìn)程ID等信息。本文將介紹如何使用Top命令以及如何計算這些數(shù)據(jù)的平均值,以便更好地監(jiān)測系統(tǒng)的運(yùn)行情況。
使用Top命令
在Linux系統(tǒng)中,Top命令是可以直接運(yùn)行的,無需安裝任何附加軟件。要使用Top命令,只需在終端窗口中輸入“top”即可。執(zhí)行Top命令后,屏幕上將顯示當(dāng)前運(yùn)行的所有進(jìn)程的詳細(xì)信息。
在Top命令的輸出中,每行顯示一個進(jìn)程的信息,其中包括進(jìn)程的PID、進(jìn)程名、CPU占用率、內(nèi)存使用率等。用戶可以通過按不同的鍵來排序顯示,例如按CPU使用率排序,按內(nèi)存使用率排序等等。
在Top命令的輸出中,也可以看到系統(tǒng)的總體性能指標(biāo),例如系統(tǒng)的總CPU使用率、總內(nèi)存使用情況、交換分區(qū)使用情況等。
計算平均值
要計算Top命令輸出中的數(shù)據(jù)的平均值,需要執(zhí)行一些額外的步驟,包括:
1.采樣時間間隔——在使用Top命令時,需要指定采樣時間間隔。通常情況下,建議采用5秒或10秒的間隔時間。對于采樣時間間隔的選擇,需要根據(jù)監(jiān)測目的和系統(tǒng)運(yùn)行情況進(jìn)行調(diào)整。
2.采樣次數(shù)——為了確保數(shù)據(jù)的準(zhǔn)確性和可靠性,需要進(jìn)行多次采樣并計算平均值。通常,采樣次數(shù)建議至少為3次,甚至可以進(jìn)行更多次的采樣以獲得更準(zhǔn)確的結(jié)果。
3.數(shù)據(jù)處理——在獲得多次采樣的數(shù)據(jù)后,需要將它們進(jìn)行處理以計算平均值、更高值、更低值等指標(biāo)??梢允褂胹hell腳本或Python等編程語言來處理數(shù)據(jù)。
實(shí)例
以下是一個簡單的example shell腳本,用于計算Top命令的CPU平均使用率:
“`
#!/bin/bash
echo “Enter the number of times to sample CPU usage:”
read count
echo “Enter the interval between each sample (in seconds)”
read interval
cpu_usage=0
counter=0
while [ $counter -lt $count ]
do
cpu_line=`top -b -n1 | grep “Cpu(s)”`
cpu=`echo $cpu_line | awk ‘{print $2 + $4}’`
cpu_usage=`echo “$cpu_usage + $cpu” | bc`
sleep $interval
counter=`expr $counter + 1`
done
avg_cpu_usage=`echo “scale=2;$cpu_usage / $count” | bc`
echo “Average CPU usage: $avg_cpu_usage”
“`
此腳本要求用戶輸入要采樣的次數(shù)和時間間隔,并在每個時間間隔中獲取系統(tǒng)的CPU使用率。腳本將計算所有采樣數(shù)據(jù)的平均值,并打印出結(jié)果。
結(jié)論
在Linux系統(tǒng)中,Top命令是一個非常有用的監(jiān)控工具,可以幫助用戶監(jiān)控系統(tǒng)的性能并對其進(jìn)行優(yōu)化。通過采用適當(dāng)?shù)牟蓸訒r間間隔和采樣次數(shù),并使用正確的數(shù)據(jù)處理方法,用戶可以輕松計算Top命令輸出的數(shù)據(jù)的平均值,并更好地監(jiān)測系統(tǒng)的運(yùn)行情況。
相關(guān)問題拓展閱讀:
- linux系統(tǒng)top給出的信息都有哪些
linux系統(tǒng)top給出的信息都有哪些
Linux新手,個人認(rèn)為首先就應(yīng)該了解納團(tuán)一下top命令各項(xiàng)的含義.
不用有事就問什么搜索引擎,先看看man top.
top – 16:12:56 up 1 day, 22 min, 4 users, load average: 0.02, 0.04, 0.05
Tasks: 158 total, 1 running, 156 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 98.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem:total,used,free,buffers
KiB Swap:total,used,free.cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5761 eechen1076 R 6.2 0.2 0:00.01 top
16:12:56 up 1 day, 22 min, 4 users, load average: 0.02, 0.04, 0.05
這句等同于執(zhí)行 uptime 命令返回的內(nèi)容.
16:12:56 是當(dāng)前時間(date).
up 1 day, 22 min 表示系統(tǒng)已經(jīng)運(yùn)行1天又22分鐘(uptime -p).
4 users 表示當(dāng)前登錄系統(tǒng)的用戶(w,who).
load average 表示系統(tǒng)負(fù)載,分別是1分鐘,5分鐘,15分鐘前到現(xiàn)在的負(fù)載平均值.
Tasks: 158 total 表示系統(tǒng)的進(jìn)程數(shù)(數(shù)目等于ps -ef|wc -l的值減去2),按大寫H可以切換到線程模式.
running表示正在運(yùn)行的進(jìn)程,sleeping表示睡眠的進(jìn)程,stopped表示暫停的進(jìn)程,zombie表示已結(jié)束但還沒有從進(jìn)程表中刪除的僵尸進(jìn)程.
total表示總內(nèi)存,used表示已經(jīng)使用的內(nèi)存,free表示空閑的內(nèi)存,按E可以切換單位.
buffers(Buffer Cache)表示塊設(shè)備的讀寫緩沖區(qū)占用的內(nèi)存,cached(Page Cache)表示文件系統(tǒng)緩存占用的內(nèi)存.
buffers:塊設(shè)備緩沖 cached:文件系統(tǒng)緩存
如果cached的值很大,說明cache住的文件數(shù)很多.如果頻繁訪問到的文件都能被cache住,那么磁盤的讀I/O就非常小.
所謂塊設(shè)備是指對其信息的存取以”塊”為單位,如通常的光盤,硬磁盤,軟磁盤,磁帶等,塊長取512字節(jié)或1024字節(jié)或4096字節(jié).
塊設(shè)備可以直接通過塊設(shè)備特別文件來訪問,為了提高數(shù)據(jù)傳輸效率,塊設(shè)備驅(qū)動程序內(nèi)部采用塊緩沖技術(shù).
Swap是交換空間,交換空間在物理內(nèi)存(RAM)被充滿時被使用.
如果系統(tǒng)需要更多的內(nèi)存資源,而物理內(nèi)存已經(jīng)充滿,內(nèi)存中不活躍的頁就會被移到交換空間去.
雖然交換空間可以為帶有少量內(nèi)存的機(jī)器提供幫助,但是這種方法不應(yīng)該宏茄慶被當(dāng)做是對內(nèi)存的取蔽握代.
交換空間位于硬盤驅(qū)動器上,它比進(jìn)入物理內(nèi)存要慢.
load average的理解:
load average指的是處于task_running或task_uninterruptible狀態(tài)的進(jìn)程(或線程)數(shù)的平均值.
處于task_running狀態(tài)的進(jìn)程(或線程),可能正在使用CPU或排隊等待使用CPU.
處于task_uninterruptible狀態(tài)的進(jìn)程(或線程),可能正在等待I/O,比如等待磁盤I/O.這時I/O等待占用的CPU時間百分比iowait(wa)可能會比較高.
sudo strace -p `pidof top` 可見top從/proc讀取了很多信息.
man proc 查看 /proc/loadavg 的說明:
man proc | col -b > proc.txt
/proc/loadavg 內(nèi)容:
0.22 0.13 0.14 2/
0.22 0.13 0.14表示在過去的1分鐘,5分鐘,15分鐘,
正在運(yùn)行(task_running)或等待IO(task_uninterruptible)的任務(wù)的數(shù)量.
2/374中的2表示當(dāng)前運(yùn)行的線程數(shù),374則表示系統(tǒng)當(dāng)前存在的內(nèi)核調(diào)度實(shí)體(進(jìn)程/線程)的數(shù)量.
5306是系統(tǒng)最近創(chuàng)建的進(jìn)程PID編號.
又比如:
load average: 31.09, 29.87, 29.92
表示在過去的1分鐘,5分鐘,15分鐘的時間里,CPU任務(wù)隊列中平均有30個程序(這里應(yīng)該是30個Java線程)在使用CPU.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root0.227t 0.012tS.:58 java
Java進(jìn)程的CPU使用率%CPU達(dá)到3090%,表示這個Java進(jìn)程正在使用31個CPU核心,
這樣對上了上面load average得出的數(shù)據(jù),也就是有30個左右的Java線程正在使用30個CPU核心.
按H(區(qū)分大小寫)切換到線程模式,因?yàn)橐粋€線程最多只能使用一個核心,所以線程模式下顯示的CPU使用率不會超過100%.
當(dāng)CPU和磁盤都忙不過來的時候,開再多的進(jìn)程也沒有任何意義,只會徒增CPU上下文切換和磁盤I/O等待,得不償失.
系統(tǒng)負(fù)載高,普遍是因?yàn)橄到y(tǒng)進(jìn)程數(shù)太多,I/O太多導(dǎo)致的.
load average小于1表示系統(tǒng)空閑,大于1表示系統(tǒng)開始繁忙.
Linux服務(wù)器的任務(wù)(進(jìn)程)數(shù)量保持在200個以下是比較好的,更好不要超過300個.
us, user : time running un-niced user processes 用戶空間進(jìn)程占用CPU時間百分比
sy, system : time running kernel processes 內(nèi)核進(jìn)程占用CPU時間百分比
ni, nice : time running niced user processes 用戶空間內(nèi)改變過優(yōu)先級的進(jìn)程占用CPU時間百分比
id, idle : time spent in the kernel idle handler 空閑CPU時間百分比(100%表示系統(tǒng)完全空閑)
wa, iowait : time waiting for I/O completion I/O等待占用的CPU時間百分比
hi : time spent servicing hardware interrupts 硬件中斷占用CPU時間百分比
si : time spent servicing software interrupts 軟件中斷占用CPU時間百分比
st : time stolen from this vm by the hypervisor 虛擬化hypervisor從當(dāng)前虛擬機(jī)vm偷走的時間
如果st這個值很高的話,說明你的VPS提供商的CPU資源有限,而你沒能搶過別人,很有可能就是VPS提供商超售了.
按F選擇要顯示的列和查看每列的含義,默認(rèn)有下面這些列:
PID = Process Id
USER = Effective User Name
PR = Priority PR和NI的值越高越友好即越不競爭資源,比如PR 20和NI 0,另外,PR=NI+20.
NI = Nice Value 負(fù)值表示高優(yōu)先級,正值表示低優(yōu)先級,比如kworker的NI為-20,PR為0.
VIRT = Virtual Image (KiB)
RES = Resident Size (KiB) 常駐內(nèi)存,按E切換單位.
SHR = Shared Memory (KiB)
S= Process Status
%CPU = CPU Usage 四核處理器在Tasks模式下滿載為400%,在Threads模式(按H切換)下滿載為100%(一個線程最多只能使用一個核心).按Shift+P按CPU使用率排序.
%MEM = Memory Usage (RES) 滿載為100%,按Shift+M按RES內(nèi)存排序.
TIME+ = CPU Time, hundredths 進(jìn)程使用的CPU時間總計.比如2:32.45代表2分鐘32.45秒.
COMMAND = Command Name/Line
按F進(jìn)入域管理窗口后按A可以切換顯示模式,按空格選中要顯示的列,按S按指定列排序,用向右方向鍵選中列后可以調(diào)整順序.修改后按Shift+W保存設(shè)置到~/.toprc文件.
top里面按Shift+M是按內(nèi)存排序,按E是切換內(nèi)存單位,按Shfit+W保存設(shè)置.
然后執(zhí)行top -n1 -b可以看到按內(nèi)存排序的所有進(jìn)程的信息.
或者ps后用sort排序:
ps aux | sort -k4nr | head -n5
top里按C或者使用-c參數(shù)可以看到進(jìn)程的絕對路徑和啟動參數(shù),就可以得到類似ps -ef和ps aux提供的信息了.
看進(jìn)程路徑: top -p `pidof firefox` -c -n1
看進(jìn)程線程: top -p `pidof firefox` -H -n1
Linux Process Status:
R (task_running) : 可執(zhí)行狀態(tài)
S (task_interruptible): 可中斷的睡眠狀態(tài)
D (task_uninterruptible): 不可中斷的睡眠狀態(tài)
T (task_stopped or task_traced): 暫停狀態(tài)或跟蹤狀態(tài)
Z (task_dead – exit_zombie): 退出狀態(tài),進(jìn)程成為僵尸進(jìn)程
X (task_dead – exit_dead): 退出狀態(tài),進(jìn)程即將被銷毀
running進(jìn)程:
只有在該狀態(tài)的進(jìn)程才可能在CPU上運(yùn)行。
而同一時刻可能有多個進(jìn)程處于可執(zhí)行狀態(tài),這些進(jìn)程的task_struct結(jié)構(gòu)(進(jìn)程控制塊)被放入對應(yīng)CPU的可執(zhí)行隊列中(一個進(jìn)程最多只能出現(xiàn)在一個CPU的可執(zhí)行隊列中)。
進(jìn)程調(diào)度器的任務(wù)就是從各個CPU的可執(zhí)行隊列中分別選擇一個進(jìn)程在該CPU上運(yùn)行。
很多操作系統(tǒng)教科書將正在CPU上執(zhí)行的進(jìn)程定義為RUNNING狀態(tài)、而將可執(zhí)行但是尚未被調(diào)度執(zhí)行的進(jìn)程定義為READY狀態(tài),這兩種狀態(tài)在Linux下統(tǒng)一為TASK_RUNNING狀態(tài)。
sleeping進(jìn)程:
處于這個狀態(tài)的進(jìn)程因?yàn)榈却衬呈录陌l(fā)生(比如等待socket連接、等待信號量),而被掛起。
這些進(jìn)程的task_struct結(jié)構(gòu)被放入對應(yīng)事件的等待隊列中。當(dāng)這些事件發(fā)生時(由外部中斷觸發(fā)、或由其他進(jìn)程觸發(fā)),對應(yīng)的等待隊列中的一個或多個進(jìn)程將被喚醒。
通過ps命令我們會看到,一般情況下,進(jìn)程列表中的絕大多數(shù)進(jìn)程都處于task_interruptible狀態(tài)(除非機(jī)器的負(fù)載很高)。
畢竟CPU就這么一兩個,進(jìn)程動輒幾十上百個,如果不是絕大多數(shù)進(jìn)程都在睡眠,CPU又怎么響應(yīng)得過來。
stopped進(jìn)程:
向進(jìn)程發(fā)送一個sigstop信號,它就會因響應(yīng)該信號而進(jìn)入task_stopped狀態(tài),除非該進(jìn)程本身處于task_uninterruptible狀態(tài)而不響應(yīng)信號。
sigstop與sigkill信號一樣,是非常強(qiáng)制的。不允許用戶進(jìn)程通過signal系列的系統(tǒng)調(diào)用重新設(shè)置對應(yīng)的信號處理函數(shù)。
向進(jìn)程發(fā)送一個sigcont信號,可以讓其從task_stopped狀態(tài)恢復(fù)到task_running狀態(tài)。
當(dāng)進(jìn)程正在被跟蹤時,它處于task_traced這個特殊的狀態(tài)?!罢诒桓櫋敝傅氖沁M(jìn)程暫停下來,等待跟蹤它的進(jìn)程對它進(jìn)行操作。
比如在gdb中對被跟蹤的進(jìn)程下一個斷點(diǎn),進(jìn)程在斷點(diǎn)處停下來的時候就處于task_traced狀態(tài)。而在其他時候,被跟蹤的進(jìn)程還是處于前面提到的那些狀態(tài)。
對于進(jìn)程本身來說,task_stopped和task_traced狀態(tài)很類似,都是表示進(jìn)程暫停下來。
而task_traced狀態(tài)相當(dāng)于在task_stopped之上多了一層保護(hù),處于task_traced狀態(tài)的進(jìn)程不能響應(yīng)sigcont信號而被喚醒。
只能等到調(diào)試進(jìn)程通過ptrace系統(tǒng)調(diào)用執(zhí)行ptrace_cont、ptrace_detach等操作(通過ptrace系統(tǒng)調(diào)用的參數(shù)指定操作),或調(diào)試進(jìn)程退出,被調(diào)試的進(jìn)程才能恢復(fù)task_running狀態(tài)。
zombie進(jìn)程:
在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它是已經(jīng)結(jié)束了的進(jìn)程,但是沒有從進(jìn)程表中刪除。
太多了會導(dǎo)致進(jìn)程表里面條目滿了,進(jìn)而導(dǎo)致系統(tǒng)崩潰,倒是不占用其他系統(tǒng)資源。
它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,
僅僅在進(jìn)程列表中保留一個位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。
進(jìn)程在退出的過程中,處于TASK_DEAD狀態(tài)。在這個退出過程中,進(jìn)程占有的所有資源將被回收,除了task_struct結(jié)構(gòu)(以及少數(shù)資源)以外。
于是進(jìn)程就只剩下task_struct這么個空殼,故稱為僵尸。
之所以保留task_struct,是因?yàn)閠ask_struct里面保存了進(jìn)程的退出碼、以及一些統(tǒng)計信息。
而其父進(jìn)程很可能會關(guān)心這些信息。比如在shell中,$?變量就保存了最后一個退出的前臺進(jìn)程的退出碼,而這個退出碼往往被作為if語句的判斷條件。
當(dāng)然,內(nèi)核也可以將這些信息保存在別的地方,而將task_struct結(jié)構(gòu)釋放掉,以節(jié)省一些空間。
但是使用task_struct結(jié)構(gòu)更為方便,因?yàn)樵趦?nèi)核中已經(jīng)建立了從pid到task_struct查找關(guān)系,還有進(jìn)程間的父子關(guān)系。
釋放掉task_struct,則需要建立一些新的數(shù)據(jù)結(jié)構(gòu),以便讓父進(jìn)程找到它的子進(jìn)程的退出信息。
子進(jìn)程在退出的過程中,內(nèi)核會給其父進(jìn)程發(fā)送一個信號,通知父進(jìn)程來“收尸”。
父進(jìn)程可以通過wait系列的系統(tǒng)調(diào)用(如wait4、waitid)來等待某個或某些子進(jìn)程的退出,并獲取它的退出信息。
然后wait系列的系統(tǒng)調(diào)用會順便將子進(jìn)程的尸體(task_struct)也釋放掉。
這個信號默認(rèn)是SIGCHLD,但是在通過clone系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程時,可以設(shè)置這個信號。
如果他的父進(jìn)程沒安裝SIGCHLD信號處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態(tài),子進(jìn)程的尸體(task_struct)也就無法釋放掉。
如果這時父進(jìn)程結(jié)束了,那么init進(jìn)程自動會接手這個子進(jìn)程,為它收尸,它還是能被清除的。
但是如果如果父進(jìn)程是一個循環(huán),不會結(jié)束,那么子進(jìn)程就會一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時會有很多的僵尸進(jìn)程。
當(dāng)進(jìn)程退出的時候,會將它的所有子進(jìn)程都托管給別的進(jìn)程(使之成為別的進(jìn)程的子進(jìn)程)。
托管的進(jìn)程可能是退出進(jìn)程所在進(jìn)程組的下一個進(jìn)程(如果存在的話),或者是1號進(jìn)程。
所以每個進(jìn)程、每時每刻都有父進(jìn)程存在。除非它是1號進(jìn)程。1號進(jìn)程,pid為1的進(jìn)程,又稱init進(jìn)程。
Linux系統(tǒng)啟動后,之一個被創(chuàng)建的用戶態(tài)進(jìn)程就是init進(jìn)程。它有兩項(xiàng)使命:
1、執(zhí)行系統(tǒng)初始化腳本,創(chuàng)建一系列的進(jìn)程(它們都是init進(jìn)程的子孫);
2、在一個死循環(huán)中等待其子進(jìn)程的退出事件,并調(diào)用waitid系統(tǒng)調(diào)用來完成“收尸”工作;
init進(jìn)程不會被暫停、也不會被殺死(這是由內(nèi)核來保證的)。它在等待子進(jìn)程退出的過程中處于task_interruptible狀態(tài),“收尸”過程中則處于task_running狀態(tài)。
關(guān)于linux top average的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動、聯(lián)通等。
當(dāng)前文章:LinuxTop命令的平均值(linuxtopaverage)
文章起源:http://www.5511xx.com/article/ccieogp.html


咨詢
建站咨詢
