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

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


咨詢
建站咨詢
