linux查询进程命令stap,linux systemtap, stap++使用
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
说明
介绍systemtap, stap++的一些使用方式,以及总结了一些遇到的坑点
systemtap介绍
systemtap跟perf一样也是一个linux下的性能分析工具,但它提供自定义脚本编写,所以功能会比perf更强大。
快速了解systemptab功能
最简单的systemtab脚本1
2
3
4
5probe begin
{
print("hello worldn")
exit()
}
执行结果
1
2[email protected]:~/systab$ sudo stap hello-world.stp
hello world
probe begin指定了一个begin的追踪点,脚本实际上做的就是定义一些列追踪点。systemtap将脚本翻译成C,并将其编译成一个内核的模块加载到内核。一旦被加载则脚本中所有指定的追踪点会在运行的时候被回调。下面列举了一些systemtap提供的追踪点:begin:此次检测开始被回调
end: 此次检测结束被回调
kernel.function(“sys_open”): 内核函数sys_open进入时候被回调
syscall.close.return: 系统调用close返回时候被回调
timer.ms(200): 定时器,每200ms回调一次
timer.profile: 定时器,每个system tick回调一次
perf.hw.cache_misses: cache miss的时候回调
另一个例子1
2
3
4
5
6
7
8probe syscall.open
{
printf("%s"(%d) open (%s)n", execname(), pid(), argstr)
}
probe time.ms(4000)
{
exit()
}
执行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[email protected]:~/systab$ vi strace-open.stp
[email protected]:~/systab$ sudo stap ./strace-open.stp
redis-server(24453) open ("/proc/24453/stat", O_RDONLY)
bot(28026) open ("/proc/self/stat", O_RDONLY)
bot(28026) open ("/proc/stat", O_RDONLY)
redis-server(24453) open ("/proc/24453/stat", O_RDONLY)
redis-server(24453) open ("/proc/24453/stat", O_RDONLY)
tail(3649) open ("logs/zqc/gameapp.3.INFO", O_RDONLY|O_NONBLOCK)
tail(3651) open ("logs/zqc/gameapp.5.INFO", O_RDONLY|O_NONBLOCK)
mgrapp(3845) open ("/proc/self/stat", O_RDONLY)
mgrapp(3845) open ("/proc/stat", O_RDONLY)
tail(3652) open ("logs/zqc/gateapp.2.INFO", O_RDONLY|O_NONBLOCK)
tail(3650) open ("logs/zqc/gameapp.4.INFO", O_RDONLY|O_NONBLOCK)
mgrapp(11899) open ("/proc/self/stat", O_RDONLY)
mgrapp(11899) open ("/proc/stat", O_RDONLY)
gateapp(3849) open ("/proc/self/stat", O_RDONLY)
gateapp(3849) open ("/proc/stat", O_RDONLY)
gateapp(11903) open ("/proc/self/stat", O_RDONLY)
gateapp(11903) open ("/proc/stat", O_RDONLY)
loginapp(3847) open ("/proc/self/stat", O_RDONLY)
loginapp(3847) open ("/proc/stat", O_RDONLY)
redis-server(24453) open ("/proc/24453/stat", O_RDONLY)
gameapp(3855) open ("/proc/self/stat", O_RDONLY)
...
printf是一个格式化打印函数,可以打印自己脚本定义的变量,或者systemtap提供的获取信息的函数或变量:tid(): 当前线程id
pid(): 当前进程id
uid(): 当前用户id
execname(): 进程的名字
cpu(): 当前cpu number
gettimeofday_s(): 当前时间戳
pp(): 描述当前追踪点的字符串
ppfunc(): 当前追踪点被触发的函数,如果存在的话
print_backtrace(): 直接输出内核态堆栈
print_ubacktrace(): 直接输出用户态堆栈
systemtap脚本语法
普通语法和C语言差不多,这里介绍下不太一样的地方,其他具体可以查看官方教程,或者这个简化版的教程
数组
数组非常方便,内部使用hash table实现,数组大小除非显示指定,否则都定义为一个预先定义好的大小。多维可以直接用’,’分割即可,例如:
1
2
3
4
5
6
7
8
9
10
11names[400] // 大小位400的数组
...
foreach (name in names) {
// do something
}
foo[1, "200"] = 1
foo[2, "200"] = 2
foreach ([id, str] in foo) {
// do something
}
这里有个方便的地方当数组元素不存在的时候返回的是0,所以计数的时候就非常方便,可以直接使用bts[ubacktrace()]++计数
stap++介绍
stap++是一个stap扩展,提供一些类似于宏的功能,最后将宏替换后生成的systemtap脚本,并调用systemtap执行。
stap++使得systemtap的脚本可以得到进一步扩展。
sample-bt.sxx(perf record)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#!/usr/bin/env stap++
/*
* Copyright (C) Yichun Zhang (agentzh)
*/
global bts;
global quit = 0
probe timer.profile {
if ($^pid_ok) { // pid是否相等
%( "$^arg_execname :default()" != "" %?
if (execname() == "$^arg_execname") { // 进程名是否相等,如果存在的话
%)
if (!quit) {
bts[ubacktrace()] <<< 1 // 计数,这里有个大坑,如果采样时间长会导致消耗巨量内存,可以改用bts[ubacktrace()]++优化
} else {
foreach (usr in bts- limit $^arg_limit :default(1000)) {
print_ustack(usr)
printf("t%dn", @count(bts[usr])) // 打印堆栈和数量,如果上面改为bts[ubacktrace()]++,这里可以直接输出bts[usr]的值
}
exit()
}
%( "$^arg_execname :default()" != "" %?
}
%)
}
}
probe timer.s($^arg_time) {
nstacks = 0
foreach (bt in bts limit 1) {
nstacks++
}
if (nstacks == 0) {
warn("No backtraces found. Quitting now...n")
exit()
} else {
warn("Time's up. Quitting now...(it may take a while)n")
quit = 1
}
}
probe begin {
warn(sprintf("Start tracing process $^target ($^exec_path)...n"))
}
这脚本实现了perf record功能,统计了每次采样的堆栈。
命令执行方式,其中PID是需要进行采样的进程id
1sudo ./stap++ samples/sample-bt.sxx -x PID -D MAXMAPENTRIES=102400 -D MAXBACKTRACE=100 -D MAXSTRINGLEN=4096 -D MAXACTION=100000 -D STP_OVERLOAD_THRESHOLD=5000000000 -D MAXSKIPPED=100000 --arg time=60 > ~/cpp.bt
采样之后可以使用命令cat ~/cpp.bt|c++filt|~/FlameGraph/stackcollapse-stap.pl|~/sysperf/FlameGraph/flamegraph.pl > ~/cpp.svg生成火焰图
linux查询进程命令stap,linux systemtap, stap++使用相关推荐
- linux查询jiffies命令,关于linux:将jiffies转换为秒
我有一段用户空间代码,该代码正在解析/ proc / PID / task / TID / stat以获取cpu的使用情况. 我可以使用HZ来获取每秒的跳动,但是此代码可以移动到另一台具有不同配置值的 ...
- linux查看进程命令wwn,linux下如何查看服务器wwn号
原标题:linux下如何查看服务器wwn号 PC server主机与FC存储进行连接时,一般需要加装HBA卡,两者之间衔接的一个重要参数就是wwn号.redhat或suse下查看wwn号的方法如下. ...
- 使用linux命令查看进程,Linux查看进程命令有哪些
我们在使用Linux系统的过程中,有的时候会需要查看后台进程,并选择性的关闭一些不用的进程,那么Linux中有哪些查看进程的命令呢?今天小编就来为大家总结整理一些常用的Linux查看进程命令. Lin ...
- Linux查看进程命令有哪些?
我们在使用Linux系统的过程中,有的时候会需要查看后台进程,并选择性的关闭一些不用的进程,那么Linux中有哪些查看进程的命令呢?今天达妹就来为大家总结整理一些常用的Linux查看进程命令. Lin ...
- 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )
文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...
- linux命令行怎么结束进程,linux结束进程命令
linux下进程的开启与结束都可以通过命令来控制,下面由学习啦小编为大家整理了linux下结束进程命令的相关知识,希望对大家有所帮助. linux结束进程命令1.kill kill [信号代码] 根据 ...
- LInux 项目二命令总结,linux项目管理常用命令小结
当前位置:我的异常网» 项目管理 » linux项目管理常用命令小结 linux项目管理常用命令小结 www.myexceptions.net 网友分享于:2015-08-26 浏览:13次 li ...
- linux中make命令大全,Linux中的命令 make -f 是什么意思
二.Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为"GNUmakefile"."makef ile"."Make ...
- linux 限制带宽命令,Linux服务器限制网络带宽流量速率(限制应用程序和指定网卡的流量)
linux 限制带宽命令,Linux服务器限制网络带宽流量速率 一.限制应用程序的网络流量速率 1.trickle介绍 2.如何判断trickle对应用程序是否有效? 3.Linux安装Trickle ...
- linux杀死进程删除文件,linux 常用到的命令 删除 移动 复制 查询端口 杀死进程 查询进程...
1. 删除文件 删除一个文件 rm -f 文件路径 删除多个文件 rm -f 文件路径 文件路径 ... 删除文件夹以及文件夹中的文件 rm -rf 文件夹路径 删除多个文件夹以及文件夹中的文件 rm ...
最新文章
- Go 学习笔记(63)— Go 中的 for ... range 对切片和数组的差异
- python中 str.strip()用法
- Arduino数字引脚作为GPIO的使用
- Rpm包的安装与yum的配置
- python sqlite3 怎么把字典存入数据库中.
- 面试题 16.18. 模式匹配
- java文字版格斗游戏
- mysql正则mybatis中用法_SQL 正则表达式及mybatis中使用正则表达式
- 学计算机需要什么文具,开学需要准备哪些文具用品
- Jenkins+gitlab配置身份验证令牌
- OceanBase集群手动部署
- 【单片机】4.3 中断允许与中断优先级的控制
- Linux:pingpong机制的理解
- 万能的搜索——深度搜索和广度搜索
- CNCC 2016 | 南京大学黄宜华教授 50 张 PPT 剖析 Alluxio 及其应用
- CSDN-markdown 首行缩进的快捷实现
- 网址怎么输入打开?网站和网址有什么区别?
- SCN headroom问题解决方案
- 腾讯qq2014最新版 v5.4.11058 官方电脑版
- 计算机专业刚毕业的学生,如何写简历呢?
热门文章
- Eclipse上的HTML/JSP/XML编辑器插件Eclipse HTML Editor安装(eclipse中web开发插件安装)
- PhotoShop CS5制作残旧的印章效果
- 分布式任务调度平台XXL-JOB
- adb shell dumpsys activity top
- java屠龙_倚天屠龙之江湖神器
- 写 node.js 用什么编辑器?
- 【分享】使用快递鸟接入圆通电子面单详解
- Linux转发性能评估与优化-转发瓶颈分析与解决方案(补遗)
- 开源KVM管理工具和平台
- oracle sqlldr decode,sqlldr的用法总结