linux查询进程命令stap,linux systemtap, stap++使用

linux查询进程命令stap,linux systemtap, stap++使用8 种机械键盘轴体对比本人程序员 要买一个写代码的键盘 请问红轴和茶轴怎么选 说明介绍 systemtap stap 的一些使用方式 以及总结了一些遇到的坑点 systemtap 介绍 systemtap 跟 perf 一样也是一个 linux 下的性能分析工具 但它提供自定义脚本编写 所以功能会比 perf 更强大 快速了解 systemptab 功能最简单的 systemtab 脚本 12345probebe p

66b52468c121889b900d4956032f1009.png

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= -D MAXBACKTRACE=100 -D MAXSTRINGLEN=4096 -D MAXACTION= -D STP_OVERLOAD_THRESHOLD= -D MAXSKIPPED= –arg time=60 > ~/cpp.bt

采样之后可以使用命令cat ~/cpp.bt|c++filt|~/FlameGraph/stackcollapse-stap.pl|~/sysperf/FlameGraph/flamegraph.pl > ~/cpp.svg生成火焰图

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204157.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:51
下一篇 2026年3月19日 下午8:52


相关推荐

  • mybatis 原理[通俗易懂]

    mybatis 原理[通俗易懂]问题:mybatis是基于mapper接口开发的,mapper接口是执行SQL语句的呢?mybatis对mapper代码的包装主要包含了4个类。1.首先mapper需要将接口进行注册,并且需要获得mapper代理工厂(mapperregistry)mapperregistry类将mapper接口进行注册,并获取mapper代理工厂的工具类(mapperproxyfactory)2.加载mapp…

    2025年6月23日
    5
  • python实践winrm,实现远程连接Windows服务器,并执行指定命令

    python实践winrm,实现远程连接Windows服务器,并执行指定命令在我之前的一篇博文 python 基于 paramiko 模块实现远程连接 Linux 虚拟机 服务器 并执行指定命令返回输出结果 中 使用 paramiko 模块实现了远程连接 Linux 服务器 并执行内存占用情况查询操作的命令 但是在很多时候由于用户自身的限制 我们所要操作的不全都是 Linux 环境的服务器 还有很多 Windows 类型的服务器 虽然我觉得很奇葩 但是既然有这个需求就要去实现才行的

    2026年3月19日
    3
  • excel怎么只打印某页?excel怎么只打印某几页

    excel怎么只打印某页?excel怎么只打印某几页

    2021年11月9日
    168
  • pycharm软件界面设置与配置[通俗易懂]

    pycharm软件界面设置与配置[通俗易懂]pycharm软件界面设置与配置pycharm软件介绍:基于eclipse开发的开源软件,适用于整体开发较大项目。负责繁琐的工作细节,节省宝贵的时间,善用以键盘操作为主的编程方法,pycharm完全理解代码的每个面向,依靠它的智能化代码补全,实时检查和快速修复等功能,轻松进行项目导航。其有以下优点:集成python需要的模块,方便开发;语法高亮,快速识别代码,方便开发;代码提示。搭建pycharm软件的开发环境:首先安装JDK(JDK是整个java开发的核心,它包含了JAVA的运行环

    2022年8月29日
    4
  • java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」

    java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」前言Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理。对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。实例JacksonObjectMapper的readValue可以将Json字符串反序列化为Java对象。如下例中将[{“id”:n…

    2022年6月17日
    82
  • 数据结构知识整理

    数据结构知识整理基于严蔚敏及吴伟民编著的清华大学 C 语言版教材并结合网上相关资料整理 http www docin com p 2027739005 html 第一章 绪论 1 数据结构 是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科 2 数据结构涵盖的内容 3 基本概念和术语 数据 对客观事物的符号表示 在计算机科学中是指所有能输入到计算机中并被计算

    2025年7月3日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号