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++使用相关推荐

  1. linux查询jiffies命令,关于linux:将jiffies转换为秒

    我有一段用户空间代码,该代码正在解析/ proc / PID / task / TID / stat以获取cpu的使用情况. 我可以使用HZ来获取每秒的跳动,但是此代码可以移动到另一台具有不同配置值的 ...

  2. linux查看进程命令wwn,linux下如何查看服务器wwn号

    原标题:linux下如何查看服务器wwn号 PC server主机与FC存储进行连接时,一般需要加装HBA卡,两者之间衔接的一个重要参数就是wwn号.redhat或suse下查看wwn号的方法如下. ...

  3. 使用linux命令查看进程,Linux查看进程命令有哪些

    我们在使用Linux系统的过程中,有的时候会需要查看后台进程,并选择性的关闭一些不用的进程,那么Linux中有哪些查看进程的命令呢?今天小编就来为大家总结整理一些常用的Linux查看进程命令. Lin ...

  4. Linux查看进程命令有哪些?

    我们在使用Linux系统的过程中,有的时候会需要查看后台进程,并选择性的关闭一些不用的进程,那么Linux中有哪些查看进程的命令呢?今天达妹就来为大家总结整理一些常用的Linux查看进程命令. Lin ...

  5. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  6. linux命令行怎么结束进程,linux结束进程命令

    linux下进程的开启与结束都可以通过命令来控制,下面由学习啦小编为大家整理了linux下结束进程命令的相关知识,希望对大家有所帮助. linux结束进程命令1.kill kill [信号代码] 根据 ...

  7. LInux 项目二命令总结,linux项目管理常用命令小结

    当前位置:我的异常网» 项目管理 » linux项目管理常用命令小结 linux项目管理常用命令小结 www.myexceptions.net  网友分享于:2015-08-26  浏览:13次 li ...

  8. linux中make命令大全,Linux中的命令 make -f 是什么意思

    二.Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为"GNUmakefile"."makef ile"."Make ...

  9. linux 限制带宽命令,Linux服务器限制网络带宽流量速率(限制应用程序和指定网卡的流量)

    linux 限制带宽命令,Linux服务器限制网络带宽流量速率 一.限制应用程序的网络流量速率 1.trickle介绍 2.如何判断trickle对应用程序是否有效? 3.Linux安装Trickle ...

  10. linux杀死进程删除文件,linux 常用到的命令 删除 移动 复制 查询端口 杀死进程 查询进程...

    1. 删除文件 删除一个文件 rm -f 文件路径 删除多个文件 rm -f 文件路径 文件路径 ... 删除文件夹以及文件夹中的文件 rm -rf 文件夹路径 删除多个文件夹以及文件夹中的文件 rm ...

最新文章

  1. Go 学习笔记(63)— Go 中的 for ... range 对切片和数组的差异
  2. python中 str.strip()用法
  3. Arduino数字引脚作为GPIO的使用
  4. Rpm包的安装与yum的配置
  5. python sqlite3 怎么把字典存入数据库中.
  6. 面试题 16.18. 模式匹配
  7. java文字版格斗游戏
  8. mysql正则mybatis中用法_SQL 正则表达式及mybatis中使用正则表达式
  9. 学计算机需要什么文具,开学需要准备哪些文具用品
  10. Jenkins+gitlab配置身份验证令牌
  11. OceanBase集群手动部署
  12. 【单片机】4.3 中断允许与中断优先级的控制
  13. Linux:pingpong机制的理解
  14. 万能的搜索——深度搜索和广度搜索
  15. CNCC 2016 | 南京大学黄宜华教授 50 张 PPT 剖析 Alluxio 及其应用
  16. CSDN-markdown 首行缩进的快捷实现
  17. 网址怎么输入打开?网站和网址有什么区别?
  18. SCN headroom问题解决方案
  19. 腾讯qq2014最新版 v5.4.11058 官方电脑版
  20. 计算机专业刚毕业的学生,如何写简历呢?

热门文章

  1. Eclipse上的HTML/JSP/XML编辑器插件Eclipse HTML Editor安装(eclipse中web开发插件安装)
  2. PhotoShop CS5制作残旧的印章效果
  3. 分布式任务调度平台XXL-JOB
  4. adb shell dumpsys activity top
  5. java屠龙_倚天屠龙之江湖神器
  6. 写 node.js 用什么编辑器?
  7. 【分享】使用快递鸟接入圆通电子面单详解
  8. Linux转发性能评估与优化-转发瓶颈分析与解决方案(补遗)
  9. 开源KVM管理工具和平台
  10. oracle sqlldr decode,sqlldr的用法总结