systemtap-与 oracle 转
https://baoz.net/using-systemtap/
http://nanxiao.me/category/%E6%8A%80%E6%9C%AF/systemtap-%E7%AC%94%E8%AE%B0/
http://gmd20.blog.163.com/blog/static/168439232015475525227/
http://zhengheng.me/page/3/
http://www.golaravel.com/php/features.dtrace.systemtap.html
http://www.golaravel.com/php/features.dtrace.dtrace.html
http://www.golaravel.com/laravel/docs/5.1/
http://user.yeeyan.org/u/seth
SystemTap is commonly used to probe or trace kernel space system or function calls. Excellent examples are at
https://sourceware.org/systemtap ... temtap-scripts.html
Beginning with certain Linux kernel level, the uprobes kernel module allows SystemTap to probe user space processes. Newer kernel has uprobes module instead. Make sure you have one of the modules configured:
grep CONFIG_UTRACE /boot/config-`uname -r`
grep CONFIG_UPROBES /boot/config-`uname -r`
Other people have used SystemTap to probe Oracle user processes. See examples at
https://sourceware.org/systemtap/wiki/HomePage
Find (press ^F) "oracle" in browser to see them. But they all require that you already know the specific function to probe, such as kslwtbctx that signifies the beginning of a wait event.
Here, I'll use the para-callgraph.stp script from
https://www.sourceware.org/syste ... /paracallgraph.html
to probe Oracle server processes with no prior knowledge of which function to probe; I just want to see what function is called. Since I don't intend to pass the 2nd optional argument (used as trigger), I simplify the para-callgraph.stp script by removing the conditional compilation lines as follows (I renamed the filename to cg.stp to save typing):
# cat cg.stp
#! /usr/bin/env stap
function trace(entry_p, extra) {
printf("%s%s%s %s\n",
thread_indent (entry_p),
(entry_p>0?"->":"<-"),
ppfunc (),
extra)
}
probe $1.call { trace(1, $$parms) }
probe $1.return { trace(-1, $$return) }
Let's say I want to probe all Oracle server processes calling functions named like kks*:
# stap cg.stp 'process("/u01/app/oracle/product/11.2.0/db/bin/oracle").function("kks*")'
0 oracle(5588):->kksCompileCallNotifier
17 oracle(5588):<-kksCompileCallNotifier
0 oracle(5860):->kksMapCursor
16 oracle(5860):<-kksMapCursor
0 oracle(5860):->kksMapCursor
5 oracle(5860):<-kksMapCursor
^C
Two processes were captured calling kksCompileCallNotifier and kksMapCursor functions, respectively.
We can limit the probe to a specific process with -x option:
# stap cg.stp 'process("/u01/app/oracle/product/12c/db/bin/oracle").function("kks*")' -x 62148
0 oracle_62148_sa(62148):->kksMapCursor
43 oracle_62148_sa(62148): ->kksParentCursor
64 oracle_62148_sa(62148): <-kksParentCursor
71 oracle_62148_sa(62148): ->kksParentCursor
81 oracle_62148_sa(62148): <-kksParentCursor
90 oracle_62148_sa(62148):<-kksMapCursor
0 oracle_62148_sa(62148):->kksCloseCursor
19 oracle_62148_sa(62148): ->kksGetStats
36 oracle_62148_sa(62148): <-kksGetStats
47 oracle_62148_sa(62148): ->kksdip
64 oracle_62148_sa(62148): <-kksdip
89 oracle_62148_sa(62148): ->kksIsVPDCursorSessionCacheable
106 oracle_62148_sa(62148): <-kksIsVPDCursorSessionCacheable
121 oracle_62148_sa(62148):<-kksCloseCursor
0 oracle_62148_sa(62148):->kksMapCursor
^C
One issue is that because the oracle binary has tens of thousands of global and local functions (check with `nm $ORACLE_HOME/bin/oracle | egrep ' [Tt] ' | wc -l), if you simply pass * as the argument to function, stap hogs the CPU for a long time to enumerate the functions and no probe will be done. You have to limit the functions to a small set. My test shows that even trying to probe kk*, not alone k*, takes stap too long to prepare and I have to abort. Focusing on function main can be a start:
stap cg.stp 'process("/u01/app/oracle/product/11.2.0/db/bin/oracle").function("main")'
If you probe other binaries, such as sqlplus or tnslsnr or lsnrctl, passing * is fine. They don't contain too many functions.
Due to this issue, I didn't quite achieve the goal of "want to see what function is called", because I can't pass a simple * and have to qualify it to some extent.
Another issue is that $$parms and $$return, the two so-called pretty printing target variables, are always null for me. If they worked, they would show function parameters and function return value, respectively. See https://sourceware.org/systemtap ... rgetprettyprinting. I was able to use ulong_arg or s64_arg function to get a specific argument (e.g. the first one) in number format, e.g.
function trace(entry_p, extra) {
printf("%s%s%s %ld\n",
thread_indent (entry_p),
(entry_p>0?"->":"<-"),
ppfunc (),
extra)
}
function trace2(entry_p) {
printf("%s%s%s\n",
thread_indent (entry_p),
(entry_p>0?"->":"<-"),
ppfunc ())
}
//probe $1.call { trace(1, ulong_arg(1)) }
probe $1.call { trace(1, s64_arg(1)) }
probe $1.return { trace2(-1) }
I have to omit the second argument of the trace function used by return so I changed it to trace2. The result is
0 oracle(5588):->kksCompileCallNotifier 2
10 oracle(5588):<-kksCompileCallNotifier
0 oracle(5860):->kksMapCursor 139787894174976
9 oracle(5860):<-kksMapCursor
^C
systemtap-与 oracle 转的更多相关文章
- Life of an Oracle I/O: tracing logical and physical I/O with systemtap
https://db-blog.web.cern.ch/blog/luca-canali/2014-12-life-oracle-io-tracing-logical-and-physical-io- ...
- 使用动态跟踪技术SystemTap监控MySQL、Oracle性能
[IT168 技术]本文根据吕海波2018年5月11日在[第九届中国数据库技术大会]上的演讲内容整理而成. 讲师介绍: 吕海波,美创科技研究员,ITPUB管理版版主.出版技术书籍<Oracle内 ...
- oracle systemtap tracing
https://github.com/LucaCanali?tab=repositories https://github.com/LucaCanali/Linux_tracing_scripts/t ...
- systemtap dtrace与 oracle
https://fritshoogland.wordpress.com/page/3/ http://externaltable.blogspot.com/2013/06/dtrace-explora ...
- 动态追踪技术(中) - Dtrace、SystemTap、火焰图
http://openresty.org/cn/presentations.html http://weibo.com/agentzh?is_all=1 http://openresty.org/po ...
- 内核调试神器SystemTap — 简介与使用(一)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简介 SystemTap是我目前所知的最强大的内核调试工具,有些家伙甚至说 ...
- linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等
<< System语言详解 >> 关于 SystemTap 的书. 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tc ...
- Linux Perf Probes for Oracle Tracing
Luca Canali on 21 Jan 2016 Topic: this post is about Linux perf and uprobes for tracing and profilin ...
- Linux BPF/bcc for Oracle Tracing
Luca Canali on 26 May 2016 Topic: In this post you will find a short discussion and pointers to the ...
随机推荐
- URAL-1991 The battle near the swamp 水题
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1991 水题.. //STATUS:C++_AC_15MS_333KB #include ...
- Cloud_panel
传统基础架构应用程序的系统架构师,云计算应用程序的设计确实是相当有挑战性的工作.体现在应用程序架构师首先要了解云计算环境和传统基础架构的差异并且充分利用云计算平台的一些特点来更好的满足用户需求. 对于 ...
- C++builder XE 安装控件 及输出路径
C++builder XE 安装控件 与cb6不一样了,和delphi可以共用一个包. 启动RAD Studio.打开包文件. Project>Options>Delphi Compile ...
- 转】MyEclipse使用总结——设置MyEclipse使用的Tomcat服务器
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3935499.html 感谢! 一.设置使用的Tomcat服务器 如果不想使用MyEclipse自带的tomcat ...
- 理解Python元类(转)
add by zhj:先收藏了,有时间看,图倒是不少,可以配合stackover flow上那篇文章一起看 原文:http://blog.ionelmc.ro/2015/02/09/understan ...
- 关于MAC下的QQ聊天中看不到对方所发的图片解决
使用QQ聊天我们会经常碰到一件让人烦心的事情,那就是别人发的截图自己看不大,是一张裂图(腾讯默认的那张图片).通常有几种情况可以造成这种结果: 第一种原因,网络延迟原因,你的网络不好或者对方的网络不好 ...
- 【转】使用json-lib进行Java和JSON之间的转换
原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库,提供将Java ...
- STL学习系列九:Map和multimap容器
1.map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺 ...
- Ubuntu 14.04 LTS中怎样解决系统设置残缺的问题
iBus卸载之后,系统设置会缺失,是Ubuntu 14.04和iBus之间的关系引起的,但是如果直接安装 sudo apt-get install ubuntu-desktop 这个会把amazon广 ...
- UVaLive 6697 Homework Evaluation (DP)
题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,:如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3, 连续的长字符串添加-,需要减去一个4:也可不给添加-,则 ...