从 perf 获取用户空间堆栈信息

2024-02-26

我目前正在尝试在我正在测试的 PostgreSQL 版本中追踪一些幻像 I/O。它是一个多进程服务器,将磁盘 I/O 关联回特定后端和查询并不简单。

我还以为Linux的perf工具将是理想的选择,但我正在努力捕获块 I/O 性能计数器指标并将它们与用户空间活动相关联。

记录块 I/O 请求和完成情况很容易,例如:

sudo perf record -g -T -u postgres -e 'block:block_rq_*'

并且记录了用户空间 pid,但是没有捕获内核或用户空间堆栈,也没有捕获用户空间进程堆的快照位(例如查询文本)等的能力。因此,虽然您有 pid,但您没有不知道当时该进程在做什么。只是perf script输出如下:

postgres  7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0 () 208078848 + 1024 [postgres]

如果我添加-g标记为perf record它会拍摄快照kernel堆栈,但不捕获内核中捕获的性能事件的用户空间状态。用户空间堆栈仅从用户空间上升到入口点,例如LWLockRelease, LWLockAcquire, memcpy(mmap'd IO),__GI___libc_write, etc.

所以。有小费吗?能够捕捉快照用户空间堆栈响应kernel事件将是理想的。

我使用的是 Fedora 19、3.11.3-201.fc19.x86_64、Schrödinger’s Cat,性能版本为 3.10.9-200.fc19.x86_64。


好的,看起来有几个部分:

  • 我在 x86_64 上,大多数发行版都是用-fomit-frame-pointer默认情况下,并且perf没有帧指针就无法跟踪堆栈;

  • ....除非它是用构建的较新版本libunwind支持,在这种情况下它支持perf record -g dwarf.

See:

  • 为 Perf 添加 libunwind 支持的补丁 http://lkml.indiana.edu/hypermail/linux/kernel/1203.3/01569.html
  • Debian 错误 725075 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725075.
  • linux perf:如何解释和查找热点 https://stackoverflow.com/questions/7031210/linux-perf-how-to-interpret-and-find-hotspots

我使用的是 Fedora 18,但是同样的问题也适用 https://bugzilla.redhat.com/show_bug.cgi?id=1025603。因此,如果您正在分析正在处理的代码(可能在 Stack Overflow 上),请使用-fno-omit-frame-pointer and -ggdb.

我开始重建perf因为我希望能够与库存 RPM 进行比较:

  • sudo yum build-dep perf
  • sudo yum install yum-utils rpmdevtools libunwind-devel
  • yumdownloader --source perf或下载相应的kernel-.....src.rpm srpm
  • rpmdev-setuptree
  • rpm -Uvh kernel-*.src.rpm
  • cd $HOME/rpmbuild/SPECS
  • rpmbuild -bp --target=$(uname -m) kernel.spec

此时你可以构建一个新的perf如果你想:

  • cd $HOME/rpmbuild/BUILD/kernel-*/linux-*/tools/perf
  • make

...我做了并测试了更新perf如果使用可用的 libunwind 构建,实际上会捕获有用的堆栈。

您还可以构建新的 rpm:

  • 编辑 kernel.spec,取消注释该行%define buildid ...,将 buildid 更改为类似的内容.perfunwind。注意它是%define not % define.

  • 在同一个规范文件中,找到:

    %global perf_make \
    make %{?_smp_mflags} -C tools/perf -s V=1 WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_LIBNUMA=1 NO_STRLCPY=1 prefix=%{_prefix}
    

    并删除NO_LIBUNWIND=1

  • rpmbuild -bb --without up --without mp --without pae --without debug --without doc --without headers --without debuginfo --without bootwrapper --without with_vdso_install --with perf kernel.spec产生新的perfRPM 无需构建整个内核。或者,如果您愿意,可以省略--without对于您想要的内核风格,在这种情况下您还需要构建标头、调试信息等。

  • sudo rpm -Uvh $HOME/rpmbuild/RPMS/x86_64/perf-*.fc19.x86_64.rpm

See 关于构建自定义内核的 Fedora 项目指南 http://fedoraproject.org/wiki/Building_a_custom_kernel.

我已向 Fedora 报告了该问题;他们不应该使用NO_LIBUNWIND=1. See 错误 1025603 https://bugzilla.redhat.com/show_bug.cgi?id=1025603.

一旦你重建了perf您可以使用perf record -g dwarf获得完整的堆栈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 perf 获取用户空间堆栈信息 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 设备或资源在容器中从头开始忙于 alpine,但在 ubuntu 上却不忙

    我编辑了问题 但我的问题表现在高山容器中 我现在从头开始在容器中遇到同样的问题 这是同一个问题 但范围更窄一些 正如标题所描述的 我在 Ubuntu 容器中有一个工作可执行文件 我用它来构建我的应用程序 但是一旦我将其复制到 Alpine
  • 如何使用 Rails、Cucumber 和 Capybara 测试 Dropzone.js 上传?

    我有一个使用 Cucumber 和 Capybara 进行测试的 Rails 项目 我有一个使用 Dropzone js 的文件上传页面 我的上传使用对话框或拖放效果很好 测试是另一回事 我的表单中有以下字段
  • 有没有用R写的遗传编程代码[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我对进化算法很感兴趣 我已经用 R 测试了遗传算法 但有人尝试过遗传编程吗 你知道吗 某个地方是否有用
  • 为什么 C# 不提供类似于 C++ 的常量性?

    C 中的引用与 C 中的引用非常相似 只不过它们是垃圾收集的 为什么 C 编译器支持以下内容如此困难 成员函数标记const 对标记的数据类型 字符串除外 的引用const 通过其中仅const可以调用成员函数吗 我相信如果 C 支持这一点
  • 从 Python 运行 m 文件

    pymat 似乎不适用于当前版本的 matlab 所以我想知道是否还有另一个等效的版本 我还没有找到 理想的要点是从 python 2 6 运行一个 m 文件 像 scipy 这样的替代方案不适合 因为我认为它们不能运行 m 文件中的所有内
  • 如何在 Saxon 中使用 XPath 3.1?

    我当前使用 XPath 3 1 语法 但由于某种原因 Saxon 输出错误 To use XPath 3 1 syntax you must configure the XPath parser to handle it 我该怎么做呢 非常
  • LINQ 选择间隔 X 分钟的记录

    我有一个简单的表格来记录输入日期 我想选择相隔 X 分钟的记录 IMAGE LOCATION IMAGE DATE 2227 jpg 08 03 2014 22 27 47 2228 jpg 08 03 2014 22 28 48 2229
  • 如何在我的小程序中使用 JXMapViewer?

    我想编写一个必须使用缩放 平移工具渲染地图图像的小程序 我发现 JXMapViewer 可以帮助我 我该如何使用它 我在哪里可以找到相关文档 帮助我编写一个小程序 请求我的图像服务器提供要渲染的图块 图像服务器怎么样 帮助我 JXMapVi
  • Android 模拟器错误:std::bad_alloc

    我正在使用 Eclipse Juno 和 Android 模拟器 SDK Tools 21 1 并且多次遇到此错误 嗯 6 小时内出现两到三次 2013 03 22 11 41 19 Emulator terminate called af
  • Apache proxypass 缓存的 IP 地址

    我使用 Apache Web 服务器 2 4 通过 proxypass 指令将传入的 HTTP 请求代理到我们的后端服务器 我还通过 Apache 传递来自后端服务器的传出请求 再次使用 proxypass 例如 lt Location o
  • 在 NiFi 处理器“InvokeHTTP”中,您在哪里编写 POST 请求的正文?

    在发布有关 Apache NiFi InvokeHTTP 的问题之前 我已经浏览了所有其他问题及其答案 但我仍然不确定我应该拥有的最佳流程 我的情况如下 1 从 Apache Kafka 我获取原始元数据 2 使用EvaluateJSONP
  • 使用 React-Native 监听 Android 上的传入链接

    我可以使用链接库通过react native监听和处理IOS上的传入链接 https facebook github io react native docs linking html https facebook github io re
  • 如何在java中验证unix时间戳?

    我需要验证给定的输入字符串是否有效Timestamp以毫秒为单位 例如 如果给定Timestamp String time 1310966356458 那么它应该返回true if String time 1000 那么它应该返回 fals
  • 我可以通过在 Airflow 中向运算符添加更多 cpu 来提高处理速度吗?

    In airflow cfg有一个部分称为 operators where default cpus被设置为1 and default ram and default disk都设置为512 我想了解如果增加这些参数是否会提高处理速度 我查
  • 基于 JWT 的 标签身份验证?

    假设我有一个单页面应用程序 它使用 JWT 令牌对后端 REST api 进行身份验证 我在执行 REST 请求时在 http 标头内传输 JWT 令牌 到目前为止 一切都很好 现在 假设我想从服务器下载图像 并且我希望该图像只能由经过身份
  • 替换文件路径中的分隔符

    我正在 VS 2008 中开发一个 C Web 应用程序 我让用户选择一个输入文件 然后将文件路径存储在一个字符串变量中 但是 它将这条路径存储为 C folder 所以我的问题是如何将此文件路径转换为单个 谢谢大家的帮助 请原谅我 因为我
  • 反转列表时出现意外结果

    我需要对下面代码的意外结果进行一些解释 似乎是由于一些错误 reverse b gt b reverse reverse x x reverse x xs last x xs reverse xs Main gt reverse 0 8 2
  • 无法将类型 string 隐式转换为 System.date.time 但在 datetime 中声明

    我是 C 的初学者 编写了一些代码 但出现错误 错误是 无法将字符串类型隐式转换为 System date time 但我在这里看到我在字符串中声明 public partial class HDate private string Sta
  • 为什么当我 pip freeze 时没有出现 setuptools 1.3.1?

    我在跑步virtualenvwrapper和 Ubuntu 12 04 上的朋友 virtualenvwrapper 1 7 1 2 virtualenv 1 7 1 2 pip 1 0 Distribute 0 6 24 Python 2
  • 从 perf 获取用户空间堆栈信息

    我目前正在尝试在我正在测试的 PostgreSQL 版本中追踪一些幻像 I O 它是一个多进程服务器 将磁盘 I O 关联回特定后端和查询并不简单 我还以为Linux的perf工具将是理想的选择 但我正在努力捕获块 I O 性能计数器指标并