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,执行下看看效果:

 

传送门:2021最新测试资料与大厂招聘合集

博主:测试生财(一个不为996而996的测开码农)

座右铭:专注测试开发与自动化运维,努力读书思考写作,为内卷的人生奠定财务自由。

内容范畴:技术提升,职场杂谈,事业发展,阅读写作,投资理财,健康人生。

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

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

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

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐