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

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

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

如何計算 CPU 占用率?

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

ps 和 top 的不同之處

pstop是最常用的兩種查看 CPU 占用的方式,都可以用來快速找到當(dāng)前 CPU 占用率高的進(jìn)程。但實際上這兩個工具的統(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分別查看進(jìn)程的 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)計值也會有輕微差別)。兩個工具的差異體現(xiàn)在testBuffer結(jié)束后,top統(tǒng)計的 CPU 占用率已經(jīng)接近于 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 是立刻返回的。這個差異體現(xiàn)在運行top -n 1ps aux時,top是延遲后返回的,而ps是立刻返回的。這兩種不同的運行方式就會反映在兩個工具的統(tǒng)計算法上。

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

(total_cpu_time / total_process_uptime)

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

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

(current_cpu_time - last_cpu_time) / iteration_duration

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

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

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

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

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

delta(cpu_time) / delta(timestamp)

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

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

總結(jié)

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

參考

Jiffies

Top and ps not showing the same cpu result

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

相關(guān)文章

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

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

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

    golang 微服務(wù)之gRPC與Protobuf的使用

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

    Go語言基礎(chǔ)知識總結(jié)(語法、變量、數(shù)值類型、表達(dá)式、控制結(jié)構(gòu)等)

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

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

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

    Golang實現(xiàn)基于Redis的可靠延遲隊列

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

    Go中的Timer 和 Ticker詳解

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

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

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

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

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

    Go語言struct類型介紹

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

    golang使用os/exec庫查詢進(jìn)程方式

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

最新評論

陵川县| 清流县| 沂南县| 中牟县| 冀州市| 筠连县| 天峻县| 恩平市| 晋州市| 刚察县| 阿尔山市| 新郑市| 醴陵市| 淮安市| 格尔木市| 台南市| 彩票| 陆川县| 广水市| 定兴县| 孟津县| 邯郸市| 沈丘县| 讷河市| 苏州市| 贡嘎县| 揭阳市| 崇仁县| 油尖旺区| 涞水县| 元朗区| 潜江市| 枣庄市| 大厂| 休宁县| 万荣县| 无棣县| 合山市| 哈密市| 镇康县| 河东区|