SystemTap知识(一)

SystemTap知识(一)

SystemTap是一个系统的跟踪探测工具。它能让用户来跟踪和研究计算机系统在底层的实现。

安装SystemTap需要为你的系统内核安装-devel,-debuginfo,-debuginfo-common包

使用下面的repo可以进行debuginfo的安装

[debuggery]

name=CentOS-$releasever - DebugInfo

baseurl=http://debuginfo.centos.org/$releasever/$basearch/

priority=1

需要理解下面几个名词:

instrumentation module -- 由SystemTap脚本编译的内核模块

host system -- 你编译instrumentation 模块的机器

target system -- 你运行instrumentation 模块的机器

target kernel -- target system的内核模块

你可以在一台机器上为其他机器编译trap模块,在目标机上只要安装systemtap-runtime,在宿主机上使用:

stap -r kernel_version script -m module_name

就能生成module_name.ko模块

然后在目标机上运行staprun module_name.ko就可以执行这个trap

stap命令参数:

-v

提供脚本运行的详细输出,可以使用多个的,比如stap -vv script.stp 输出的信息比stap -v script.stp多

-o filename

将输出存到文件filename中

-S size,count

限制输出的文件大小(兆byte算)和文件数目,多个文件会有后缀

-x process ID

这个processID能从脚本中的target()获取

-c 'command'

将target()函数做重命名

-e 'script'

使用script而不是文件作为输入 

-F

使用Flight recorder mode(飞行记录模式),让脚本在后台运行。

我们也可以使用 - 来将标准输入作为stap的输入

echo "probe timer.s(1) {exit()}" | stap -

SystemTap的飞行模式

飞行模式使用-F参数控制的,它并不保存所有的输出,而是只保存最近一段时间的输出,保存的文件大小和文件数量是根据-S来控制的。

飞行模式的监控是运行在后台的。

安装出现问题:

missing x86_64 kernel/module debuginfo

根据这篇文章解决:http://dikar.iteye.com/blog/1477619

SystemTap是如何工作的

每个SystemTap脚本都会创建一个sesssion,这个session按照下面的执行顺序做操作:

1 SystemTap使用tapset库检查这个脚本

2 SystemTap将脚本翻译成C,然后在根据这个C程序生成一个内核模块。(在/tmp/xxxx/xxxx.ko)

3 SystemTap加载这个模块,然后将代码挂载到探针probes(events 和handlers)中

4 当事件发生的时候,相关的代码就执行了

5 当session结束的时候,探针就被销毁

SystemTap的事件可以被归类为两种类型:同步和异步

同步事件包括:

syscall.system_call

vfs.file_operation

kernel.function("function")

kernel.trace("tracepoint")

module("module").function("function")

异步事件包括:

begin

end

timer events

printf

随笔分类 -开源研究

SystemTap知识(一)

2013-08-28 09:05 by 轩脉刃, 234 visits, 网摘收藏编辑
摘要:SystemTap是一个系统的跟踪探测工具。它能让用户来跟踪和研究计算机系统在底层的实现。 安装SystemTap需要为你的系统内核安装-devel,-debuginfo,-debuginfo-common包 使用下面的repo可以进行debuginfo的安装 [debuggery] name=CentOS-$releasever - DebugInfo baseurl=http://d...  阅读全文

redis主从遇到的两个坑

2013-08-26 19:04 by 轩脉刃, 569 visits, 网摘收藏编辑
摘要:最近在使用redis主从的时候做了下面两件事情: 1 希望redis主从从操作上分析,所有写操作都在master上写,所有读操作都在从上读。 2 由于redis的从是放在本地的,所以有的key的读写操作就直接放在从上操作了。 但是出现了下面的几个问题: 1 在主上setex的key即使过期后在从上也始终get的到。 重现: 主: setex abc 20 test 从: get a...  阅读全文

SystemTap了解

2013-08-20 15:07 by 轩脉刃, 48 visits, 网摘收藏编辑
摘要:SystemTrap是监控和跟踪运行中的Linux内核操作的动态方法。 http://www.ibm.com/developerworks/cn/linux/l-systemtap/ 使用SystemTrap需要使用trap来运行一个stp脚本 如何安装: Centos下直接yum install systemtrap就行了 测试是否可以运行 运行:stap -ve 'probe be...  阅读全文

HTTP缓存相关头

2013-08-08 00:21 by 轩脉刃, 959 visits, 网摘收藏编辑
摘要:本文说的是HTTP中控制客户端缓存的头有哪些。网上这方面的文章很多了,这里就说下个人的理解。 在请求一个静态文件的时候(图片,css,js)等,这些文件的特点是文件不经常变化,将这些不经常变化的文件存储起来,对客户端来说是一个优化用户浏览体验的方法。那么这个就是客户端缓存的意义了。 windows下客户端的缓存文件存放在临时文件夹中,但是这里有个问题就是这个缓存文件存放多久呢?这个是由服...  阅读全文

Mysql的NULL的一个注意点

2013-07-31 18:48 by 轩脉刃, 80 visits, 网摘收藏编辑
摘要:今天看到一个问题: select a.* from a where (a.id not in (NULL)); 这个sql语句会返回什么? 刚开始以为是返回所有item,但是实际运行下返回是返回empty set。 看了下手册: http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html 判断一个字段是否是NULL只能使...  阅读全文

谈Mysql索引

2013-07-17 08:31 by 轩脉刃, 729 visits, 网摘收藏编辑
摘要:myisam和innodb的索引有什么区别? 两个索引都是B+树索引,但是myisam的表存储和索引存储是分开的,索引存储中存放的是表的地址。而innodb表存储本身就是一个B+树,它是用主键来做B+树的key的。 因此innodb需要设置主键,如果没有的话,mysql会优先使用unique键做主键,如果没有unique的话,会生成一个隐含字段做主键。 innodb中的主键最好是要使用自增i...  阅读全文

Symfony学习--目录和入口

2013-05-16 10:09 by 轩脉刃, 900 visits, 网摘收藏编辑
摘要:1 目录结构 根目录下有: app src vendor web app是存放应用的一些配置文件,如果有一些配置文件或者文档,应当存放在这里面。 src是存放你的项目的php代码,这里的php至少必须是5.3,因为symfony中使用了命名空间的概念。 vendor是存放第三方代码的目录,这个目录可能非常庞大,因为symfony大量使用了第三方bundle的概念,连自身都是作为一个...  阅读全文

好文收藏系列(二)

2013-05-08 15:14 by 轩脉刃, 1266 visits, 网摘收藏编辑
摘要:分析redis性能的项目 https://github.com/Instagram/redis-faina DB性能分析思路之全量query分析 http://txyey.org/?p=60 如何创建自适应系统来增强用户体验 http://www.alibuybuy.com/posts/81152.html#jtss-tsina PS: 自适应系统的概念 Golan...  阅读全文

Linux下安装tomcat+jdk+mysql记录

2013-04-21 16:32 by 轩脉刃, 314 visits, 网摘收藏编辑
摘要:先安装JDK下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.htmlwgethttp://download.oracle.com/otn-pub/java/jdk/7u21-b11/jdk-7u21-linux-x64.tar.gz?AuthParam=1366529379_f7fe2af81268eee41771542b3191968cmv jdk-7u21-linux-x64.tar.gz\?AuthParam\=1366529379_f7fe2af81268eee41  阅读全文

关于正则的迷思

2013-04-15 10:07 by 轩脉刃, 1203 visits, 网摘收藏编辑
摘要:正则是我们日常编程中一定会使用到的,不管是各种语言中的正则匹配,还是linux/unix系统上的grep/egrep命令,都是在使用正则来匹配字符串。随着用的深入,可能会感到越来越迷惑:为什么有的语言要提供多种正则匹配的函数集?-- 比如php的preg系列和ereg系列为什么有的正则语句在不同的语言上匹配出来的东西是不一样的?-- 比如unix的grep命令和perl语言的grep故事从头开始讲正则表达式(Regular Expression)从1956年就开始出现这个概念,后来Unix之父Ken Tompson将这个概念引入Unix,出现了grep工具。但是随着Unix的版本不断演化,Un  阅读全文

论HTTP请求大小

2013-03-29 09:55 by 轩脉刃, 2037 visits, 网摘收藏编辑
摘要:HTTP分为URI,HEADER,Body三个部分。每个部分都可以包含请求信息,那么每个部分是否都有请求大小限制呢?刚开始以为这个问题很容易找到答案,后来发现这也是个挺复杂的问题。URI首先是URI,我们知道,在GET请求中,请求参数是放在URL进行传递的,所以,HTTP GET的请求最关心的一个问题:能有多长?我能放多少参数?URI从HTTP 1.1协议中开始找:(RFC 2616)The HTTP protocol does not place any a priori limit on the length of a URI所以明确一点的是HTTP协议是没有显式限制URI的长度的。理论上  阅读全文

好文收藏系列(一)

2013-03-26 13:26 by 轩脉刃, 1562 visits, 网摘收藏编辑
摘要:好多好文章看完就直接丢了,或者放在浏览器标签内,但是标签多了也会烦,以后一段时间整理下放blog上。 用 Go 实现零停机升级 TCP 服务 http://www.mikespook.com/2012/05/%E7%BF%BB%E8%AF%91%E7%94%A8-go-%E5%AE%9E%E7%8E%B0%E9%9B%B6%E5%81%9C%E6%9C%BA%E5%8D%87%E7%BA...  阅读全文

MongoDB应用学习

2013-03-18 14:15 by 轩脉刃, 1255 visits, 网摘收藏编辑
摘要:创建数据库可以直接使用use test 但是这个时候show dbs是看不到的,只有加入了数据才算真正创建了。 collection对应mysql中表的概念 collection中每条数据在生成的时候会自行生成_id的字段 db.pet.find() 相当于select * from pet > db.pet.find() { "_id" : ObjectId("513...  阅读全文

关于websocket

2013-03-11 09:54 by 轩脉刃, 2013 visits, 网摘收藏编辑
摘要:这个是一次组内分享,关于websocket的协议和应用的。文章在分享之前就写好了,整理下放出来。对应的PPT地址是:http://websocket.funaio.com从推送技术开始说一篇文章10 Years of Push Technology, Comet, and WebSockets(http://cometdaily.com/2011/07/06/push-technology-comet-and-websockets-10-years-of-history-from-lightstreamers-perspective/)非常详细的说明清楚了从1996-2007年推送技术的更新。  阅读全文

聊天室服务分析设计

2013-03-05 09:52 by 轩脉刃, 3422 visits, 网摘收藏编辑
摘要:如果你需要写一个简单的聊天室的服务,那么我想很多网上的demo都可以直接拿来用。但是如果你要做的是给线上百万甚至千万级用户用的服务,那么,整个结构和聊天室Demo是必然不一样的。本文就从设计一个大用户量的聊天室服务的角度出发来思考。 分布式? 首先用户量大必然先考虑的问题是服务是单进程还是多进程,单机器还是多机器,单进程代表的是单机上跑一个服务,单机器代表的是单机上跑一个或者多个服务,这两种方...  阅读全文

CGI的一些知识点

2012-12-24 11:31 by 轩脉刃, 1395 visits, 网摘收藏编辑
摘要:CGI(Common Gateway Interface)是能让web服务器和CGI脚本共同处理客户的请求的协议。它的协议定义文档是http://www.ietf.org/rfc/rfc3875。 其中Web服务器负责管理连接,数据传输,网络交互等。至于CGI脚本就负责管理具体的业务逻辑。 Web服务器的功能是将客户端请求(HTTP Request)转换成CGI脚本请求,然后执行脚本,接着将CGI...  阅读全文

mysql那些招

2012-11-22 13:04 by 轩脉刃, 1387 visits, 网摘收藏编辑
摘要:show table status mysql官方文档在 http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html 这里的rows行是表的行数,但是实际上是不准的。myisam是准的,其他的存储引擎是不准的。要准确的行数就需要使用count(*) 来获取了。 mysql执行大批量删除 执行大批量删除的时候注意要使用上limit 因为如果不用limit,删除大量数据很有可能造成死锁 如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库 ps: 平时update和delete的时候最好也加...  阅读全文

为什么使用框架

2012-09-25 18:09 by 轩脉刃, 2431 visits, 网摘收藏编辑
摘要:这是一篇翻译文章,原文说明了框架在开发过程中给使用带来的懒惰,不思维的弊病。文章来源:http://blog.8thlight.com/myles-megyesi/2012/09/12/why-frameworks.html ===========正文开始 我们是由于效率和易用性的考虑才产生框架。框架能节省开发时间。框架强制使用公共的约定,因此它能有效地解决一些共有的问题,比如页面渲染,ass...  阅读全文

Golang Http Server源码阅读

2012-08-22 15:04 by 轩脉刃, 3979 visits, 网摘收藏编辑
摘要:这篇文章出现的理由是业务上需要创建一个Web Server。创建web是所有语言出现必须实现的功能之一了。在nginx+fastcgi+php广为使用的今天,这里我们不妨使用Go来进行web服务器的搭建。 前言 使用Go搭建Web服务器的包有很多,大致有下面几种方法,直接使用net包,使用net.http包,使用第三方包(比如gorilla)。使用net包就需要从tcp层开始封装,耗费人力物力极大...  阅读全文

Linux IO模型漫谈(2)

2012-05-31 09:57 by 轩脉刃, 1403 visits, 网摘收藏编辑
摘要:不管Linux的IO模型的阻塞同步分类是如何分类,几种IO模型的具体实现是确定的。这里借用《Unix 网络编程:卷一》的图片说明。 1 阻塞式IO模型 这个模型也是最容易理解的 程序调用和我们基本的程序编写是一致的: fd = connect() write(fd) read(fd) close(fd) 程序的read必须在write之后执行,当write阻塞住了,read就不能执行下去 2 非阻塞IO模型 从图中可以看出来,这是一个轮询的过程 每次用户询问内核是否有数据报准备好(文件描述符缓冲区是否就绪),当数据报准备好的时候,就进行拷贝数据报的操作。当数据报没...  阅读全文

Unix家族编年史

2012-05-30 13:30 by 轩脉刃, 1410 visits, 网摘收藏编辑
摘要:Unix是多用户、多任务的操作系统,它的历史悠久,也有多种版本。在Unix接触过程中常使用到的词,BSD,Linux等。初学者,甚至是接触unix很久的用户也未必对其家谱了如指掌。这篇文章描述的是Unix的族谱和发展历史。 1969年,Unix的前身Unics出现 作者: 肯·汤普逊(左)和丹尼斯·里奇(右) Unix版本是由美国电话电报公司(AT&T)进行维护升级的。他们两位是AT&...  阅读全文

Linux IO模型漫谈(1)

2012-05-29 11:20 by 轩脉刃, 1948 visits, 网摘收藏编辑
摘要:基础知识 Linux将所有外部设备都看做一个文件来进行操作。因此,linux对所有外部设备的操作都可以看做是文件的操作。文件的操作当然需要有个标示描述它,这就是文件描述符(file descriptor)。 linux的IO操作如何形象理解呢? 我们说网络socket的read()是一个IO操作命令,具体流程是这样的: 应用程序调用read命令,通知内核需要做读取数据操作 内核创建一个文件描述符 内核从物理层收到读数据的命令,从网络中获取数据包 数据包传递到TCP/IP层,解析数据包的头 内核将数据包缓存在文件描述符的读缓存区(接受缓存区)中,注意这里的读缓存区是在内核中的 ...  阅读全文

Lua的协同程序

2012-05-28 15:39 by 轩脉刃, 2072 visits, 网摘收藏编辑
摘要:Lua是一种简单,可扩展,可移植及高效的脚本语言。在嵌入式系统,移动设备,web服务器,游戏等方面都能见到它的身影。lua其中最吸引人的一点事它能很方便地与C语言或者其他语言。 这里说的是lua语言中的协同程序(coroute),也有人翻译成为协作程序 基本函数和语法 coroutine就是lua的协同程序 先讲一下coroutine的语法: coroutine.create() 创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用 coroutine.resume() 重启coroutine,和create配合使用...  阅读全文

nginx模块_使用gdb调试nginx源码

2012-05-10 16:45 by 轩脉刃, 3491 visits, 网摘收藏编辑
摘要:工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段。 ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正。 熟悉gdb的使用 这里就不说了,谷歌一搜一堆,这里推荐一篇文章:GDB 命令详细解释 请重点看一下step,run,break,list,info,continue命令 下载nginx源码 这里使用nginx-1.0.14 src是源代码,auto文件夹是configure运行时候的各种命令集合 修改config并编译 由于gdb需要gcc的时候加上-g参数,这样生成的文件才能使用gdb调试,因此...  阅读全文
 

你可能感兴趣的:(System)