http://digoal126.wap.blog.163.com/w2/blogDetail.do;jsessionid=3949B03DE151DA0E55D807466C5E630B.yqblog35-8010?blogId=fks_087064087086083071087082094069072087087064092081081067080086&showRest=true&p=2&hostID=digoal@126

德哥@Digoal 2013-08-14 15:57

这个错误的原因是库文件版本不正确, 用来老版本, 使用eu-readelf查看stap文件的两个环境变量, 如下 : 
[root@db-172-16-3-39 ~]# eu-readelf -d /usr/bin/stap|grep -E "RPATH|RUNPATH"
  RPATH             Library rpath: [/usr/lib64/systemtap]
  RUNPATH           Library runpath: [/usr/lib64/systemtap]
将路径加入到LD_LIBRARY_PATH中.
[root@db-172-16-3-39 ~]# export LD_LIBRARY_PATH=/usr/lib64/systemtap:$LD_LIBRARY_PATH
stap现在正常了
[root@db-172-16-3-39 ~]# stap 
A script must be specified.
Systemtap translator/driver (version 1.8/0.152 non-git sources)
Copyright (C) 2005-2012 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: AVAHI LIBRPM LIBSQLITE3 NSS BOOST_SHARED_PTR TR1_UNORDERED_MAP NLS
Usage: stap [options] FILE         Run script in file.
   or: stap [options] -            Run script on stdin.
   or: stap [options] -e SCRIPT    Run given script.
   or: stap [options] -l PROBE     List matching probes.
   or: stap [options] -L PROBE     List matching probes and local variables.
测试 : 
[root@db-172-16-3-39 pg94]# vi tps.d 
probe begin
{
  printf("hello\n")
  exit()
}
[root@db-172-16-3-39 pg94]# stap tps.d 
Checking "/lib/modules/2.6.18-274.el5/build/.config" failed with error: No such file or directory
Incorrect version or missing kernel-devel package, use: yum install kernel-devel-2.6.18-274.el5.x86_64 
这个错误是由于未安装当前正在运行的kernel对应的kernel-devel包.
[root@db-172-16-3-39 pg94]# rpm -qa|grep kernel
kernel-headers-2.6.18-274.el5
kernel-xen-devel-2.6.18-274.el5
kernel-xen-2.6.18-274.el5
kernel-2.6.18-274.el5
[root@db-172-16-3-39 ~]# uname -a
Linux db-172-16-3-39.sky-mobi.com 2.6.18-274.el5 #1 SMP Fri Jul 22 04:43:29 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
 
安装对应的kernel-devel版本.
yum install kernel-devel-2.6.18-274.el5.x86_64
如果yum源中没有这个版本的kernel-devel包, 可以去安装光盘中找一找.
或者同时更新内核版本至新版本.
 yum install -y kernel.x86_64 kernel-devel.x86_64
Package kernel-2.6.18-348.12.1.el5.x86_64 already installed and latest version
Package kernel-devel-2.6.18-348.12.1.el5.x86_64 already installed and latest version
vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-348.12.1.el5)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.18-348.12.1.el5 ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.18-348.12.1.el5.img
重启服务器
现在stap工作正常了 : 
[root@db-172-16-3-39 postgresql-5e3e8e4]# stap -ve 'probe begin { log("hello world") exit() }'
Pass 1: parsed user script and 85 library script(s) using 146788virt/23676res/3000shr/21384data kb, in 170usr/0sys/173real ms.
Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 147316virt/24396res/3224shr/21912data kb, in 10usr/0sys/6real ms.
Pass 3: using cached /root/.systemtap/cache/3b/stap_3b2eaec778ce9832b394535505dde575_838.c

Pass 4: using cached /root/.systemtap/cache/3b/stap_3b2eaec778ce9832b394535505dde575_838.ko
Pass 5: starting run.
hello world
Pass 5: run completed in 0usr/20sys/306real ms.

stap调试好后, 就可以用来跟踪postgresql了.
PostgreSQL编译时必须开启dtrace支持. 开启dtrace后, 数据库将启用代码中的探针或跟踪点.
PostgreSQL内建探针参考如下 : 
src/backend/utils/probes.d
http://www.postgresql.org/docs/devel/static/dynamic-trace.html
检查你的PostgreSQL是否开启了dtrace支持, 如下 : 
pg94@db-172-16-3-39-> pg_config --configure
'--prefix=/home/pg94/pgsql9.4devel' '--with-pgport=2999' '--with-perl' '--with-tcl' '--with-python' '--with-openssl' '--with-pam' '--without-ldap' '--with-libxml' '--with-libxslt' '--enable-thread-safety' '--with-wal-blocksize=16' '--enable-dtrace'
如果没有--enable-dtrace, 那么需要重新编译一下你的PostgreSQL软件.
 
stap测试脚本1.
[root@db-172-16-3-39 pg94]# cat postgresql-query.stp 
global query_time, query_summary
 
probe process("/home/pg94/pgsql9.4devel/bin/postgres").mark("query__start") {
  query_time[tid(), $arg1] = gettimeofday_us();
}
 
probe process("/home/pg94/pgsql9.4devel/bin/postgres").mark("query__done") {
  p = tid()
  t = query_time[p, $arg1]; delete query_time[p, $arg1]
  if (t) {
    query_summary[p] <<< (gettimeofday_us() - t);
  }
}
 
probe end {
  printf("\ntid count min(us) avg(us) max(us)\n");
  foreach (p in query_summary) {
    printf("%d %d %d %d %d\n", p, @count(query_summary[p]),
     @min(query_summary[p]), @avg(query_summary[p]), @max(query_summary[p]));
  }
}
执行stap : 
[root@db-172-16-3-39 pg94]# stap postgresql-query.stp 
执行以下SQL : 
[root@db-172-16-3-39 pg94]# stap postgresql-query.stp 
digoal=# begin;
BEGIN
digoal=# select * from test for update;
 id 
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)
digoal=# end;
COMMIT
digoal=# select txid_current();
 txid_current 
--------------
      5969062
(1 row)
结束stap, 输出 : 
[root@db-172-16-3-39 pg94]# stap postgresql-query.stp 
按键Ctrl+C, 输出 : 
tid count min(us) avg(us) max(us)
17112 4 46 3794 14885
这个tid对应PostgreSQL background process
[root@db-172-16-3-39 pg94]# ps -ewf|grep 17112
pg94     17112 17005  0 15:15 ?        00:00:00 postgres: postgres digoal [local] idle
digoal=# select pg_backend_pid();
 pg_backend_pid 
----------------
          17112
(1 row)
 
[小结]
1. 安装systemtap注意 : 
-- 需要安装kernel相关, 并且版本要一致, 启动的kernel版本也要一致 : 
 
kernel
kernel-debuginfo
kernel-devel
kernel-debuginfo的安装要用到debug源.
[root@db-172-16-3-39 pg94]# cd /etc/yum.repos.d/
[root@db-172-16-3-39 yum.repos.d]# ll
total 36
-rw-r--r-- 1 root root 1926 Aug 29  2011 CentOS-Base.repo
-rw-r--r-- 1 root root  631 Aug 29  2011 CentOS-Debuginfo.repo
-rw-r--r-- 1 root root  626 Aug 29  2011 CentOS-Media.repo
-rw-r--r-- 1 root root 5390 Aug 29  2011 CentOS-Vault.repo
[root@db-172-16-3-39 yum.repos.d]# cat CentOS-Debuginfo.repo 
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
 
# All debug packages from all the various CentOS-5 releases
# are merged into a single repo, split by BaseArch
#
# Note: packages in the debuginfo repo are currently not signed
#
 
[debug]
name=CentOS-5 - Debuginfo
baseurl=http://debuginfo.centos.org/5/$basearch/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
enabled=0
这里用到的源名为debug.
yum --enablerepo=debug list kernel-debuginfo
yum --enablerepo=debug install kernel-debuginfo
安装细节参考此文 : 
http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/topic/liaai.systemTap/liaaisystap_pdf.pdf
 
2. postgresql编译时必须加上--enable-dtrace参数, 否则stap时会出现类似以下错误.
[root@db-172-16-3-39 pg93]# stap test.stp 
semantic error: while resolving probe point: identifier 'process' at test.stp:3:7
        source: probe process("/opt/pgsql9.3beta2/bin/postgres").mark("lock__wait__start")
                      ^
 
semantic error: no match
semantic error: while resolving probe point: identifier 'process' at :8:7
        source: probe process("/opt/pgsql9.3beta2/bin/postgres").mark("lock__wait__done")
                      ^
 
semantic error: while resolving probe point: identifier 'process' at :17:7
        source: probe process("/opt/pgsql9.3beta2/bin/postgres").mark("lwlock__wait__start")
                      ^
 
semantic error: while resolving probe point: identifier 'process' at :22:7
        source: probe process("/opt/pgsql9.3beta2/bin/postgres").mark("lwlock__wait__done")
                      ^
 
semantic error: while resolving probe point: identifier 'process' at :32:7
        source: probe process("/opt/pgsql9.3beta2/bin/postgres").mark("lwlock__condacquire__fail")
                      ^
 
Pass 2: analysis failed.  Try again with another '--vp 01' option.
3. 允许stap需要root权限, 或者将用户加入stapdev或者stapsys, 以及stapusr组.
如果普通用户不加入这两个组, 执行stap将报错 : 
pg93@db-172-16-3-39-> stap -ve 'probe begin { log("hello world") exit() }'
You are trying to run systemtap as a normal user.
You should either be root, or be part of the group "stapusr" and possibly one of the groups "stapsys" or "stapdev".
Systemtap translator/driver (version 1.8/0.152 non-git sources)
加完组后正常
 
# usermod -G stapdev,stapusr pg94
pg94@db-172-16-3-39-> stap -ve 'probe begin { log("hello world") exit() }'
Pass 1: parsed user script and 85 library script(s) using 148892virt/23772res/3068shr/21396data kb, in 160usr/10sys/172real ms.
Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 149420virt/24492res/3292shr/21924data kb, in 10usr/0sys/6real ms.
Pass 3: translated to C into "/tmp/stapcqtmUe/stap_758dbd41826239e5e3211a815f6bfc58_838_src.c" using 149420virt/24760res/3540shr/21924data kb, in 0usr/0sys/0real ms.
Pass 4: compiled C into "stap_758dbd41826239e5e3211a815f6bfc58_838.ko" in 910usr/110sys/1028real ms.
Pass 5: starting run.
hello world
Pass 5: run completed in 10usr/20sys/307real ms.
本文就介绍到这里, 下次将介绍如何使用postgresql的探针.
 

[参考]

1. http://pgfoundry.org/projects/dtrace/
2. http://www.fosslc.org/drupal/content/probing-postgresql-dtrace-and-systemtap
3. http://www.postgresql.org/docs/devel/static/dynamic-trace.html
4. http://www.postgresql.org/docs/devel/static/install-procedure.html
5. http://www.ppurl.com/2011/05/dtrace-dynamic-tracing-in-oracle-solaris-mac-os-x-and-freebsd.html
6. http://www.emm.usp.br/downloads/pg/PG_perf_bootcamp.pdf
7. https://wiki.postgresql.org/wiki/DTrace
8. http://www.ppurl.com/?s=systemtap
9. http://www.ibm.com/developerworks/cn/linux/l-systemtap/
10. http://sourceware.org/systemtap/wiki/HomePage
11. http://fruli.krunch.be/~krunch/systemtap-osdcfr-20101010.pdf
12. http://blog.endpoint.com/2009/05/postgresql-with-systemtap.html
13. https://www.evernote.com/shard/s48/sh/1ccb0466-79b7-4090-9a5d-9371358ac54d/b8434e3e3b3130ce72422b9ae067e7b9
14. http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/topic/liaai.systemTap/liaaisystap_pdf.pdf
15. http://linux.chinaunix.net/techdoc/develop/2008/12/28/1055546.shtml
16. http://os.51cto.com/art/201305/395819.htm

17. https://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/?locale=en-US

PostgreSQL SystemTap on Linux的更多相关文章

  1. PostgreSQL SystemTap on Linux 转

    PostgreSQL 支持动态跟踪, 可以通过dtrace或者systemtap工具统计相关探针的信息. 安装systemtap yum install systemtap kernel-debugi ...

  2. 利用systemtap学习Linux路由代码

    http://bbs.chinaunix.net/thread-4090162-1-1.html 一.为什么要这样做读kernel route子系统代码,当我弄懂了数据结构之间的关系以及控制流程后,心 ...

  3. PostgreSQL 10.7 linux 主从配置

    PostgreSQL 10.7 主从安装 硬件环境 云服务商:华为云 Linux: CentOS7.1 工具:Xshell Xftp IP:114.115.251.168 Port: 5432 543 ...

  4. 使用systemtap调试linux内核

    http://blog.csdn.net/heli007/article/details/7187748 http://linux.chinaunix.net/docs/2006-12-15/3479 ...

  5. 【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap

    转自 http://blog.csdn.net/zklth/article/details/6248558 文章 http://blog.csdn.net/zklth/archive/2010/09/ ...

  6. 使用systemtap调试Linux内核 :www.lenky.info

    http://www.lenky.info/archives/category/nix%E6%8A%80%E6%9C%AF/%E8%B7%9F%E8%B8%AA%E8%B0%83%E8%AF%95

  7. Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 3 部分: Systemtap

    Systemtap的原理,Systemtap与DTrace比较,以及安装要求和安装步骤本系列文章详细地介绍了一个Linux下的全新的调式.诊断和性能测量工具Systemtap和它所依赖的基础kprob ...

  8. Linux 下的一个全新的性能测量和调式诊断工具 Systemtap,第 1 部分: kprobe

    kprobe 的原理.编程接口.局限性和使用注意事项 本系列文章详细地介绍了一个Linux下的全新的调式.诊断和性能测量工具Systemtap和它所依赖的基础kprobe以及促使开发该工具的先驱DTr ...

  9. [亲测有效] - Linux安装PostgreSQL

    本文章来为各位介绍一篇关于postgresql 9.4 在linux环境的安装步骤详解,希望文章能够对各位新手朋友带来帮助的哦.   环境说明系统:centos 6.4 64位软件:postgresq ...

随机推荐

  1. emoji等表情符号存mysql的方法

    项目中需要存储用户信息(用户昵称有表情符号),自然就遇到了emoji等表情符号如何被mysql DB支持的问题 这里引用先行者博文:https://segmentfault.com/a/1190000 ...

  2. (19)zabbix Applications使用介绍

    介绍 Applications(我们翻译为应用程序)是item的一个组. 例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中. 例如MySQL的availabilit ...

  3. opencast的docker安装

    在之前的从源安装和从包安装opencast,都遇到较多环境问题导致失败.所有采用docker安装. Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助 ...

  4. 【http】http协议的队首阻塞

    1 队首阻塞 就是需要排队,队首的事情没有处理完的时候,后面的人都要等着. 2 http1.0的队首阻塞 对于同一个tcp连接,所有的http1.0请求放入队列中,只有前一个请求的响应收到了,然后才能 ...

  5. Many-to-one

    创建模型 from django.db import models class Reporter(models.Model): first_name = models.CharField(max_le ...

  6. JavaScript正则表达式-反向引用

    使用括号“()”进行分组,使子表达式(子模式)可以作为整体独立被修饰,子表达式所匹配的结果会被记录下来并可以单独被访问. /(a(b(cd){2})+)EF/ 则各引用分别对应: \1  对应(a(b ...

  7. java中的equals与==的区别

    equals是Object类的公共方法,方法内部是用==实现的.但是很多类都重写了equals方法,例如基本数据类型的封装类和String类,重写后比较的是对象的值或者内容是否相同.而==是比较地址, ...

  8. Git常用的基本操作

    一.如何学习git指令 1.查看帮助:git help2.查看指定命令:git help clone3.搜索关键字:/chone 4.退出帮助文档:输入Q 二.常见命令 1.初始化git本地仓库:先进 ...

  9. Ubuntu新装系统要装软件

    1. 在虚拟机中新安装系统的时候,通常因为时间过了很长,软件有更新之后,安装vim的时候会出错,因此,装完系统先要做的: cd /var/lib/dpkg/updates/ ls sudo apt-g ...

  10. go 和make的用法 区别

    Doand Make are two verbs which frequently confuse students of English. Learn the Difference between ...