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
微信公众号:测试生财(定期分享独家内容和资源)