kernel.kallsyms 在 C++ 应用程序运行中的作用

Kej*_*ori 5 c++ performance-testing linux-kernel perf

我使用以下开关编译了我的 C++ 代码:

g++ -O0 -g -rdynamic -DNDEBUG -DARMA_NO_DEBUG -std=c++11 -pthread
Run Code Online (Sandbox Code Playgroud)

链接器开关是:

-lboost_system -lboost_thread -lboost_chrono -larmadillo -pthread
Run Code Online (Sandbox Code Playgroud)

但是我在我的应用程序中没有使用线程。我也避免使用任何delay函数。

然后我运行代码并使用perf工具对其进行测试。

sudo perf record ./bin/my_application
sudo perf report -f
Run Code Online (Sandbox Code Playgroud)

结果对我来说很奇怪:

Overhead  Command          Shared Object     Symbol
 50.92%  myApplication  [kernel.kallsyms]  [k] native_sched_clock
 24.73%  myApplication  [kernel.kallsyms]  [k] pick_next_entity
 17.46%  myApplication  [kernel.kallsyms]  [k] prepend_name
  2.57%  myApplication  myApplication      [.] arma::arrayops::copy_small<double>
  1.11%  myApplication  myApplication      [.] arma::Mat<double>::Mat
  1.11%  myApplication  myApplication      [.] myClass::myMethod
  1.11%  myApplication  libblas.so.3       [.] dgemv_
  0.97%  myApplication  myApplication      [.] arma::Mat<double>::init_cold
Run Code Online (Sandbox Code Playgroud)

为什么 kernel.kallsyms函数主宰了执行时间?

什么是native_sched_clockpick_next_entityprepend_name各做我的应用程序?

osg*_*sgx 3

您的应用程序速度太快且太短,无法使用默认频率 进行分析perf record。所有带有[k][kernel.kallsyms]的行都来自内核,执行一些服务工作,例如加载二进制文件和调度线程/进程(``)。当您在某种虚拟化平台(如 xen、kvm 等)上使用 perf 时,情况可能会出现问题,因为大多数虚拟化环境无法访问来宾内核的硬件性能计数器(AWS 有时会在隔离的虚拟机上提供基本的周期子集和指令)实例);所以perf将使用软件定时器中断。

尝试在要测量的代码周围添加循环(重复 100 或 1000 次)和/或增加要处理的数据的大小。您的程序应该至少运行几秒钟。

您还可以尝试运行perf stat ./program以获取程序的计时值和基本硬件性能计数(如果支持计数器),并发布结果。