最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go程序測試CPU占用率統(tǒng)計ps?vs?top兩種不同方式對比

 更新時間:2023年05月24日 09:48:33   作者:極限實驗室  
這篇文章主要為大家介紹了go程序測試CPU占用率統(tǒng)計ps?vs?top兩種不同方式對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

如何計算 CPU 占用率?

簡單來說,進程的 CPU 占用率指的是 CPU 有多少時間花費在了運行進程上。在 Linux 系統(tǒng)里,進程運行的時間是以jiffies[1]統(tǒng)計的,通過計算jiffies * HZ,就可以得到進程消耗的 CPU 時間,再除以 CPU 的總時間,就可以得到進程的 CPU 占用率:jiffies * HZ / total_time

ps 和 top 的不同之處

pstop是最常用的兩種查看 CPU 占用的方式,都可以用來快速找到當前 CPU 占用率高的進程。但實際上這兩個工具的統(tǒng)計方式是完全不同的。

我們用下面這個簡單的 Go 程序來測試這兩個工具的差別:

package main
import (
    "bytes"
    "fmt"
    "strconv"
    "sync"
    "time"
)
var testData = []byte(`testdata`)
func testBuffer(idx int) {
  m := map[string]*bytes.Buffer{}
  for i := 0; i < 100; i += 1 {
    buf, ok := m[strconv.Itoa(i)]
    if !ok {
      buf = new(bytes.Buffer)
    }
    for j := 0; j < 1024; j += 1 {
      buf.Write(testData)
    }
    m[strconv.Itoa(i)] = buf
  }
  fmt.Println("done, ", idx)
  wg.Done()
}
var wg sync.WaitGroup
func main() {
    for i := 0; i < 10; i += 1 {
        wg.Add(1)
        j := i
        go testBuffer(j)
    }
    wg.Wait()
    fmt.Println("sleeping")
    time.Sleep(time.Hour)
}

然后我們運行這個程序,通過topps aux分別查看進程的 CPU 占用情況。

top -n 1:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
39753 infini    20   0 14.663g 0.014t   1200 S 611.1 22.2   0:23.53 test-cpu

ps aux:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
infini   39881  767 39.1 26505284 25791892 pts/16 Sl+ 07:04   0:38 ./test-cpu

可以看到,pstop統(tǒng)計的 CPU 占用率是近似的(由于時間點并不完全吻合,統(tǒng)計值也會有輕微差別)。兩個工具的差異體現在testBuffer結束后,top統(tǒng)計的 CPU 占用率已經接近于 0,但是ps依然統(tǒng)計到很高的 CPU 占用率:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
infini   39881 82.3 42.4 28638148 27953532 pts/16 Sl+ 07:04   0:40 ./test-cpu

為什么 ps 和 top 的統(tǒng)計值會有差異?

這兩個工具的差異來自于各自運行方式的不同:top 只能持續(xù)運行一段時間,而 ps 是立刻返回的。這個差異體現在運行top -n 1ps aux時,top是延遲后返回的,而ps是立刻返回的。這兩種不同的運行方式就會反映在兩個工具的統(tǒng)計算法上。

文章開頭我們提到,Linux 的 CPU 時間是按照jiffies統(tǒng)計的,考慮到效率問題,Linux 只會統(tǒng)計總值,不會記錄歷史數據。對于 ps 來說,由于只能統(tǒng)計到瞬時值,這個瞬時值的統(tǒng)計算法就必然拿不到實時的 CPU 占用率,因為實時的占用率需要通過 (current_cpu_time - last_cpu_time) / time_duration來得到,ps 只能統(tǒng)計一次,所以time_duration0,也就無法計算這個占用率。實際上,ps 統(tǒng)計的是整個進程運行周期內的 CPU 占用率[2]:

(total_cpu_time / total_process_uptime)

對于測試程序這種短時間的占用率上升,剛開始的時候 ps 能夠統(tǒng)計到近似準確的平均 CPU 占用率,但是 cpu 占用恢復后,ps 的統(tǒng)計值并不會立刻下降,而是會隨著進程運行時間total_process_uptime的增加緩慢下降。

top 命令不同, top 是通過持續(xù)運行來更新 CPU 占用率統(tǒng)計的。-n 1這個參數指定 top 運行一個迭代后退出,top命令就可以通過這個延遲來可以完成一個迭代內的 CPU 占用率統(tǒng)計:

(current_cpu_time - last_cpu_time) / iteration_duration

如何持續(xù)監(jiān)控 CPU 占用率?

通常來說,監(jiān)控系統(tǒng)分為采集和統(tǒng)計兩個不同的組件,采集組件只會采集指標數值,統(tǒng)計功能通過數據庫/Dashboard 來實現。要監(jiān)控 CPU 占用率,ps是一個非常符合采集組件行為的統(tǒng)計方式,每次采集都可以拿到“當前”的 CPU 占用率。但是受限于算法本身的統(tǒng)計方式,我們實際采集到的是平均 CPU 占用率,無法反映進程的實時狀態(tài)。

以 INFINI Console為例,我們運行一個短時間的數據遷移任務負載,然后查看對應 INFINI 網關實例的 CPU 占用監(jiān)控(payload.instance.system.cpu,通過ps方式統(tǒng)計當前 CPU 占用率)??梢钥吹剑珻PU 占用率會以一個曲線上升,在任務結束后會緩慢下降:

如果想持續(xù)監(jiān)控實時 CPU 占用率,我們就需要借鑒top的統(tǒng)計方式,采集原始的進程 CPU 時間,進而通過聚合數據來計算 CPU 占用率。

在 Linux 系統(tǒng)下,pstop命令都會通過/proc/[PID]/stat提供的信息來計算 CPU 占用率[2]:

##  Name      Description
14  utime     CPU time spent in user code, measured in jiffies
15  stime     CPU time spent in kernel code, measured in jiffies
16  cutime    CPU time spent in user code, including time from children
17  cstime    CPU time spent in kernel code, including time from children

獲取到每個采樣時間的進程信息后,我們就可以通過這個公式來計算采樣周期內的 CPU 占用率:

delta(cpu_time) / delta(timestamp)

在 INFINI Console,我們可以通過deriative函數來計算payload.instance.system.user_in_mspayload.instance.system.sys_in_ms相對于timestamp的占比,進而得到準確的 CPU 占用率統(tǒng)計。

這樣,我們就可以統(tǒng)計到網關在運行任務負載前后的實時 CPU 占用率:

總結

雖然topps都可以統(tǒng)計 CPU 占用率,但統(tǒng)計算法卻完全不同。了解這兩種算法的底層原理之后,我們就可以設計出適合監(jiān)控系統(tǒng)的數據采集和數據統(tǒng)計方式,采集到準確的 CPU 占用率。

參考

Jiffies

Top and ps not showing the same cpu result

以上就是go程序測試CPU占用率統(tǒng)計ps vs top兩種不同方式對比的詳細內容,更多關于go CPU占用率統(tǒng)計的資料請關注腳本之家其它相關文章!

相關文章

  • Golang監(jiān)聽日志文件并發(fā)送到kafka中

    Golang監(jiān)聽日志文件并發(fā)送到kafka中

    這篇文章主要介紹了Golang監(jiān)聽日志文件并發(fā)送到kafka中,日志收集項目的準備中,本文主要講的是利用golang的tail庫,監(jiān)聽日志文件的變動,將日志信息發(fā)送到kafka中?,需要的朋友可以參考一下
    2022-04-04
  • golang 微服務之gRPC與Protobuf的使用

    golang 微服務之gRPC與Protobuf的使用

    這篇文章主要介紹了golang 微服務之gRPC與Protobuf的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Go語言基礎知識總結(語法、變量、數值類型、表達式、控制結構等)

    Go語言基礎知識總結(語法、變量、數值類型、表達式、控制結構等)

    這篇文章主要介紹了Go語言基礎知識總結(語法、變量、數值類型、表達式、控制結構等),本文匯總了Go語言的入門知識,需要的朋友可以參考下
    2014-10-10
  • Go語言單線程運行也會有的并發(fā)問題解析

    Go語言單線程運行也會有的并發(fā)問題解析

    這篇文章主要為大家介紹了Go語言單線程運行的并發(fā)問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Golang實現基于Redis的可靠延遲隊列

    Golang實現基于Redis的可靠延遲隊列

    redisson?delayqueue可以使用redis的有序集合結構實現延時隊列,遺憾的是go語言社區(qū)中并無類似的庫。不過問題不大,本文將用Go語言實現這一功能,需要的可以參考一下
    2022-06-06
  • Go中的Timer 和 Ticker詳解

    Go中的Timer 和 Ticker詳解

    在日常開發(fā)中,我們可能會遇到需要延遲執(zhí)行或周期性地執(zhí)行一些任務,這個時候就需要用到 Go 語言中的定時器,本文將會對這兩種定時器類型進行介紹,感興趣的朋友一起看看吧
    2024-07-07
  • Go語言消息隊列的性能優(yōu)化小結

    Go語言消息隊列的性能優(yōu)化小結

    本文介紹了消息隊列的性能優(yōu)化技巧,包括生產者批量發(fā)送、消費者預取、連接池管理等方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-05-05
  • Go select 死鎖的一個細節(jié)

    Go select 死鎖的一個細節(jié)

    這篇文章主要給大家分享的是Go select 死鎖的一個細節(jié),文章先是對主題提出問題,然后展開內容,感興趣的小伙伴可以借鑒一下,希望對你有所幫助
    2021-10-10
  • Go語言struct類型介紹

    Go語言struct類型介紹

    這篇文章主要介紹了Go語言struct類型介紹,本文講解了struct的2種聲明方式,struct的匿名字段等內容,需要的朋友可以參考下
    2015-01-01
  • golang使用os/exec庫查詢進程方式

    golang使用os/exec庫查詢進程方式

    本文介紹了使用Go語言os/exec查詢進程的方法,并提供了兩種方式,第一種方式輸出了當前系統(tǒng)所有運行的進程,第二種方式可以過濾出指定進程的信息
    2026-04-04

最新評論

襄垣县| 宜君县| 鲜城| 东平县| 瑞安市| 灯塔市| 阿克| 金沙县| 绥宁县| 丰镇市| 富顺县| 张家口市| 民乐县| 眉山市| 宁晋县| 当雄县| 山东省| 太原市| 三门峡市| 竹北市| 涪陵区| 青海省| 桂林市| 双柏县| 怀远县| 西昌市| 伽师县| 广饶县| 潮州市| 沾益县| 彩票| 平定县| 行唐县| 阿巴嘎旗| 湘阴县| 乡城县| 汝城县| 天门市| 金溪县| 囊谦县| 富源县|