对CPU 内存 硬盘读写 网络 进行压力测试

近来实验室的师兄有个需求, 写4个小程序, 分别对内存, CPU, 硬盘, 网络进行压力测试, 要求测试程序有压力档位可以调, 比如压力可以分为大, 中, 小. 二话不说, 撸起袖子加油干. 需求很简单, 但实现起来却并不简单, 笔者边学习, 边写程序, 才勉强完成任务.

测试环境

Ubuntu 14.04

CPU

编程之美的第一章"让CPU占有率曲线听你指挥"启发, 我很快地完成了对CPU的压力测试程序.

基本思路

确定一个小周期, 笔者的周期设置为100, 这个值可以通过改变PIECE的值来改变, 周期为 100 * PIECE.

在每个周期中, stress%的时间用于一个死循环, 剩下 (100-stress)%的时间usleep(注意sleep和usleep的区别).

程序源代码

使用方法

1
2
3
4
$ 程序名 stress    # 其中 0<=stress<=100
$ # 例子
$ gcc cpu_benchmark.c -o cpu_benchmark.out
$ cpu_benchmark.out 50

硬盘读写

对硬盘进行读写的压力测试, 我是分别通过两个程序实现的.

硬盘读操作

基本思路

与CPU的压力测试类似, 在一个周期(1s)里, 先从硬盘里读取特定大小(speed)的数据, 周期的剩余时间sleep.

程序源代码

使用方法

1
2
3
$ python3 disk_read.py 硬盘名 level    # 其中level可以是0, 1, 2, 3
$ # 例子
$ python3 disk_read.py /dev/vda 2

硬盘写操作

基本思想

硬盘写操作的压力测试与读操作类似. 在一个周期内(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
2
3
$ python3 disk_write.py 硬盘名 level    # 其中level可以是0, 1, 2, 3
$ # 例子
$ python3 disk_write.py /dev/vda 2

内存

基本思想

对内存的测试, 笔者的师兄向笔者介绍了memtester这个程序. 具体安装及使用方法:

1
2
3
4
$ # 安装
$ sudo apt-get install memtester
$ # 从PHYSADDR处分配MEMORY大小的内存, 测试ITERATIONS次.
$ sudo memtester [-p PHYSADDR] <MEMORY> [ITERATIONS]

一般情况下, 不需要指定PHYSADDR, 因为可能将其他进程占用的内存破坏掉, 存在一定的危险性.

利用memtester这个程序, 笔者进行简单加工, 就完成了需求.

程序源代码

使用方法

1
2
3
4
$ python3 memory_benchmark.py <MEMORY> [ITERATIONS]
$ # 例子
$ python3 memory_benchmark.py 3m 10
$ python3 memory_benchmark.py 2m

网络

师兄的需求是需要公网压力测试, 查找了很多资料, 大多数工具都是测网速的, 而不是可以指定上下行速率进行测试. 幸运的是, 找了几天之后, 终于找到一个工具iperf可以勉强完成任务.

基本思路

一台机器作为服务器, 另一台机器作为客户端, 客户端向服务器发包, 服务器接受, 连接使用UDP连接. 这也就是说, 如果没有服务器的话, 客户端仍然可以对网络上行进行压力测试; 但没有客户端, 服务器则没法对网络下行进行压力测试. 简单地说, 服务器(下行)是被动的, 客户端(上行)是主动的, 没人收包仍然可以狂发包, 但没人发包, 无论如何是收不到包的.

安装

1
$ sudo apt-get install iperf

使用方法

服务器

启动服务器

1
$ iperf -s
客户端
1
2
3
$ iperf -c 服务器ip -b 压力值
$ # 比如:
$ iperf -c 123.206.61.77 -b 11m

参考

Linux下如何监控网络
Linux网络测试和监控
[Linux] 局域网中测试网速