我现在已经能够perf
捕获用户空间堆栈,但我不确定如何说服它捕获通过引用传递的值作为指针,或捕获感兴趣的全局快照。
具体来说,我正在尝试分析 PostgreSQL 在各种负载下的系统范围性能,无论是否有性能相关的补丁。我需要做的关键事情之一是告诉内核中哪些查询与哪些块 I/O 请求相关联。
perf
记录 pid 和用户空间堆栈,其中有时包含current_query
,但由于它是一个字符串,它是通过引用传递的,所以我得到的只是一个不透明的指针。不是很有用。它也不会出现在所有跟踪中,所以理想情况下,我会从全局 PostgreSQL 中提取值并将其存储在perf
每个跟踪样本中并记录下来。事后将 pid 与查询匹配可能是可行的,但给定的 PostgreSQL 后端 (pid) 在其生命周期内不会只运行一个查询,因此perf
需要在跟踪和 PostgreSQL 日志之间使用大量相关的时间戳。
这似乎是您期望它能够做的事情,因为通常单独的堆栈并不能告诉您正在发生的事情,如果它已经可以读取符号表,它应该能够查看up globals 并知道哪些函数参数是需要取消引用的指针并复制前“n”个字节。
不过,我一生都无法弄清楚如何做到这一点,或者这是否可能。我只是运气不好?我需要破解perf inject
PostgreSQL 记录的单独时间戳日志中的这些信息吗?