巧用Systemtap注入延迟模拟IO设备抖动
原创文章,转载请注明: 转载自系统技术非业余研究
本文链接地址: 巧用Systemtap注入延迟模拟IO设备抖动
当我们的IO密集型的应用怀疑设备的IO抖动,比如说一段时间的wait时间过长导致性能或其他疑难问题的时候,这个现象处理起来就比较棘手,因为硬件的抖动有偶发性很难重现或者重现的代价比较高。
幸运的是systemtap可以拯救我们。从原理上讲,我们应用的IO都是通过文件系统来访问的,不管read/write/sync都是,而且我们的文件大部分都是以buffered方式打开的。在这个模式下,如果pagecache不命中的话,就需要访问设备。 知道了这个基本的原理以后,我们就可以用万能的systemtap往vfs的读写请求中受控的注入延迟,来达到这个目的。
要点有以下几个:
1. 受控的时间点。
2. 延迟时间可控。
3. 目标设备可控。
我写了个脚本注入IO延迟,模拟ssd/fio硬件的抖动来验证是否是IO抖动会给应用造成影响,三个步骤如下:
步骤1: 编译模块
$ cat inject_ka.stp |
global inject, ka_cnt |
probe procfs("cnt").read { |
$value = sprintf("%d\n", ka_cnt); |
} |
probe procfs("inject").write { |
inject= $value; |
printf("inject count %d, ka %s", ka_cnt, inject); |
} |
probe vfs.read.return, |
vfs.write.return { |
if ($return && |
devname == @1 && |
inject == "on\n") |
{ |
ka_cnt++; |
udelay($2); |
} |
} |
probe begin{ |
println("ik module begin:)"); |
} |
$ stap -V |
Systemtap translator/driver (version 2.1/0.152, commit release-2.0-385-gab733d5) |
Copyright (C) 2005-2013 Red Hat, Inc. and others |
This is free software; see the source for copying conditions. |
enabled features: LIBSQLITE3 NSS BOOST_SHARED_PTR TR1_UNORDERED_MAP NLS |
$ sudo stap -p4 -DMAXSKIPPED=9999 -m ik -g inject_ka.stp sda6 300 |
ik.ko |
其中参数sda6是目标设备的名字,300是希望延迟的时间,单位us(超过300很容易报错,因为通常systemtap会对脚本执行的cpu进行检查,占用过多cpu的时候会触发保护机制,导致stap抱怨退出),通常对于ssd设备是足够的。
这个步骤会生成ik.ko,请验证生成模块的机器和目标的机器,操作系统的版本是一模一样的,而且请确保你的stap版本比较高,因为udelay函数在高版本的Stap才有。
步骤2:
将ik.ko拷贝到目标机器,执行
$ sudo staprun ik.ko |
ik module begin:) |
步骤3:
启动应用程序开始测试后一段时间,运行如下命令开始注入:
$ echo on|sudo tee /proc/systemtap/ik/inject && sleep 10 && echo off|sudo tee /proc/systemtap/ik/inject |
其中sleep N 是希望打开注入开关的时间。
小结:systemtap用好很无敌!
祝玩得开心!
Post Footer automatically generated by wp-posturl plugin for wordpress.
Related posts:
- 突破systemtap脚本对资源使用的限制
- 再谈systemtap在ubuntu 10.10下的安装
- Linux下如何知道文件被那个进程写
- Systemtap辅助设置tcp_init_cwnd,免对操作系统打Patch
- Linux高速缓存使用率调查
from:http://blog.yufeng.info/archives/2935
巧用Systemtap注入延迟模拟IO设备抖动的更多相关文章
- Arduino101学习笔记(五)—— 模拟IO
1.配置IO管脚 //***************************************************************************************** ...
- [转]StarWind模拟iSCSI设备
StarWind模拟iSCSI设备 url: http://jimshu.blog.51cto.com/3171847/590412/ 标签:职场 iSCSI 休闲 StarWind 原创作品,允许 ...
- I.MX6 简单电路模拟USB设备的插入
/**************************************************************************** * I.MX6 简单电路模拟USB设备的插入 ...
- Arduino学习笔记⑤ 模拟IO实验
1.前言 还记得前几个我们都是在讲解数字IO,而其实我们生活中大多数信号都是模拟信号,如声音以及温度变化.在Arduino中,常用0~5v的电压来表示模拟信号. 1.1 模拟输入功能 ...
- 2019-8-16-调试时限制程序使用-CPU-核心数模拟低端设备
title author date CreateTime categories 调试时限制程序使用 CPU 核心数模拟低端设备 lindexi 2019-08-16 16:11:32 +0800 20 ...
- C#模拟MSN窗体抖动
C#模拟MSN窗体抖动 窗体抖动是件很有意思的事情,就让我们看看一起来看看它的原理吧. 其实是生成随机数,然后改变Form的左上角的坐标.我用的是循环来弄得,其实可以用timer来控制. 我把抖动分成 ...
- Qt无边框窗体-模拟模态窗体抖动效果
目录 一.概述 二.效果展示 三.功能实现 四.相关文章 原文链接:Qt无边框窗体-模拟模态窗体抖动效果 一.概述 用Qt开发windows客户端界面确实是一大利器,兼顾性能的同时,速度相对来说也不错 ...
- 用LED灯和按键来模拟工业自动化设备的运动控制
开场白: 前面三节讲了独立按键控制跑马灯的各种状态,这一节我们要做一个机械手控制程序,这个机械手可以左右移动,最左边有一个开关感应器,最右边也有一个开关感应器.它也可以上下移动,最下面有一个开关感应器 ...
- Java:IO流与IO设备
打印流:PrintWriter和PrintStream 特点:可以直接操作输入流和文件 //例子1:使用PrintStream将格式化的日期打印到文件中 import java.io.*; impor ...
随机推荐
- SHELL 详解
http://blog.csdn.net/vah101/article/details/6173488 ( a=2;b=4;c=9; ) 子shell 环境 { a=2;b=4;c=9; } 当前sh ...
- Cordova 3.0 Plugin 安装 及"git" command line tool is not installed
根据http://docs.phonegap.com/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface Windows命令行 ...
- jq实现竞拍倒计时
1jq的效果代码 //全局变量用于存储当前时间 var nows; function rightZeroStr(v) { ) { " + v; } return v + "&quo ...
- 小白日记14:kali渗透测试--NMAP
NAMP 被认为是最强大的扫描器 所有参数 root@kali:~# nmap Nmap 7.01 ( https://nmap.org ) Usage: nmap [Scan Type(s)] [O ...
- 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter
PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以rout ...
- jdbc连接池中c3p0的配置文件的详解以及在在java中如何使用
<c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config> <property name=" ...
- jQuery Validate 插件[表单验证]
在客户端添加信息提交表单时我们经常需要做一些验证,比如验证不能为空,验证客户输入手机格式,验证客户输入email,url等的格式,我们可以通过EL表达式结合js 进行自主验证,今天总结一个JQuery ...
- ArcEngine中打开各种数据源(WorkSpace)的连接http://www.cnblogs.com/feilong3540717/archive/2011/08/07/2129906.html
ArcEngine中打开各种数据源(WorkSpace)的连接 ArcEngine中打开各种数据源(WorkSpace)的连接 (SDE.personal/File.ShapeFile.CAD数据.影 ...
- 给jdk写注释系列之jdk1.6容器(8)-TreeSet&NavigableMap&NavigableSet源码解析
TreeSet是一个有序的Set集合. 既然是有序,那么它是靠什么来维持顺序的呢,回忆一下TreeMap中是怎么比较两个key大小的,是通过一个比较器Comparator对不对,不过遗憾的是,今天仍然 ...
- 如何在Java中定义常量(Constant)
原本引自 http://blog.csdn.net/autofei/article/details/6419460 /** * Method One */ interface ConstantInt ...