1. top命令
top命令經(jīng)常用來(lái)監(jiān)控Linux的系統(tǒng)狀況,比如cpu、內(nèi)存的使用,程序員基本都知道這個(gè)命令,但比較奇怪的是能用好它的人卻很少,例如top監(jiān)控視圖中內(nèi)存數(shù)值的含義就有不少的曲解。
top命令的頂部顯示與uptime命令相似的輸出
這些字段顯示:
可以使用'l'命令切換uptime的顯示。
21:45:11%20—%20當(dāng)前系統(tǒng)時(shí)間
0%20days,%204:54%20—%20系統(tǒng)已經(jīng)運(yùn)行了4小時(shí)54分鐘(在這期間沒(méi)有重啟過(guò))
2%20users%20—%20當(dāng)前有2個(gè)用戶登錄系統(tǒng)
-average%20load(正常負(fù)載):小于等于10s。-average%20load(正常負(fù)載):20到49個(gè)虛擬用戶。load%20average%20與后面的數(shù)字一起表示系統(tǒng)在過(guò)去1,5,10分鐘內(nèi)的負(fù)載程度,數(shù)值。
load%20average數(shù)據(jù)是每隔5秒鐘檢查一次活躍的進(jìn)程數(shù),然后按特定算法計(jì)算出的數(shù)值。如果這個(gè)數(shù)除以邏輯CPU的數(shù)量,結(jié)果高于5的時(shí)候就表明系統(tǒng)在超負(fù)荷運(yùn)轉(zhuǎn)了。
Tasks%20—%20任務(wù)(進(jìn)程),系統(tǒng)現(xiàn)在共有144個(gè)進(jìn)程,其中處于運(yùn)行中的有1個(gè),143個(gè)在休眠(sleep),stoped狀態(tài)的有0個(gè),zombie狀態(tài)(僵尸)的有0個(gè)。
ps%20axu顯示進(jìn)程的詳細(xì)狀態(tài)killallkill%20-15kill%20-9一般都不能殺掉%20defunct進(jìn)程用了kill%20-15,kill%20-9以后%20之后反而會(huì)多出更多的僵尸進(jìn)程kill%20-kill%20pidfuser%20-k%20pid可以考慮殺死他的parent%20process。這段代碼設(shè)計(jì)是如此地富有想象力,它通過(guò)if%20(need_resched())使得函數(shù)能在jiffies級(jí)別上跳出while循環(huán),但是代碼優(yōu)化的性能提升則體現(xiàn)在owner_running中,因?yàn)閾碛墟i的進(jìn)程在極短的時(shí)間(肯定是低于jiffies這個(gè)級(jí)別的,可能在us級(jí)甚至更低)釋放鎖,如果通過(guò)if%20(need_resched())退出循環(huán),則基本說(shuō)明了本次優(yōu)化的失敗,事實(shí)上還導(dǎo)致了性能的倒退(因?yàn)榧幢阍趆z=1000的系統(tǒng)中,jiffies的級(jí)別也是非常粗糙的,現(xiàn)代處理器的進(jìn)程切換的開(kāi)銷可能只在幾個(gè)us或者幾十個(gè)us,如果讓一個(gè)進(jìn)程為了獲得mutex%20lock而去spin幾個(gè)jiffies,那么這簡(jiǎn)直就是暴斂天物了,如果這個(gè)時(shí)間讓當(dāng)前進(jìn)程睡眠,那么其他進(jìn)程就可以獲得cpu資源,而1個(gè)jiffies可以抵得上幾十上百個(gè)進(jìn)程切換的時(shí)間開(kāi)銷,根本就不需要在乎兩次進(jìn)程切換的時(shí)間開(kāi)銷。在這個(gè)過(guò)程中子進(jìn)程已經(jīng)放棄了幾乎所有內(nèi)存空間,沒(méi)有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,這個(gè)時(shí)候該子進(jìn)程稱為一個(gè)僵尸進(jìn)程。
這里顯示不同模式下所占cpu時(shí)間百分比,這些不同的cpu時(shí)間表示:
可以使用't'命令切換顯示。
1.3% us — 用戶空間占用CPU的百分比。
1.0% sy — 內(nèi)核空間占用CPU的百分比。
0.0% ni — 改變過(guò)優(yōu)先級(jí)的進(jìn)程占用CPU的百分比
97.3% id — 空閑CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.3% hi — 硬中斷(Hardware IRQ)占用CPU的百分比
0.0% si — 軟中斷(Software Interrupts)占用CPU的百分比
在這里CPU的使用比率和windows概念不同,如果你不理解用戶空間和內(nèi)核空間,需要充充電了。
11856k used — 使用的交換區(qū)總量(11M)
480680k free — 空閑交換區(qū)總量(480M)
202224k cached — 緩沖的交換區(qū)總量(202M)
這里要說(shuō)明的是不能用windows的內(nèi)存概念理解這些數(shù)據(jù),如果按windows的方式此臺(tái)服務(wù)器“危矣”:8G的內(nèi)存總量只剩下530M的可用內(nèi)存。Linux的內(nèi)存管理有其特殊性,復(fù)雜點(diǎn)需要一本書來(lái)說(shuō)明,這里只是簡(jiǎn)單說(shuō)點(diǎn)和我們傳統(tǒng)概念(windows)的不同。
3. 空閑任務(wù)負(fù)責(zé)釋放內(nèi)核分配給已刪除任務(wù)的內(nèi)存。使用提示:只有內(nèi)核為任務(wù)分配的內(nèi)存空間才會(huì)在任務(wù)被刪除后由空閑任務(wù)自動(dòng)回收。輕量級(jí)操作系統(tǒng)freertos的內(nèi)存管理機(jī)制(二)中講到,heap2.c的內(nèi)存管理機(jī)制會(huì)導(dǎo)致內(nèi)存碎片的問(wèn)題,系統(tǒng)運(yùn)行久后會(huì)出現(xiàn)無(wú)法分配大塊內(nèi)存的情況,heap4.c中的管理機(jī)制提供了解決方法,它是在heap2.c的基礎(chǔ)上添加了地址相鄰空閑塊間合并的功能,而heap5.c是對(duì)heap4.c的進(jìn)一步擴(kuò)展,它能夠支持多塊不連續(xù)分布的ram空間作為堆使用,本篇將對(duì)heap4.c、heap5.c中的管理機(jī)制進(jìn)行分析。
如果出于習(xí)慣去計(jì)算可用內(nèi)存數(shù),這里有個(gè)近似的計(jì)算公式:第四行的free + 第四行的buffers + 第五行的cached,按這個(gè)公式此臺(tái)服務(wù)器的可用內(nèi)存:
13284+25364+202224 = 240M。
對(duì)于內(nèi)存監(jiān)控,在top里我們要時(shí)刻監(jiān)控第五行swap交換分區(qū)的used,如果這個(gè)數(shù)值在不斷的變化,說(shuō)明內(nèi)核在不斷進(jìn)行內(nèi)存和swap的數(shù)據(jù)交換,這是真正的內(nèi)存不夠用了。
第六行是空行
PID:進(jìn)程ID,進(jìn)程的唯一標(biāo)識(shí)符
USER:進(jìn)程所有者的實(shí)際用戶名。
PR:進(jìn)程的調(diào)度優(yōu)先級(jí)。這個(gè)字段的一些值是'rt'。這意味這這些進(jìn)程運(yùn)行在實(shí)時(shí)態(tài)。
NI:進(jìn)程的nice值(優(yōu)先級(jí))。越小的值意味著越高的優(yōu)先級(jí)。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)
VIRT:進(jìn)程使用的虛擬內(nèi)存。進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RES
RES:駐留內(nèi)存大小。駐留內(nèi)存是任務(wù)使用的非交換物理內(nèi)存大小。進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATA
SHR:SHR是進(jìn)程使用的共享內(nèi)存。共享內(nèi)存大小,單位kb