C++ kernel.kallsyms在C++;应用程序运行
我用以下开关编译了C++代码:C++ kernel.kallsyms在C++;应用程序运行,c++,linux-kernel,performance-testing,perf,C++,Linux Kernel,Performance Testing,Perf,我用以下开关编译了C++代码: g++ -O0 -g -rdynamic -DNDEBUG -DARMA_NO_DEBUG -std=c++11 -pthread 链接器开关包括: -lboost_system -lboost_thread -lboost_chrono -larmadillo -pthread 但是我在应用程序中没有使用线程。我还避免使用任何delay功能 然后我运行代码并使用perf工具对其进行测试 sudo perf record ./bin/my_applicatio
g++ -O0 -g -rdynamic -DNDEBUG -DARMA_NO_DEBUG -std=c++11 -pthread
链接器开关包括:
-lboost_system -lboost_thread -lboost_chrono -larmadillo -pthread
但是我在应用程序中没有使用线程。我还避免使用任何delay
功能
然后我运行代码并使用perf
工具对其进行测试
sudo perf record ./bin/my_application
sudo perf report -f
结果对我来说很奇怪:
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
开销命令共享对象符号
50.92%myApplication[kernel.kallsyms][k]本机时钟
24.73%myApplication[kernel.kallsyms][k]选择下一个实体
17.46%myApplication[kernel.kallsyms][k]前缀_name
2.57%我的应用程序我的应用程序[.]arma::arrayops::copy_small
1.11%myApplication myApplication[.]arma::Mat::Mat
1.11%myApplication myApplication[.]myClass::myMethod
1.11%的myApplication libblas.so.3[.]dgemv_
0.97%myApplication myApplication[.]arma::Mat::init_cold
为什么kernel.kallsyms
函数控制着执行时间
对于我的应用程序,
native\u sched\u clock
,pick\u next\u entity
,prepend\u name
每个都在做什么?您的应用程序太快太短,无法以默认频率perf record
进行分析。所有带有[k]
和[kernel.kallsyms]
的行都来自内核,它们执行一些服务任务,比如加载二进制文件和调度线程/进程(```)。当您在某种虚拟化平台(如xen、kvm等)上使用perf时,可能会出现问题,因为大多数虚拟化环境都不允许访问来宾内核的硬件性能计数器(AWS有时会在独立实例上提供基本的周期子集和指令);所以perf将使用软件定时器中断
尝试在要测量的代码周围添加循环(重复100或1000次)和/或增加要处理的数据的大小。您的程序应至少运行几秒钟
您还可以尝试运行
perf stat./program
来获取程序的计时值和基本硬件性能计数(如果支持计数器),并发布结果。为什么kernel.kallsyms函数在执行时间上占主导地位?
-可能,您使用的用户空间计数器的触发频率低于内核计数器<代码>什么是本机时钟、选择下一个实体、为我的应用程序预先命名?这些是内核函数,您可以在内核代码中查看它们的描述。例如,使用文件名进行操作。