单个CPU跑满
待补充
耗尽内存
endless_memory.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main() {
printf("malloc start\n");
int i = 0;
int num = 1024;
while (1) {
char *a;
a = (char *) malloc(1024*num); // num越大内存消耗越快
strcpy(a, "placeholder");
i++;
if (i==1024) { // 暂停1秒
printf("break...\n");
i = 0;
sleep(1);
}
}
return(0);
}
gcc -o endless_memory endless_memory.c
# 执行endless_memory会逐渐将系统内存消耗
模拟网卡丢包
待补充
模拟网络链路延时
流量控制(Traffic Control, tc)是Linux内核提供的流量限速、整形和策略控制机制。它以qdisc-class-filter的树形结构来实现对流量的分层控制。
# eth0 out方向延时10ms
tc qdisc add dev eth0 root netem delay 10ms
# 删除规则
tc qdisc del dev eth0 root
# eth0 in方向延时10ms
modprobe ifb numifbs=1
ip link set dev ifb0 up
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
tc qdisc add dev ifb0 root netem delay 10ms
# 删除规则
tc qdisc del dev eth0 handle ffff: ingress 2>/dev/null
tc qdisc del dev ifb0 root 2>/dev/null
ip link set dev ifb0 down 2>/dev/null
modprobe -r ifb 2>/dev/null
硬盘分区只读
回环设备( ‘loopback device’)允许用户以一个普通磁盘文件虚拟一个块设备。设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件。 回环设备以 /dev/loop0、/dev/loop1 等命名。每个设备可虚拟一个块设备。注意只有超级用户才有权限设置回环设备。 回环设备的使用与其它任何块设备相同。特别是,你可以在这个设备上创建文件系统并像普通的磁盘一样将它挂载在系统中。这样的一个将全部内容保存在一个普通文件中的文件系统,被称为虚拟文件系统(virtual file system)(译者注:这个用法并不常见。VFS 通常另有所指,如指代 Linux 内核中有关文件系统抽象的代码层次等)
losetup is used to associate loop devices with regular files or block devices, to detach loop devices and to query the status of a loop device. If only the loopdev argument is given, the status of the corresponding loop device is shown.
# 生成一个文件
cd /tmp
sudo dd if=/dev/zero of=loop.img bs=1M count=1024
# 配置伪设备来镜像 loop.img 的内容,使用losetup将文件转化为块设备
sudo losetup /dev/loop0 loop.img
# 通过lsblk查看刚刚创建的块设备
sudo lsblk |grep loop0
# 输出
loop0 7:0 0 1G 0 loop
# losetup也能查看
sudo losetup -a
# 输出
/dev/loop0: [2053]:3014667 (/tmp/loop.img)
# 将这个块设备格式化并创建其他的文件系统,然后再mount到某个目录
sudo mkfs -t ext4 -c /dev/loop0
# 修改磁盘为只读模式(故障注入)
sudo blockdev --setro /dev/loop0
# 挂载分区
sudo mount -t auto /dev/loop0 /tmp/loop0/ -o ro,errors=remount-ro
# 输出
/dev/loop0 on /tmp/loop0 type ext4 (ro,relatime,errors=remount-ro,data=ordered)
恢复
sudo umount /dev/loop0
sudo losetup -d /dev/loop0
# 检查
sudo losetup -a