Memo

共 17 条

dm-delay 模拟慢速磁盘

速查

# 创建一个 10G 大小的 ram disk
sudo modprobe brd rd_nr=1 rd_size=1048576
sudo blockdev --getsize /dev/ram0

# 创建 delayed dm,延迟为 500ms
export RAM_SIZE=$(blockdev --getsize /dev/ram0)
echo "0 $RAM_SIZE delay /dev/ram0 0 500" | sudo dmsetup create delayed

# 重新加载参数
echo "0 $RAM_SIZE delay /dev/ram0 0 500" | sudo dmsetup reload delayed

delayed 参数

<device> <offset> <delay> [<write_device> <write_offset> <write_delay> [<flush_device> <flush_offset> <flush_delay>]]

暂停 I/O

sudo dmsetup suspend /dev/dm-0
sudo dmsetup resume  /dev/dm-0

检查 delayed 设备的 I/O 延迟

fio --name a --filename=/dev/dm-0 --bs=4k --rw=randread --ioengine=libaio --direct=1 --iodepth=1 --numjobs=1 --time_based=1 --runtime=10
fio --name a --filename=/dev/dm-0 --bs=4k --rw=randread --ioengine=sync --direct=1 --iodepth=1 --numjobs=1 --time_based=1 --runtime=10

允许 perf 采集内核回溯

出现以下报错时:

Perf-based stall detector creation failed (EACCESS), try setting /proc/sys/kernel/perf_event_paranoid to 1 or less to enable kernel backtraces: falling back to posix timer.

perf_event_paranoid 设为 1:

sudo sh -c 'echo 1 > /proc/sys/kernel/perf_event_paranoid'

修复 xfs.h 的 void 指针算术错误

Clang 编译 XFS 头文件时,void * 不能直接参与指针算术。将:

void *next = ((void *)gpr + gpr->gpr_reclen);
return next;

改为:

void *next = ((char *)gpr + gpr->gpr_reclen);
return (struct xfs_getparents_rec *)next;

使用 nftables 模拟丢包

丢弃目标端口的入站 TCP 流量:

sudo nft create table ip filter
sudo nft add chain ip filter input { type filter hook input priority 0 \; }
sudo nft add rule ip filter input tcp dport 3888 counter drop

恢复前先查看 handle,再删除对应规则:

sudo nft list chain ip filter input
sudo nft delete rule ip filter input handle n

系统编程资料