系统异常测试

达芬奇密码2018-06-28 08:46

前言

异常测试通常指的是检测系统对异常情况的处理,常规来说,异常测试包括硬件或软件异常时的处理,本文主要介绍系统资源方面的异常测试。系统资源主要包括CPU、内存、磁盘和网络,因此,系统异常测试也主要从这4个方面来进行。

CPU异常

CPU高负载

通过模拟CPU高负载,观察在CPU资源被抢占的情况,系统的运行情况。

实现方式:编译运行以下源码,即可简单实现单核跑满:

#include <stdlib.h>
int main()
{
    while(1);
    return 0;
}

每次运行会占满一个核心,如果需要模拟多核跑满,多次运行即可。通过kill命令杀死进程结束模拟。

模拟CPU高负载的方式实际上还有很多,很多工具也都实现类似的功能,这里推荐一个PassMark提供的专业拷机软件:BurnInTest,有兴趣的可以尝试:(https://www.passmark.com/products/bitlinux.htm

内存异常

内存繁忙

针对内存的异常测试,主要方式是通过模拟内存频繁申请/释放,观察内存高负载情况下系统的运行情况。内存异常测试推荐使用memtester(http://pyropus.ca/software/memtester

使用方式:

$ memtester [测试内存量] [测试次数]

例如

$ memtester 4G 20

模拟20次的内存申请/释放,每次测试内存使用量为4G。

磁盘异常

磁盘空间不足

Linux系统提供了一个块拷贝命令——dd,可以非常方便的满足我们的测试需求,使用方式:

$ dd if=/dev/zero of=[目标路径] bs=[文件块大小] count=[文件块数目]

更多具体命令细节可以参见:https://en.wikipedia.org/wiki/Dd_(Unix))

磁盘I/O繁忙

结合shell脚本和上述dd命令,反复生成/删除文件,即可简单的模拟磁盘I/O繁忙的情况。

此外,也可以通过磁盘类的性能测试工具实现I/O负载的生成。FIO是一个测试系统IOPS的工具,根据指定的参数模拟IO负载,在磁盘类的性能测试中有广泛的运用。在这里,我们可以用FIO来模拟I/O繁忙,ks中已经有同学对FIO做了详细的介绍(http://ks.netease.com/blog?id=281),这里就不再赘述。

网络异常

在网络方面,主要有带宽跑满、网络延迟、网络丢包等异常情况。Linux系统提供了很多工具,可以方便我们实现模拟网络异常,这里选择netperf和tc来实现异常生成。

带宽跑满

netperf是网络带宽测试的工具,可以测量两个机器之间的网络带宽,我们可以使用netperf来模拟跑满节点网络带宽的情况。由于netperf为C/S运行模式,需要分别部署服务端和客户端,所以理论上至少需要2台机器,且受限于各自的上下行带宽限制。

实现方式:

服务端:

$ netserver

客户端:

$ netperf -H [服务端IP] -l [测试时长(秒)]
网络延迟和网络丢包

tc全称traffic control,是linux中的流量控制模块,通过设置tc,可以很方便的模拟网络延迟和网络丢包:
网络延迟:

$ tc qdisc add dev [网络设备名] root netem delay [延迟时间]

网络丢包:

$ tc qdisc add dev [网络设备名] root netem loss [丢包率]

将上述命令中的add改为del即可清除异常。

由于tc命令相对复杂,在此安利一下性能组同学开发的一款脚本:easy_traffic,将tc中用以模拟网络异常的功能简化了很多,只需要提供几个简单的参数即可实现网络延迟、网络丢包、网络带宽限制。

本文来自网易实践者社区,经作者崔慎杰授权发布。