新聞中心
在Linux系統(tǒng)中,/proc目錄下存儲(chǔ)了操作系統(tǒng)的各種信息,其中/proc/stat文件記錄了系統(tǒng)運(yùn)行的各項(xiàng)指標(biāo)數(shù)據(jù),如CPU使用率、上下文切換次數(shù)、用戶進(jìn)程數(shù)等。本文將詳細(xì)解讀/proc/stat文件的內(nèi)容和意義。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括將樂(lè)網(wǎng)站建設(shè)、將樂(lè)網(wǎng)站制作、將樂(lè)網(wǎng)頁(yè)制作以及將樂(lè)網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,將樂(lè)網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到將樂(lè)省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
/proc/stat文件格式
/proc/stat文件的頂部是匯總了整個(gè)系統(tǒng)所有CPU的運(yùn)行數(shù)據(jù),其余則是每個(gè)CPU的信息。文件中每行的開(kāi)頭都是以一個(gè)非字母開(kāi)頭的數(shù)據(jù)標(biāo)示符,后面則跟隨著該標(biāo)示符的數(shù)值。
根據(jù)/proc/stat的格式,下表列出了一些常見(jiàn)的標(biāo)示符及其含義:
| 標(biāo)示符 | 含義 |
|——–|——————————|
| user | 用戶級(jí)進(jìn)程運(yùn)行時(shí)間 |
| nice | 優(yōu)先級(jí)較低的進(jìn)程運(yùn)行時(shí)間 |
| system | 內(nèi)核級(jí)進(jìn)程運(yùn)行時(shí)間 |
| idle | CPU空閑時(shí)間 |
| iowt | CPU等待輸入輸出完成時(shí)間 |
| irq | 處理中斷時(shí)間 |
| softirq| 軟中斷時(shí)間 |
| steal | 虛擬CPU等待真實(shí)CPU運(yùn)行時(shí)間 |
| guest | 虛擬CPU運(yùn)行時(shí)間 |
| guest_nice | 優(yōu)先級(jí)較低的虛擬CPU運(yùn)行時(shí)間 |
每個(gè)標(biāo)示符的數(shù)值都代表著其所屬的計(jì)時(shí)器自系統(tǒng)啟動(dòng)以來(lái)已經(jīng)運(yùn)行的時(shí)鐘數(shù),可以通過(guò)讀取這些數(shù)值與前一次讀取的數(shù)據(jù)對(duì)比來(lái)計(jì)算CPU的使用率和其它各種指標(biāo)。
/proc/stat文件的解讀
以下是通過(guò)/proc/stat文件來(lái)計(jì)算CPU使用率的代碼:
“`c
#include
#include
int mn() {
long int user, nice, sys, idle;
long int user_diff, nice_diff, sys_diff, idle_diff;
FILE *fp;
char buf[100];
while (1) {
// 打開(kāi)/proc/stat文件
fp = fopen(“/proc/stat”, “r”);
fgets(buf, sizeof(buf), fp);
// 讀取CPU匯總運(yùn)行時(shí)間的數(shù)據(jù)
sscanf(buf, “cpu %ld %ld %ld %ld”, &user, &nice, &sys, &idle);
// 關(guān)閉文件
fclose(fp);
// 等待1秒
sleep(1);
// 再次打開(kāi)/proc/stat文件
fp = fopen(“/proc/stat”, “r”);
fgets(buf, sizeof(buf), fp);
// 讀取CPU匯總運(yùn)行時(shí)間的數(shù)據(jù)
sscanf(buf, “cpu %ld %ld %ld %ld”, &user_diff, &nice_diff, &sys_diff, &idle_diff);
// 關(guān)閉文件
fclose(fp);
// 計(jì)算CPU使用率
long int total_time = (user_diff + nice_diff + sys_diff) – (user + nice + sys);
long int idle_time = idle_diff – idle;
float cpu_usage = (float) (total_time – idle_time) / (float) total_time * 100.0;
printf(“CPU使用率: %.2f%%\n”, cpu_usage);
}
return 0;
}
“`
這段代碼首先通過(guò)fgets()函數(shù)從/proc/stat文件中讀取一行數(shù)據(jù),該行數(shù)據(jù)包含了整個(gè)系統(tǒng)所有CPU的運(yùn)行數(shù)據(jù)。接著使用sscanf()函數(shù)解析這行數(shù)據(jù),提取出user、nice、sys和idle這四個(gè)數(shù)據(jù),分別代表用戶進(jìn)程、優(yōu)先級(jí)較低的進(jìn)程、內(nèi)核進(jìn)程和CPU空閑時(shí)間的時(shí)鐘數(shù)。
接下來(lái),程序讓當(dāng)前進(jìn)程等待1秒鐘,然后再次讀取/proc/stat文件的之一行數(shù)據(jù),從中提取出上次讀取時(shí)CPU的四個(gè)數(shù)據(jù),以得到它們?cè)谶@1秒的時(shí)間內(nèi)的差值。
程序計(jì)算CPU使用率,具體的實(shí)現(xiàn)方式是將這1秒鐘的總時(shí)鐘數(shù)(total_time)減去空閑的時(shí)鐘數(shù)(idle_time),并將結(jié)果除以總時(shí)鐘數(shù),這樣可以得到CPU的使用率。
此外,/proc/stat文件還包含了許多其它的信息,如:
1. 上下文切換(Context Switching):上下文切換是指操作系統(tǒng)將CPU從一個(gè)進(jìn)程轉(zhuǎn)移到另一個(gè)進(jìn)程的過(guò)程,其中切換的成本包括將進(jìn)程的狀態(tài)保存到內(nèi)存中,因此上下文切換的次數(shù)越多,CPU的利用率就越低。可以通過(guò)讀取/proc/stat文件中的ctxt標(biāo)示符來(lái)計(jì)算上下文切換的次數(shù)。
2. 進(jìn)程數(shù):可以通過(guò)讀取/proc/stat文件中的processes標(biāo)示符來(lái)計(jì)算當(dāng)前進(jìn)程數(shù)。
3. 內(nèi)存頁(yè)交換(Memory Page Swapping):如果系統(tǒng)的物理內(nèi)存已經(jīng)用完,則操作系統(tǒng)會(huì)將部分?jǐn)?shù)據(jù)從內(nèi)存交換到硬盤(pán)上,以空出一些空間供新的數(shù)據(jù)使用,這個(gè)過(guò)程就是內(nèi)存頁(yè)交換??梢酝ㄟ^(guò)讀取/proc/stat文件中的pswpin和pswpout標(biāo)示符來(lái)計(jì)算內(nèi)存頁(yè)交換的次數(shù)。
4. 硬盤(pán)讀寫(xiě)(Disk I/O):可以通過(guò)讀取/proc/stat文件中的io開(kāi)頭的標(biāo)示符來(lái)計(jì)算硬盤(pán)的讀寫(xiě)速度和總量。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220在linux環(huán)境下,我們使用C語(yǔ)言編程,如何正確計(jì)算CPU使用率?(不限/proc/stat)
我的笨方法:
以/proc/stat為例,它里面的內(nèi)容如下:(之一行的幾個(gè)單詞,是我為了便于說(shuō)明,另外標(biāo)注的)
usernicesystem idle iowait irqsoftirq
cpu97 0
cpu
cpu
intr 0 0
ctxt
btime
processes
procs_running 1
procs_blocked 0
softirq1
分割線–
說(shuō)明:
user:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,用戶態(tài)的CPU時(shí)間(單位:jiffies) ,不包含 nice值為負(fù)進(jìn)程。1jiffies=0.01秒
nice:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,nice值為負(fù)的進(jìn)程所占用的CPU時(shí)間(單位:jiffies)
system:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,核心時(shí)間(單位:jiffies)
idle:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,除硬盤(pán)IO等待時(shí)間以外其它等待時(shí)間(單位:jiffies)
iowait:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,硬盤(pán)IO等待時(shí)間(單位:jiffies) ,
irq:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,硬中斷時(shí)間(單位:jiffies)
softirq:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,軟中斷時(shí)間(單位:jiffies)
CPU時(shí)間=user+system+nice+idle+iowait+irq+softirq
下面這幾項(xiàng)可以不看—-
intr:之一個(gè)為自系統(tǒng)啟動(dòng)以來(lái),發(fā)生的所有的中斷的次數(shù);然后每個(gè)數(shù)對(duì)應(yīng)一個(gè)特定的中斷自系統(tǒng)啟動(dòng)以來(lái)所發(fā)生的次數(shù)。
ctxt:自系統(tǒng)啟動(dòng)以來(lái)CPU發(fā)生的上下文交換的次數(shù)。
btime:從系統(tǒng)啟動(dòng)到現(xiàn)在為止的時(shí)間,單位為秒。
processes:自系統(tǒng)啟動(dòng)以來(lái)所創(chuàng)建的任務(wù)的個(gè)數(shù)目。
procs_running:當(dāng)前運(yùn)行隊(duì)列的任務(wù)的數(shù)目。
procs_blocked:當(dāng)前被阻塞的任務(wù)的數(shù)目。
-計(jì)算方法-
那么CPU利用率可以使用以下兩個(gè)方法。先取兩個(gè)采樣點(diǎn),然后計(jì)算其差值:
cpu usage=(idle2-idle1)/(cpu2-cpu1)*100
cpu usage=/(total_2 – total_1)*100
=============================================
建議:要用C語(yǔ)言來(lái)編程實(shí)現(xiàn)的話,提取各項(xiàng)數(shù)據(jù)會(huì)比較復(fù)雜,而用shell腳本來(lái)提取的話,會(huì)簡(jiǎn)單的多;所以你可以嘗試用腳本來(lái)提取數(shù)據(jù)并計(jì)算出CPU使用率,然后在C程序中用system( )函數(shù)來(lái)調(diào)用這個(gè)腳本。
需要判斷兩次或多次取中間值,否則不準(zhǔn)確 /proc這個(gè)方法就可以啊
time不能用嗎?
linux /proc/net/dev里面都是什么意思?
/proc目錄
Linux 內(nèi)核提供了一種通過(guò) /proc 文件系統(tǒng),在運(yùn)行時(shí)訪問(wèn)內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)、改變內(nèi)核設(shè)置的機(jī)制。proc文件系統(tǒng)是一個(gè)偽文件系統(tǒng),它只存在內(nèi)存當(dāng)中,而不占用外存空間。它以文件系統(tǒng)的方式為訪問(wèn)系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口。用戶和應(yīng)用程序可以通過(guò)
proc得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。由于系統(tǒng)的信息,如進(jìn)程,是動(dòng)態(tài)改變的,所以用戶或應(yīng)用程序讀取proc文件時(shí),proc文件系統(tǒng)是
動(dòng)態(tài)從系統(tǒng)內(nèi)核讀出所需信息并提交的。下面列出的這些文件或子文件夾,并不是都是在你的系統(tǒng)中存在,這取決于你的內(nèi)核配置和裝載的模塊。另外,在
/proc下還有三個(gè)很重要的目錄:net,scsi和sys。
Sys目錄是可寫(xiě)的,可以通過(guò)它來(lái)訪問(wèn)或修改內(nèi)核的參數(shù),而net和scsi則依賴于內(nèi)核配置。例如,如果系統(tǒng)不支持scsi,則scsi
目錄不存在。
除了以上介紹的這些,還有的是一些以數(shù)字命名的目錄,它們是進(jìn)程目錄。系統(tǒng)中當(dāng)前運(yùn)行的每一個(gè)進(jìn)程都有對(duì)應(yīng)的一個(gè)目錄在/proc下,以進(jìn)程的 PID號(hào)為目錄名,它們是讀取進(jìn)程信息的接口。而self目錄則是讀取進(jìn)程本身的信息接口,是一個(gè)link。
2. 子文件或子文件夾
/proc/buddyinfo 每個(gè)內(nèi)存區(qū)中的每個(gè)order有多少塊可用,和內(nèi)存碎片問(wèn)題有關(guān)
/proc/cmdline 啟動(dòng)時(shí)傳遞給kernel的參數(shù)信息
/proc/cpuinfo cpu的信息
/proc/crypto 內(nèi)核使用的所有已安裝的加密密碼及細(xì)節(jié)
/proc/devices 已經(jīng)加載的設(shè)備并分類
/proc/dma 已注冊(cè)使用的ISA DMA頻道列表
/proc/execdomains Linux內(nèi)核當(dāng)前支持的execution domains
/proc/fb 幀緩沖設(shè)備列表,包括數(shù)量和控制它的驅(qū)動(dòng)
/proc/filesystems 內(nèi)核當(dāng)前支持的文件系統(tǒng)類型
/proc/interrupts x86架構(gòu)中的每個(gè)IRQ中斷數(shù)
/proc/iomem 每個(gè)物理設(shè)備當(dāng)前在系統(tǒng)內(nèi)存中的映射
/proc/ioports 一個(gè)設(shè)備的輸入輸出所使用的注冊(cè)端口范圍
/proc/kcore 代表系統(tǒng)的物理內(nèi)存,存儲(chǔ)為核心文件格式,里邊顯示的是字節(jié)數(shù),等于RAM大小加上4kb
/proc/kmsg 記錄內(nèi)核生成的信息,可以通過(guò)/in/klogd或/bin/dmesg來(lái)處理
/proc/loadavg 根據(jù)過(guò)去一段時(shí)間內(nèi)CPU和IO的狀態(tài)得出的負(fù)載狀態(tài),與uptime命令有關(guān)
/proc/locks 內(nèi)核鎖住的文件列表
/proc/mdstat 多硬盤(pán),RAID配置信息(md=multiple disks)
/proc/meminfo RAM使用的相關(guān)信息
/proc/misc 其他的主要設(shè)備(設(shè)備號(hào)為10)上注冊(cè)的驅(qū)動(dòng)
/proc/modules 所有加載到內(nèi)核的模塊列表
/proc/mounts 系統(tǒng)中使用的所有掛載
/proc/mtrr 系統(tǒng)使用的Memory Type Range Registers (MTRRs)
/proc/partitions 分區(qū)中的塊分配信息
/proc/pci 系統(tǒng)中的PCI設(shè)備列表
/proc/slabinfo 系統(tǒng)中所有活動(dòng)的 slab 緩存信息
/proc/stat 所有的CPU活動(dòng)信息
/proc/sysrq-trigger
使用echo命令來(lái)寫(xiě)這個(gè)文件的時(shí)候,遠(yuǎn)程root用戶可以執(zhí)行大多數(shù)的系統(tǒng)請(qǐng)求關(guān)鍵命令,就好像在本地終端執(zhí)行一樣。要寫(xiě)入這個(gè)文件,需要把/proc
/sys/kernel/sysrq不能設(shè)置為0。這個(gè)文件對(duì)root也是不可讀的
/proc/uptime 系統(tǒng)已經(jīng)運(yùn)行了多久
/proc/swaps 交換空間的使用情況
/proc/version Linux內(nèi)核版本和gcc版本
/proc/bus 系統(tǒng)總線(Bus)信息,例如pci/u等
/proc/driver 驅(qū)動(dòng)信息
/proc/fs 文件系統(tǒng)信息
/proc/ide ide設(shè)備信息
/proc/irq 中斷請(qǐng)求設(shè)備信息
/proc/net 網(wǎng)卡設(shè)備信息
/proc/scsi scsi設(shè)備信息
/proc/tty tty設(shè)備信息
/proc/net/dev 顯示網(wǎng)絡(luò)適配器及統(tǒng)計(jì)信息
/proc/vmstat 虛擬內(nèi)存統(tǒng)計(jì)信息
/proc/vmcore 內(nèi)核panic時(shí)的內(nèi)存映像
/proc/diskstats 取得磁盤(pán)信息
/proc/schedstat kernel調(diào)度器的統(tǒng)計(jì)信息
/proc/zoneinfo 顯示內(nèi)存空間的統(tǒng)計(jì)信息,對(duì)分析虛擬內(nèi)存行為很有用
以下是/proc目錄中進(jìn)程N(yùn)的信息
/proc/N pid為N的進(jìn)程信息
/proc/N/cmdline 進(jìn)程啟動(dòng)命令
/proc/N/cwd 鏈接到進(jìn)程當(dāng)前工作目錄
/proc/N/environ 進(jìn)程環(huán)境變量列表
/proc/N/exe 鏈接到進(jìn)程的執(zhí)行命令文件
/proc/N/fd 包含進(jìn)程相關(guān)的所有的文件描述符
/proc/N/maps 與進(jìn)程相關(guān)的內(nèi)存映射信息
/proc/N/mem 指代進(jìn)程持有的內(nèi)存,不可讀
/proc/N/root 鏈接到進(jìn)程的根目錄
/proc/N/stat 進(jìn)程的狀態(tài)
/proc/N/statm 進(jìn)程使用的內(nèi)存的狀態(tài)
/proc/N/status 進(jìn)程狀態(tài)信息,比stat/statm更具可讀性
/proc/self 鏈接到當(dāng)前正在運(yùn)行的進(jìn)程
記錄了不同網(wǎng)絡(luò)接口(interface)上的各種包的記錄
之一列是接口名稱,一般你能看到 lo (自環(huán),loopback接口)和 eth0 (網(wǎng)卡)
第二大列是這個(gè)接口上收到的包統(tǒng)計(jì),第三大列是發(fā)送的統(tǒng)計(jì),每一大列下又分為以下小列
收(如果是第三大列,就是發(fā))字節(jié)數(shù)(byte), 包數(shù)(packet), 錯(cuò)誤包數(shù)(errs), 丟棄包數(shù)(drop), fifo (First in first out)包數(shù), frame (幀,這一項(xiàng)對(duì)普通以太網(wǎng)卡應(yīng)該無(wú)效的)數(shù), 壓縮(compressed)包數(shù)(不了解), 多播(multicast, 比如廣播包或者組播包)包數(shù)。
關(guān)于linux中的proc stat的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌建站設(shè)計(jì),成都高端網(wǎng)站制作開(kāi)發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營(yíng)銷(xiāo)讓企業(yè)網(wǎng)站產(chǎn)生價(jià)值。
文章標(biāo)題:Linux下procstat詳解(linux中的procstat)
標(biāo)題來(lái)源:http://m.fisionsoft.com.cn/article/djddipj.html


咨詢
建站咨詢
