cpu压测神器:cpuburn深度指南

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

微信公众号:测试生财(定期分享独家内容和资源)

posted @ 2020-09-11 08:03  公众号-测试生财  阅读(4359)  评论(0编辑  收藏  举报