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

文章目录 · 7 节

近来实验室的师兄有个需求, 写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] 局域网中测试网速