首页
学习
活动
专区
圈层
工具
发布
44 篇文章
1
[PyUserInput]模拟鼠标和键盘模拟
2
银行排队模拟(离散事件模拟)
3
Linux网络模拟
4
Linux TC(Traffic Control)作为损伤仪的基础配置和使用
5
深入学习Docker网络(看这篇就完全够了)
6
【鸿蒙 HarmonyOS】鸿蒙手机模拟器 ( 鸿蒙远程模拟器 | 鸿蒙远程模拟器运行手机应用 )
7
探索嵌入式应用框架(EAF)
8
多 OS 混合部署框架
9
嵌入式系统架构浅谈:编程设计模式 (一)---访问硬件的设计模式
10
事件驱动和消息驱动
11
原来 8 张图,就能学废 Reactor 和 Proactor
12
Linux df -h 命令hang住没有反应
13
kafka消费组信息采集异常(hang住)排查
14
ext4 io hung模拟脚本
15
解决 umount 命令卸载磁盘时busy/卡死的问题
16
程序卡死在void HardFault_Handler的解决办法
17
执行sed命令卡死CPU消耗100%一例分析
18
记一次因Redis使用不当导致应用卡死过程
19
字节对齐不慎引发的挂死问题
20
解引用NULL为什么会导致程序挂死?
21
记64位地址截断引发的挂死问题
22
websocket 在线工具_websocket添加请求头
23
【嵌入式Linux应用开发】SquareLine Studio与LVGL模拟器
24
详解Handler机制中消息队列的出队逻辑
25
Android UpdateEngine模块流程(含序列图)
26
物联网时代的嵌入式开发平台
27
400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
28
ESP32芯片IO解读
29
M5Stack在ubuntu上进行开发编译
30
【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
31
H264,你不知道的小技巧
32
linux 创建虚拟块设备,制作文件系统并挂载,用于测试lustre
33
基于linux开发uvc摄像头_uvc协议扩展
34
清晰讲解LSB、MSB和大小端模式及网络字节序
35
在树莓派中使用 MicroPython 接入 MQTT
36
MicroPython 玩转硬件系列1:环境搭建
37
嵌入式系统架构浅谈:编程设计模式 (二)---嵌入并发和资源管理的设计模式
38
嵌入式软件架构设计之分层设计
39
IC之路(一)Proteus-Arduino仿真环境搭建
40
图像处理基础(六)-libjpeg常用算法
41
OpenCV双目标定
42
L-K光流推导及OpenCV代码实现
43
NDI Webcam Input工具,那些你不知道的知识!
44
使用QEMU chroot进行固件本地调试
清单首页其它文章详情

ext4 io hung模拟脚本

通过把jbd2不调度来实现,方式是把他和一个rt进程绑到一个cpu上。

README

代码语言:txt
复制
该脚本利用ext4的日志功能模拟一个io hang的场景

在使用该脚本前,请确保:
1.机器上有盘是挂载为ext4的,可通过 mount | grep ext4 命令查看确认
2.挂载点的ext4打开了日志功能,可通过 dumpe2fs /dev/vda1(这里是挂载为ext4的盘,上面mount命令可以看到)| grep features | grep has_journal 命令查看确认
3./proc/sys/kernel/hung_task_panic 和 /proc/sys/kernel/nmi_watchdog 为0(这里如果不为0,内核会对长期占有CPU的进程做检查,如果有进程长期占用CPU,则会导致重启。而本脚本中起了一个会长期占用CPU的进程来完成模拟io hang的效果,所以置0是为了关闭内核的检查以防止重启)
4.机器至少有两个核
5.root权限执行

使用:
chmod +x io_hang_simulator.sh
./io_hang_simulator.sh 0 vda1   # 开始io hang功能,第一个参数0表示打开功能,第二个参数为想要模拟io hang的挂载为ext4的盘的名字,比如想要在/dev/vda1上模拟io hang则输入vda1,如果不输入(或输入一个不存在的盘),则默认在所有ext4挂载点上模拟
到这里就可以开始您的IO表演了,比如:在模拟的盘的挂载点上随便后台cp或者修改什么文件然后执行sync命令,再执行ps就可以看到cp/sync进程D住
./io_hang_simulator.sh 1 vda1   # 结束io hang功能,第一个参数1表示关闭功能,第二个参数同上

脚本

代码语言:txt
复制
# ./io_hang_simulator.sh 0/1 vda1
# 第一个参数是0表示打开功能
# 第一个参数是1表示关闭功能
# 第二个参数是盘的名字,dev目录下的xxx,如vda1或vdb1
# 第二个参数如果不输入,默认是所有挂载为ext4的盘
#####################################################

if [ $# -lt 1 ]
then
        echo "Usage:"
        echo "  ./io_hang_simulator.sh [0: start simulator / 1: shut simulator] [disk name]"
        echo "Example:"
        echo "  ./io_hang_simulator.sh 0 vda1"
        exit 0
fi

switch=$1
shift
disk_name=$1
jbd2_pids=`ps --ppid 2 -p 2 -o pid,cmd | grep "jbd2/"$disk_name | awk '{print $1}'`
if [ x$jbd2_pids == x ]; then jbd2_pids=`ps --ppid 2 -p 2 -o pid,cmd | grep jbd2 | awk '{print $1}'`; fi;
affinity_mask=`lscpu | grep list | awk '{print $NF}'`
do_nothing_pid=

if [ x$switch == x"0" ]
then 
        sysctl -w kernel.sched_rt_runtime_us=-1
        affinity_mask="0"
        chmod +x ./do_nothing.sh
        ./do_nothing.sh &
        #echo "start doing nothing process"
        do_nothing_pid=`ps --ppid $$ -p $$ -o pid,cmd | grep do_nothing | awk '{print $1}'`
        chrt --fifo -p 99 $do_nothing_pid
        #echo "change doing nothing to fifo"
        taskset -pc $affinity_mask $do_nothing_pid
        #echo "bind doing nothing to specific cpu"
else
        do_nothing_pid=`ps --ppid 1 -p 1 -o pid,cmd | grep do_nothing | awk '{print $1}'`
        kill -9 $do_nothing_pid
        sysctl -w kernel.sched_rt_runtime_us=950000
fi

for pid in `echo $jbd2_pids`
do
        taskset -pc $affinity_mask $pid
done

do nothing

代码语言:txt
复制
#!/bin/bash

while true;do :;done;
下一篇
举报
领券