cpu壓測神器:cpuburn深度指南【轉】

轉自:https://www.cnblogs.com/qa-freeroad/p/13649589.html

1. 前言

最近在測試一個物聯網的項目,項目裏包含設備資源進行監控告警的功能。例如如下監控項:cpu負載超核、內存使用率過高、硬盤使用率過高,系統流量超速等。爲了驗證監控的有效性,就需要構造對應場景來進行測試。

如何對cpu,內存,硬盤,流量這幾類資源進行數據構造呢?

我在網速蒐羅了一圈發現有四個比較好用的工具,能較方便的構造對應場景:

  • cpuburn
  • memtester
  • dd
  • netperf

首先我們來介紹這款燒腦神器,cpuburn

2.簡介

項目地址:https://patrickmn.com/projects/cpuburn/

一句話介紹:cpuburn lets you utilize 100% of all available cores from the command line — useful when stress-testing(cpuburn 能夠讓你用一行命令來打滿所有CPU的可用核,在做壓力測試的時候特別奏效)

3.安裝方式

cpuburn主要是針對windows和linux系統。

有三種安裝方式

1. 二進制運行

2. 源碼編譯安裝

3. yum或者apt安裝

3.1 二進制安裝

3.1.1 Linux版下載地址

Linux:

1)32位   cpuburn-1.0-i386.tar.gz

2)64位  cpuburn-1.0-amd64.tar.gz

3.1.2 Linux下安裝

1)根據系統位數下載上述文件(以64位爲例)

wget https://cdn.pmylund.com/files/tools/cpuburn/linux/cpuburn-1.0-amd64.tar.gz

2)解壓縮,解壓完之後即可得到cpuburn二進制

tar xzvf cpuburn-1.0-amd64.tar.gz

3) 拷貝cpuburn到/usr/bin

cp cpuburn /usr/bin/

3.1.3 Windows版下載地址

Windows: cpuburn-1.0.zip

3.1.3 Windows下安裝

1)點擊下載後解壓縮到當前目錄

2)添加到Path環境變量中(可選)

運行如圖

3.2 源碼編譯安裝

這種方式適合官方沒有對應系統包的情況,比如mac

1)安裝go環境(如果已經安裝,請忽略)

參考:go環境搭建

2)下載源碼

git clone https://github.com/patrickmn/cpuburn

3) 編譯源碼

執行完如下命令後會在當前目錄生成cpuburn二進制文件

go build cpuburn.go

3.3 使用yum或者apt安裝

Centos:
yum install -y cpuburn
Ubuntu:
apt-get install -y cpuburn

4. 幫助

輸入:cpuburn -h

Usage of ./cpuburn:

-n int

number of cores to burn (0 = all) //指定進行壓測的CPU核數,默認爲0(有幾核壓幾核)

-u int

seconds between updates (0 = don't update) (default 10) //打印運行時長的間隔,默認10秒中打印一次運行時間(0代表靜默模式,不打印任何信息)

5. 例子

1. 壓測所有CPU核(當前CPU有8核),每隔10秒更新一次運行時間。

cpuburn

2.壓測CPU核數爲4,每隔10秒更新一次運行時間。

cpuburn -n=4

查看效果:

輸入:top,然後按最上面的數字1,可以看到4核幾乎被全部榨滿了。

3.靜默模式運行cpuburn

cpuburn -u=0

6.源碼解析

cpuburn是go寫的一個小工具,非常的輕巧,讓我們簡單拜讀一下。

複製代碼
package main

import (
        "flag"
        "fmt"
        "runtime"
        "time"
)

var (
        numBurn        int
        updateInterval int
)

func cpuBurn() {          //這裏是核心,每個go協程不斷的讓出CPU時間片
        for {
                for i := 0; i < 2147483647; i++ {
                }
                runtime.Gosched()
        }
}

func init() { //初始化變量
        fmt.Printf("Your System is %s,and CPUs/cores number is %d\n",runtime.GOOS, runtime.NumCPU); //這裏是我加的一個打印信息
        flag.IntVar(&numBurn, "n", 0, "number of cores to burn (0 = all)")
        flag.IntVar(&updateInterval, "u", 10, "seconds between updates (0 = don't update)")
        flag.Parse()
        if numBurn <= 0 {
                numBurn = runtime.NumCPU()
        }
}

func main() {
        runtime.GOMAXPROCS(numBurn)    //設定使用的cpu核數,不設定默認使用1核運行所有協程
        fmt.Printf("Burning %d CPUs/cores\n", numBurn)
        for i := 0; i < numBurn; i++ {              //根據指定的cpu核數創建go攜程
                go cpuBurn()
        }
        if updateInterval > 0 {   //如果設定了更新時間,則不斷每間隔updateInterval*60秒打印更新時間
                t := time.Tick(time.Duration(updateInterval) * time.Second) //設定定時器時間間隔
                for secs := updateInterval; ; secs += updateInterval { //間隔幾秒打印一下當前運行的總時間
                        <-t
                        fmt.Printf("%d seconds\n", secs)
                }
        } else { //如果沒有設定更新時間,則一直阻塞住。
                select {} // wait forever
        }
}
複製代碼

 

重新編譯cpuburn.go,執行下看看效果:

博主:測試生財(一個不爲996而996的測開碼農)

座右銘:專注測試開發與自動化運維,努力讀書思考寫作,爲內卷的人生奠定財務自由。

內容範疇:技術提升,職場雜談,事業發展,閱讀寫作,投資理財,健康人生。

csdn:https://blog.csdn.net/ccgshigao

博客園:https://www.cnblogs.com/qa-freeroad/

51cto:https://blog.51cto.com/14900374

微信公衆號:測試生財(定期分享獨家內容和資源)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章