Linux下如何獲取cpu的利用率

2021-01-11 TechWeb

【51CTO活動】8.26 帶你與清華大學、搜狗、京東大咖們一起探討基於算法的IT運維實踐

"proc文件系統是一個偽文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供接口。用戶和應用程式可以通過proc得到系統的信息,並可以改變內核的某些參數。"

這裡將介紹如何從/proc文件系統中獲取與防火牆相關的一些性能參數,以及如何通過/proc文件系統修改內核的相關配置。

1、從/proc文件系統獲取相關的性能參數

cpu使用率: /proc/stat

內存使用情況: /proc/meminfo

網絡負載信息: /proc/net/dev

相應的計算方法:(摘自:什麼是proc文件系統,見參考資料)

(1) 處理器使用率

(2) 內存使用率

(3) 流入流出數據包

(4) 整體網絡負載

這些數據分別要從/proc/stat、/proc/net/dev、/proc/meminfo三個文件中提取。如裡有問題或對要提取的數據不太清楚,可以使用man proc來查看proc文件系統的聯機手冊。

(1) 處理器使用率

這裡要從/proc/stat中提取四個數據:用戶模式(user)、低優先級的用戶模式(nice)、內核模式(system)以及空閒的處理器時間(idle)。它們均位於/proc/stat文件的第一行。CPU的利用率使用如下公式來計算。

CPU利用率 = 100 *(user + nice + system)/(user + nice + system + idle)

(2) 內存使用率

這裡需要從/proc/meminfo文件中提取兩個數據,當前內存的使用量(cmem)以及內存總量(amem)。

內存使用百分比 = 100 * (cmem / umem)

(3)網絡利用率

為了得到網絡利用率的相關數據,需要從/proc/net/dev文件中獲得兩個數據:從本機輸出的數據包數,流入本機的數據包數。它們都位於這個文件的第四行。

性能收集程序開始記錄下這兩個數據的初始值,以後每次獲得這個值後均減去這個初始值即為從集群啟動開始從本節點通過的數據包。

利用上述數據計算出網絡的平均負載,方法如下:

平均網絡負載 = (輸出的數據包+流入的數據包) / 2

2. 通過/proc文件系統調整相關的內核配置

允許ip轉發 /proc/sys/net/ipv4/ip_forward

禁止ping /proc/sys/net/ipv4/icmp_echo_ignore_all

可以在命令行下直接往上述兩個「文件」裡頭寫入"1"來實現相關配置,如果寫入"0"將取消相關配置。不過在系統重啟以後,這些配置將恢復默認設置,所以,如果想讓這些修改生效,可以把下面的配置直接寫入/etc/profile文件,或者其他隨系統啟動而執行的程序文件中。

echo 1 > /proc/sys/net/ipv4/ip_forward

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

這裡計算cpu使用率是有問題的,需要使用上一狀態的值來計算

正確的計算方法是,等上一個時間:

1、記錄某個時刻cpu的使用情況

2、等上一個時間段

3、再記錄此刻的cpu使用情況

4、計算總的時間片

把第一次的所有cpu使用情況求和,得到j1

把第二次的所有cpu使用情況求和,得到j2

j2-j1得到這個時間段的所有時間片

即total=j2-j1=第二次的所有列的和-第一次的所有列的和

5、計算idle時間

idle對應第五列的數據,用第二次的減去第一次的即可

idle=第二次的第五列-第一次的第五列

6、計算cpu使用率

rate=(total-idle)/total

在Linux/Unix下,CPU利用率分為用戶態 ,系統態 和空閒態 ,分別表示CPU處於用戶態執行的時間,系統內核執行的時間,和空閒系統進程執行的時間。平時所說的CPU利用率是指:CPU執行非系統空閒進程的時間 / CPU總的執行時間 。

linux c程序獲取cpu使用率及內存使用情況

2009-05-17 23:10

想獲取一下目標機運行時linux系統的硬體佔用情況,寫了這幾個小程序,以後直接用了。

方法就是讀取proc下的文件來獲取了。 cpu使用率: /proc/stat ,內存使用情況: /proc/meminfo

看程序 :

/***************************************************************  *    @file:        statusinfo.c  *  *    @brief:        從linux系統獲取cpu及內存使用情況 *  *    @version    1.0  *  ***************************************************************/  typedef struct PACKED         //定義一個cpu occupy的結構體 { char name[20];      //定義一個char類型的數組名name有20個元素 unsigned int user; //定義一個無符號的int類型的user  unsigned int nice; //定義一個無符號的int類型的nice  unsigned int system;//定義一個無符號的int類型的system  unsigned int idle; //定義一個無符號的int類型的idle  }CPU_OCCUPY;   typedef struct PACKED         //定義一個mem occupy的結構體 { char name[20];      //定義一個char類型的數組名name有20個元素 unsigned long total;   char name2[20];  unsigned long free;                         }MEM_OCCUPY;   get_memoccupy (MEM_OCCUPY *mem) //對無類型get函數含有一個形參結構體類弄的指針O  {      FILE *fd;                int n;                   char buff[256];         MEM_OCCUPY *m;      m=mem;                                                                                                                      fd = fopen ("/proc/meminfo", "r");               fgets (buff, sizeof(buff), fd);       fgets (buff, sizeof(buff), fd);       fgets (buff, sizeof(buff), fd);       fgets (buff, sizeof(buff), fd);       sscanf (buff, "%s %u %s", m->name, &m->total, m->name2);             fgets (buff, sizeof(buff), fd); //從fd文件中讀取長度為buff的字符串再存到起始地址為buff這個空間裡       sscanf (buff, "%s %u", m->name2, &m->free, m->name2);             fclose(fd);     //關閉文件fd  }   int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)   {         unsigned long od, nd;          unsigned long id, sd;      int cpu_use = 0;               od = (unsigned long) (o->user + o->nice + o->system +o->idle);//第一次(用戶+優先級+系統+空閒)的時間再賦給od      nd = (unsigned long) (n->user + n->nice + n->system +n->idle);//第二次(用戶+優先級+系統+空閒)的時間再賦給od              id = (unsigned long) (n->user - o->user);    //用戶第一次和第二次的時間之差再賦給id      sd = (unsigned long) (n->system - o->system);//系統第一次和第二次的時間之差再賦給sd      if((nd-od) != 0)      cpu_use = (int)((sd+id)*10000)/(nd-od); //((用戶+系統)乖100)除(第一次和第二次的時間差)再賦給g_cpu_used      else cpu_use = 0;      //printf("cpu: %u/n",cpu_use);      return cpu_use;  }   get_cpuoccupy (CPU_OCCUPY *cpust) //對無類型get函數含有一個形參結構體類弄的指針O  {         FILE *fd;               int n;                  char buff[256];       CPU_OCCUPY *cpu_occupy;      cpu_occupy=cpust;                                                                                                                       fd = fopen ("/proc/stat", "r");       fgets (buff, sizeof(buff), fd);            sscanf (buff, "%s %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle);            fclose(fd);       }   int main()  {      CPU_OCCUPY cpu_stat1;      CPU_OCCUPY cpu_stat2;      MEM_OCCUPY mem_stat;      int cpu;            //獲取內存     get_memoccupy ((MEM_OCCUPY *)&mem_stat);            //第一次獲取cpu使用情況     get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);      sleep(10);            //第二次獲取cpu使用情況     get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);            //計算cpu使用率     cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);            return 0;  } 

點讚 0

相關焦點

  • linux下如何獲取cpu的利用率
    這裡將介紹如何從/proc文件系統中獲取與防火牆相關的一些性能參數,以及如何通過/proc文件系統修改內核的相關配置。CPU的利用率使用如下公式來計算。    idle=第二次的第五列-第一次的第五列6、計算cpu使用率rate=(total-idle)/total  在Linux/Unix下,CPU利用率分為用戶態 ,系統態 和空閒態 ,分別表示CPU處於用戶態執行的時間,系統內核執行的時間,和空閒系統進程執行的時間。
  • 如何快速獲取CPU利用率
    本篇筆記主要介紹,在freeRTOS環境下,以STM32為例介紹如何快速獲取CPU利用率,配合CubeMonitor測試
  • Linux下如何獲取CPU內存等硬體信息?
    前言在linux環境下,我們有時候需要寫一些有關伺服器配置信息的文檔,這時候,如果我們本身沒有這些這些伺服器的購置信息,就需要藉助命令查詢出來,然後匯總到一個表格裡,主要用於一些文檔需要。Linux下獲取CPU內存信息的命令1.
  • 教你如何在 Ubuntu Linux 中獲取CPU溫度
    在本教程中,我們將學習如何從命令行和桌面獲取Ubuntu Linux上的CPU溫度。
  • 關於CPU利用率的介紹
    CPU利用率是指一段時間內CPU消耗的度量,強調的是經過一段時間內測出來的,就像速度一樣,其概念是單位時間內移動的距離,這也解釋了為什麼top命令要有個時間間隔,默認是2秒。總的來說CPU利用率的實現原理是:在單位時間內連續兩次採樣CPU的時間片數,由於其是累積量,因此要取其差以獲取增量,然後再經過後續處理得到不同級別的CPU利用率。
  • Linux伺服器性能分析之CPU利用率
    如何查看cpu利用率2.1 使用top命令查看數據來自/proc/stat文件%us =(User time + Nice 顯示了用戶方式下所花費CPU時間的百分比,用戶使用CPU的進程包括:cpu運行常規用戶進程,cpu運行niced process,cpu運行實時進程。
  • Linux CPU負載與利用率
    如果是多核多cpu,比如現在是2個cpu,每個cpu是1個核,那麼理論上總負載不能超過2。2、如何查看CPU信息?(1)查看單個cpu核數:cat /proc/cpuinfo | grep "cpu cores"|uniq(2)查看物理CPU個數:cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l(3)查看邏輯CPU的個數:cat
  • Linux CPU利用率的這點事,身為DevOps的你有必要知道
    在Linux/Unix下,CPU利用率分為用戶態、系統態和空閒態,分別表示CPU處於用戶態執的時間,系統內核執行的時間,和空閒系統進程執行的時間。CPU佔用率相關的概念CPU UsageCPU利用率:CPU的使用情況。
  • Linux下CPU的利用率
    CPU利用率是對系統進行性能分析的重要因素,本文將說明CPU時間的組成以及利用率的計算方法。
  • 教你如何在Ubuntu Linux中獲取CPU溫度
    在本教程中,我們將學習如何從命令行和桌面獲取Ubuntu Linux上的CPU溫度。文內含長段代碼可複製可往左滑,希望對大家有幫助!可以使用它檢測cpu的溫度。以下命令安裝hardinfo:bob@bob-PC:~/Desktop$ sudo apt install hardinfo# 運行一下命令打開hardinfobob@bob-PC:~/Desktop$ sudo hardinfo
  • 用了這麼多年的 CPU 利用率,其實是錯的
    原文連結:http://www.brendangregg.com/blog/2017-05-09/cpu-utilization-is-wrong.html本文中若有任何疏漏錯誤,責任在於編譯者。有任何建議和意見,請回復內核月談微信公眾號,或通過 caspar at linux.alibaba.com 反饋。
  • 【Linux環境下如何計算CPU佔用率
    1、Linux 環境下查看 CPU 信息1.1、查看 CPU 詳細信息通過 cat /proc/cpuinfo 命令,可以查看 CPU 相關的信息
  • Linux下如何使用X86 CPU的GPIO
    ,但ACPI對各個作業系統有兼容性問題,這就會出現你在Windows設備管理器能看到該設備,到linux下什麼也沒有,因為大部分X86硬體廠商的BIOS主要兼容Windows為主,一般桌面CPU都是用的Windows系統嘛。
  • 實現自我隱藏 CPU 利用率的最佳方法,不妨一試!
    想不想讓CPU利用率展示成一首優美的旋律,就像彈琴一樣。我的意思是,你想讓系統以及 task 的 CPU 利用率是多少它就是多少,一切都是由你的程序自己來調製演奏。 這需要一種自指機制。     *     */    __get_cpu_var(kernel_cpustat).cpustat[index] += tmp;    cpuacct_account_field(p, index, tmp);}其中的 index 是一個枚舉,分別表示 CPU 時間的類型,大致看一眼就行:
  • 如何Linux下得到CPU、內存及PCI信息
    很多時候我們需要得到linux下面的硬體信息,那麼如何得到呢?其實linux給出了多種途徑我們看一下每一個命令,以便得到最詳細的信息/*二,硬體的查看1,lspci2,dmidecode3,dmesg*/1,查看pci的相關信息先解釋一下概念:什麼是PCIPeripheral Component Interconnect,外圍設備互聯,它是計算機上面應用的設備總線
  • Linux查看cpu當前的各種信息
    Linux查看cpu當前的各種信息 這篇文章是為了教會大家如何在Linux下查看Linux查看cpu信息而作的報導,並且做了相應的命令說明,相信大家能看的很明了 作者:佚名來源:|2010-05-27 16:03
  • Linux - cpupower調整CPU主頻
    前言linux內核支持調節CPU主頻,降低功耗,已到達節能的效果。對於行動裝置和筆記本來說,在沒有接通電源的時候,續航是很重要的。通過選擇系統空閒狀態不同的電源管理策略,可以實現不同程度降低伺服器功耗。但是,更低的功耗策略意味著 CPU 喚醒更慢對性能影響更大。對於對時延和性能要求高的應用。
  • 排查cpu、內存、IO問題命令詳解
    參數作用案例N按照pid排序(PID一列從大到小)P按照cpu利用率排序(%CPU一列從大到小)M按照內存利用率排序(%MEM一列從大到小)T進程使用cpu時間總計排序(TIME+一列從大到小)1數字1可以看到有幾個cpu,每個cpu的使用情況c切換顯示命令名稱和完整命令行f查看top輸出欄位的含義m切換顯示內存信息n輸入數字
  • linux redhat 5系統查詢CPU的規格型號
    還好是linux系統,可以通過命令行的方式就可以了解到CPU的規格型號。這可能會讓一些使用Windows系統的很妒忌。沒辦法,linux就是這麼強大。我們試試吧。cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看物理CPU個數cat /proc/cpuinfo| grep "cpu cores"| uniq # 查看每個物理CPU中core的個數(即核數
  • 如何在 Linux 上安裝/更新 Intel 微碼固件 | Linux 中國
    這篇文章演示了如何使用包管理器或由 lntel 提供的 Linux 處理器微碼更新來安裝 AMD 或 Intel 的微碼更新。如何在 Linux 上使用包管理器去安裝微碼固件更新對於運行在 x86/amd64 架構的 CPU 上的 Linux 系統,Linux 自帶了工具去更改或者部署微碼固件。