对CPU 内存 硬盘读写 网络 进行压力测试
YoungForest · https://youngforest.github.io/2017/01/14/pressure-test-to-CPU-memory-disk-network-IO/
文章目录 · 7 节
近来实验室的师兄有个需求, 写4个小程序, 分别对内存, CPU, 硬盘, 网络进行压力测试, 要求测试程序有压力档位可以调, 比如压力可以分为大, 中, 小. 二话不说, 撸起袖子加油干. 需求很简单, 但实现起来却并不简单, 笔者边学习, 边写程序, 才勉强完成任务.
测试环境
Ubuntu 14.04
CPU
受编程之美的第一章"让CPU占有率曲线听你指挥"启发, 我很快地完成了对CPU的压力测试程序.
基本思路
确定一个小周期, 笔者的周期设置为100, 这个值可以通过改变PIECE的值来改变, 周期为 100 * PIECE.
在每个周期中, stress%的时间用于一个死循环, 剩下 (100-stress)%的时间usleep(注意sleep和usleep的区别).
程序源代码
使用方法
1 | $ 程序名 stress # 其中 0<=stress<=100 |
硬盘读写
对硬盘进行读写的压力测试, 我是分别通过两个程序实现的.
硬盘读操作
基本思路
与CPU的压力测试类似, 在一个周期(1s)里, 先从硬盘里读取特定大小(speed)的数据, 周期的剩余时间sleep.
程序源代码
使用方法
1 | $ python3 disk_read.py 硬盘名 level # 其中level可以是0, 1, 2, 3 |
硬盘写操作
基本思想
硬盘写操作的压力测试与读操作类似. 在一个周期内(1s)向一个文件中写入特定大小的数据, 之后删掉, 在周期的剩余时间内sleep.
为了向文件中写数据, 笔者使用了命令
dd if=/dev/zero of=/path/to/targetfile bs=1024k count=speed conv=fdatasync > /dev/null 2> /dev/null.
该命令从/dev/zero中读取数据(其实是无效数据, /dev/zero 经常被作为初始化文件的数据源), 写入到/path/to/targetfile中. 为了不使dd产生的错误输出和标准输出影响本程序的可读性, 使用重定向了. /dev/null 是一个黑洞设备, 可以向其输入任何数据而不会产生坏的影响.
程序源代码
使用方法
1 | $ python3 disk_write.py 硬盘名 level # 其中level可以是0, 1, 2, 3 |
内存
基本思想
对内存的测试, 笔者的师兄向笔者介绍了memtester这个程序. 具体安装及使用方法:
1 | $ # 安装 |
一般情况下, 不需要指定PHYSADDR, 因为可能将其他进程占用的内存破坏掉, 存在一定的危险性.
利用memtester这个程序, 笔者进行简单加工, 就完成了需求.
程序源代码
使用方法
1 | $ python3 memory_benchmark.py <MEMORY> [ITERATIONS] |
网络
师兄的需求是需要公网压力测试, 查找了很多资料, 大多数工具都是测网速的, 而不是可以指定上下行速率进行测试. 幸运的是, 找了几天之后, 终于找到一个工具iperf可以勉强完成任务.
基本思路
一台机器作为服务器, 另一台机器作为客户端, 客户端向服务器发包, 服务器接受, 连接使用UDP连接. 这也就是说, 如果没有服务器的话, 客户端仍然可以对网络上行进行压力测试; 但没有客户端, 服务器则没法对网络下行进行压力测试. 简单地说, 服务器(下行)是被动的, 客户端(上行)是主动的, 没人收包仍然可以狂发包, 但没人发包, 无论如何是收不到包的.
安装
1 | $ sudo apt-get install iperf |
使用方法
服务器
启动服务器
1 | $ iperf -s |
客户端
1 | $ iperf -c 服务器ip -b 压力值 |