- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想用 SystemTap 分析内核模块的缓存行为(#cache 引用、#cache 未命中等)。有一个在线示例脚本,展示了如何使用 SystemTap 读取性能事件和计数器,包括与缓存相关的事件和计数器: https://sourceware.org/systemtap/examples/profiling/perf.stp
此示例脚本默认适用于进程:
probe perf.hw.cache_references.process("/usr/bin/find").counter("find_insns") {}
我用 module
替换了 process
关键字,用我的内核模块的名称替换了可执行文件的路径:
probe perf.hw.cache_references.module(MODULE_NAME).counter("find_insns") {}
我很确定我的模块有调试信息,但是运行我得到的脚本:
semantic error: while resolving probe point: identifier 'perf' at perf.stp:14:7 source: probe perf.hw.instructions.module(MODULE_NAME).counter("find_insns") {}
任何想法可能是错误的?
编辑:
好吧,我意识到性能计数器只能绑定(bind)到进程而不是模块(此处解释:https://sourceware.org/systemtap/man/stapprobes.3stap.html)。因此,我将其改回:
probe perf.hw.cache_references.process(PATH_TO_BINARY).counter("find_insns") {}
现在,如示例脚本所示,我有:
probe module(MODULE_NAME).function(FUNC_NAME) {
#save counter values on entrance
...
}
但现在运行它,我得到:
semantic error: perf counter 'find_insns' not defined semantic error: while resolving probe point: identifier 'module' at perf.stp:26:7 source: probe module(MODULE_NAME).function(FUNC_NAME)
编辑2:
所以这是我的完整脚本:
#! /usr/bin/env stap
# Usage: stap perf.stp <path-to-binary> <module-name> <function-name>
global cycles_per_insn
global branch_per_insn
global cacheref_per_insn
global insns
global cycles
global branches
global cacherefs
global insn
global cachemisses
global miss_per_insn
probe perf.hw.instructions.process(@1).counter("find_insns") {}
probe perf.hw.cpu_cycles.process(@1).counter("find_cycles") {}
probe perf.hw.branch_instructions.process(@1).counter("find_branches") {}
probe perf.hw.cache_references.process(@1).counter("find_cache_refs") {}
probe perf.hw.cache_misses.process(@1).counter("find_cache_misses") {}
probe module(@2).function(@3)
{
insn["find_insns"] = @perf("find_insns")
insns <<< (insn["find_insns"])
insn["find_cycles"] = @perf("find_cycles")
cycles <<< insn["find_cycles"]
insn["find_branches"] = @perf("find_branches")
branches <<< insn["find_branches"]
insn["find_cache_refs"] = @perf("find_cache_refs")
cacherefs <<< insn["find_cache_refs"]
insn["find_cache_misses"] = @perf("find_cache_misses")
cachemisses <<< insn["find_cache_misses"]
}
probe module(@2).function(@3).return
{
dividend = (@perf("find_cycles") - insn["find_cycles"])
divisor = (@perf("find_insns") - insn["find_insns"])
q = dividend / divisor
if (q > 0)
cycles_per_insn <<< q
dividend = (@perf("find_branches") - insn["find_branches"])
q = dividend / divisor
if (q > 0)
branch_per_insn <<< q
dividend = (@perf("find_cycles") - insn["find_cycles"])
q = dividend / divisor
if (q > 0)
cacheref_per_insn <<< q
dividend = (@perf("find_cache_misses") - insn["find_cache_misses"])
q = dividend / divisor
if (q > 0)
miss_per_insn <<< q
}
probe end
{
if (@count(cycles_per_insn)) {
printf ("Cycles per Insn\n\n")
print (@hist_log(cycles_per_insn))
}
if (@count(branch_per_insn)) {
printf ("\nBranches per Insn\n\n")
print (@hist_log(branch_per_insn))
}
if (@count(cacheref_per_insn)) {
printf ("Cache Refs per Insn\n\n")
print (@hist_log(cacheref_per_insn))
}
if (@count(miss_per_insn)) {
printf ("Cache Misses per Insn\n\n")
print (@hist_log(miss_per_insn))
}
}
最佳答案
Systemtap 无法读取内核探测的硬件 perfctr 值,因为 linux 没有提供合适的(例如,原子的)内部 API 来安全地从所有上下文中读取这些值。 perf...process 探测器之所以起作用,是因为该上下文不是原子的:systemtap 探测器处理程序可以安全地阻塞。
我无法回答您关于您上次试验的两个(?)脚本的详细问题,因为它们不完整。
关于linux - 用于分析函数缓存行为的 SystemTap 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549671/
我在为 MacOSX 构建的独立包中添加 DMG 背景的自定义图标时遇到问题。我在项目的根目录中添加了一个包。正在从中加载自定义图标,但没有加载 DMG 背景图标。我正在使用 Java fx 2.2.
Qt for Symbian 和 Qt for MeeGo 有什么区别?我知道 Qt 是一个交叉编译平台。这是否意味着如果我使用来自 Qt 的库,完全相同的库可以在所有支持 Qt 的设备(例如 Sym
我正在尝试使用 C# .NET 3.5/4.0 务实地运行 SQL Server 数据库的备份。我已经找到了如何完成此操作,但是我似乎找不到用于备份的命名空间库。 我正在寻找 Microsoft.Sq
我最近在疯狂学习 Java,但我通常是一名 .NET 开发人员。 (所以请原谅我的新手问题。) 在 .Net 中,我可以在不使用 IIS 的情况下开发 ASP.Net 页面,因为它有一个简化的 Web
这post仅当打印命令中有字符串时才有用。现在我有大量的源代码,其中包含一条声明,例如 print milk,butter 应该格式化为 print(milk,butter) 用\n 捕获行尾并不成功
所以我的问题是: https://gist.github.com/panSarin/4a221a0923927115584a 当我保存这个表格时,我收到了标题中的错误 NoMethodError (u
如何让 Html5 音频在点击时播放声音? (ogg 用于 Firefox 等浏览器,mp3 用于 chrome 等浏览器) 到目前为止,我可以通过 onclick 更改为单个文件类型,但我无法像在普
如果it1和it2有什么区别? std::set s; auto it1 = std::inserter(s, s.begin()); auto it2 = std::inserter(s, s.en
4.0.0 com.amkit myapp SpringMVCFirst
我目前使用 Eclipse 作为其他语言的 IDE,而且我习惯于不必离开 IDE 做任何事情 - 但是我真的很难为纯 ECMAScript-262 找到相同或类似的设置。 澄清一下,我不是在寻找 DO
我想将带有字符串数组的C# 结构发送到C++ 函数,该函数接受void * 作为c# 结构和char** 作为c# 结构字符串数组成员。 我能够将结构发送到 c++ 函数,但问题是,无法从 c++ 函
我正在使用动态创建的链接: 我想为f:param附加自定义转换器,以从#{name}等中删除空格。 但是f:param中没有转换器
是否可以利用Redis为.NET创建后写或直写式缓存?理想情况下,透明的高速缓存是由单个进程写入的,并且支持从数据库加载丢失的数据,并每隔一段时间持久保存脏块? 我已经搜查了好几个小时,也许是goog
我正在通过bash执行命令的ssh脚本。 FILENAMES=( "export_production_20200604.tgz" "export_production_log_2020060
我需要一个正则表达式来出现 0 到 7 个字母或 0 到 7 个数字。 例如:匹配:1234、asdbs 不匹配:123456789、absbsafsfsf、asf12 我尝试了([a-zA-Z]{0
我有一个用于会计期间的表格,该表格具有期间结束和开始的开始日期和结束日期。我使用此表来确定何时发生服务交易以及何时在查询中收集收入,例如... SELECT p.PeriodID, p.FiscalY
我很难为只接受字符或数字的 Laravel 构建正则表达式验证。它是这样的: 你好<-好的 123 <- 好的 你好123 <-不行 我现在的正则表达式是这样的:[A-Za-z]|[0-9]。 reg
您实际上会在 Repeater 上使用 OnItemDataBound 做什么? 最佳答案 “此事件为您提供在客户端显示数据项之前访问数据项的最后机会。引发此事件后,数据项将被清空,不再可用。” ~
我有一个 fragment 工作正常的项目,我正在使用 jeremyfeinstein 的 actionbarsherlock 和滑动菜单, 一切正常,但是当我想自定义左侧抽屉列表单元格时,出现异常
最近几天,我似乎平均分配时间在构建我的第一个应用程序和在这里发布问题!! 这是我的第一个应用程序,也是我们的设计师完成的第一个应用程序。我试图满足他所做的事情的外观和感觉,但我认为他没有做适当的事情。
我是一名优秀的程序员,十分优秀!