在这货上花费了不少时间,都是受了@agentzh 大神的蛊惑:) 他写的nginx-systemtap-toolkit监测的数据很有价值,对于系统优化实在是利器。

最早折腾systemtap,是在Ubuntu 12.04上搞的,内核版本是3.8.0-29-generic,流程参考官方教程。因为12.04版本比较新,所以不需要重新编译内核了。然后添加带调试信息的内核,以及相关的Linux头文件。整个过程还算顺利,就是公司网速比较慢。下载完成后,用ubuntu官方仓库自带的systemtap 1.6,却出现各种奇怪的C编译错误,于是换到了git clone下来的最新版本。这次错误信息友好了很多,但tapset的脚本跟内核的dwarf信息似乎对应不上,报semantic error: not accessible at this address [man error::dwarf]。至此,ubuntu上的systemtap只能打出hello world,其他脚本都跑不了,遂放弃。教训是,systemtap要新版,内核要老版,若用老systemtap和新内核,一般是会挂的。

对systemtap的用户态监控还是很口水,虽然我司用的是自己写的定制语言,但是-g编译后应该可以监控私有语言的脚本栈,进而分析性能瓶颈。于是,死皮赖脸抢夺了一台CentOS的机器做测试。机器版本如下:

[root@localhost systemtap]# uname -rm
2.6.-.el6.x86_64 x86_64
 
[root@localhost systemtap]# cat /etc/redhat-release
CentOS release 6.3 (Final)

用的systemtap版本是最新的。跟Ubuntu相比,CentOS的包管理就比较差了,内核的调试信息包需要自己手动下载安装。参考官方教程,安装debuginfo-common和debuginfo后,就可以开搞了。还好,这次不需要编译内核。安装好systemtap后,跑起来却出现这个问题:

stap -e 'probe begin { log("hello world") exit() }'

提示:

Checking "/lib/modules/2.6.32-279.el6.x86_64/build/.config" failed with error: 没有那个文件或目录

检查了一下相关的目录,/lib/modules/2.6.32-279.el6.x86_64/是一个软连接,链接到/usr/src/kernels/里去的。而2.6.32-358.23.2.el6.x86_64这个目录是真的没有,有的是2.6.32-358.23.2.el6.x86_64。谷歌了一下,这个目录是kernel-devel包的,通过yum安装的是最新的2.6.32-358.23.2.el6.x86_64,跟当前运行的内核不符。继续放狗,找到2.6.32-279.el6.x86_64的kernel-devel rpm包,安装完就有对应目录了。试了一下iotop终于成功了。

看了一下,systemtap似乎是根据写的probe编译成二进制模块,加载到内核里执行的。所以systemtap会在home目录下建立一个cache目录,避免重复编译相同的脚本。而nginx-systemtap-toolkit对Lua的栈探测,是通过监视LuaL开头的函数实现的,接下来准备按他的思路搞一下我们的私有语言。

systemtap折腾笔记的更多相关文章

  1. MacBook外置显卡eGPU折腾笔记

    MacBook外置显卡eGPU折腾笔记 硬件选购 当今市场上个人电脑的独立显卡,基本上能选的只有NVIDIA和AMD了,如果你想买外置显卡来打游戏的话,NVIDIA和AMD的都可以,但如果是像我一样准 ...

  2. SystemTap 学习笔记 - 安装篇

    https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux ...

  3. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  4. ASP.NET Core 折腾笔记一

    前言: 在ASP.NET Core 1.0时,曾折腾过一次,后因发现不了System.Data而停止. 更因VS2015提示过期Delete掉VS了,其实主要还是笔记本的硬盘空间吃紧. 快双十一了,本 ...

  5. Ubuntu Gnome 14.04.2 lts 折腾笔记

    unity感觉不爽,于是来折腾gnome3 = = 首先去官网下载ubuntu gnome 14.04.2 lts的包(种子:http://cdimage.ubuntu.com/ubuntu-gnom ...

  6. 【转】Kali Linux 新手折腾笔记

    原作者:http://defcon.cn/1618.html 最近在折腾Kali Linux 顺便做一简单整理,至于安装就不再多扯了,估计会出现的问题上一篇文章<VMware虚拟机安装Kali ...

  7. Kali Linux 新手折腾笔记

    http://defcon.cn/1618.html 2014年09月29日 渗透测试 暂无评论 阅读 55,052 次   最近在折腾Kali Linux 顺便做一简单整理,至于安装就不再多扯了,估 ...

  8. Kivy折腾笔记

    最近想用Python开发APP,选择kivy,记录过程 首先是源码安装,各种蛋疼的报错放弃了.cython高版本有问题. python3 -m pip install cython==0.23 pyt ...

  9. RHEL6 Systemtap 安装笔记

    以 RHEL6u3 为例 1  Systemtap 安装 yum install systemtap 跟systemtap有关的有6,7个,全装上,别偷懒 就用yum安装,别傻傻的去下rpm包,吃力不 ...

随机推荐

  1. 简单方法判断JavaScript对象为null或者属性为空

    对已声明但未初始化的和未声明的变量执行typeof,都返回undefined,null表示一个空对象指针,typeof操作会返回object 首先说下null与undefined区别: 对已声明但未初 ...

  2. linuxmint 默认不启动图形界面

    1.参考:http://garyu.blog.51cto.com/2838408/513772 修改/etc/X11/default-display-manager文件 该文件的内容一般是一个路径,比 ...

  3. 开源.NET FTP组件edtFTPnet 用法

    edtFTPnet官方网站:http://www.enterprisedt.com/products/edtftpnet/ 目前最新版本为2.2.3,下载后在bin目录中找到edtFTPnet.dll ...

  4. js之oop <二> 对象属性

    js中对象属性可以动态添加和删除.删除对象属性用delete关键字. function obj(){ } var oo = new obj(); oo.a = "a"; oo.b ...

  5. 防止SVN冲突,Elipse资源同步介绍

    灰色向右箭头: 本地修改了 灰色向右箭头且中间有白色减号: 本地删除了,服务器未删除 灰色向右且中间有个加号的箭头:本地比SVN上多出的文件 蓝色向左箭头:svn上修改过 蓝色向左且中间有个加号的箭头 ...

  6. SPSS数据分析—多重线性回归

    只有一个自变量和因变量的线性回归称为简单线性回归,但是实际上,这样单纯的关系在现实世界中几乎不存在,万事万物都是互相联系的,一个问题的产生必定多种因素共同作用的结果. 对于有多个自变量和一个因变量的线 ...

  7. Ipad Safari iframe cookie 当浏览器默认禁用第三方COOKIE

    前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示. 问题 什么是第三方cookie呢?在访问一个网站A时,网站A算作第一方,如果网站A中引用了另一个网站X(网站X的域名 ...

  8. 关于phpstorm中安装配置xdeug

    最近从网上找了好多phpstorm中配置安装xdebug的信息,但是貌似都失败了 ...我也不知道是为什么... 突然有一天 不知道怎么整的就配置成功了 现在可以分享一下了    正好我用的软件的版本 ...

  9. MFC List Control 控件添加单元格编辑,实现可编辑重写

    在实现随机生成四则运算的个人项目中,目前已经完成基本功能,想要把程序变成一个Windows界面的程序.原本以为学习过MFC,应该很快就能完成.但是由于以前用的都是VC6.0,这次用了VS2010,稍微 ...

  10. sql Sever的存储过程转换为mysql的

    总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的.1. 在mysql中写存储过程所有的dbo都要去掉.2. 每一个sql语句后面都需要加上:否则 ...