filter so address pmudata

This commit is contained in:
rfwang07 2024-12-11 09:07:47 +08:00
parent 07e2663f06
commit 70845f2d91
2 changed files with 135 additions and 1 deletions

View File

@ -0,0 +1,127 @@
From bfbec494a98f6b872b7449c4f641d2a94942d84b Mon Sep 17 00:00:00 2001
From: rfwang07 <wangrufeng5@huawei.com>
Date: Tue, 10 Dec 2024 16:06:31 +0800
Subject: [PATCH] filter so address pmudata
---
include/records.h | 1 +
src/configs.cc | 4 +++-
src/oeaware_plugins/tuner_sysboost.cc | 1 +
src/records.cc | 1 +
src/startup_opt.cc | 28 +++++++++++++++++++++------
5 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/include/records.h b/include/records.h
index c86ce62..df7d39d 100644
--- a/include/records.h
+++ b/include/records.h
@@ -23,6 +23,7 @@ typedef struct {
typedef struct {
uint64_t processed_samples;
std::map<pid_t, Pidinfo*> pids;
+ std::map<const char*, bool> modules;
} global_records;
extern global_records records;
diff --git a/src/configs.cc b/src/configs.cc
index 9aa6d36..ab96d2a 100644
--- a/src/configs.cc
+++ b/src/configs.cc
@@ -128,12 +128,14 @@ std::string get_app_collected_profile_path(AppConfig *app)
int parse_app(boost::property_tree::ptree pt, std::string app_name)
{
std::string full_path;
+ char rlpath[1024] = {0};
try {
full_path = pt.get<std::string>(app_name + ".FULL_PATH");
- if (!boost::filesystem::exists(full_path)) {
+ if (!get_real_path(full_path.c_str(), rlpath)) {
ERROR("Error: File does not exist: " << full_path);
return DFOT_ERROR;
}
+ full_path = std::string(rlpath);
} catch (const boost::property_tree::ptree_bad_path &e) {
ERROR("FULL_PATH is needed.");
return DFOT_ERROR;
diff --git a/src/oeaware_plugins/tuner_sysboost.cc b/src/oeaware_plugins/tuner_sysboost.cc
index b471ccf..14025fd 100644
--- a/src/oeaware_plugins/tuner_sysboost.cc
+++ b/src/oeaware_plugins/tuner_sysboost.cc
@@ -81,6 +81,7 @@ void SysboostTuner::UpdateData(const DataList &dataList)
processing = true;
int64_t start_ts = get_current_timestamp();
+ records.modules.clear();
uint64_t total_samples = 0;
for (unsigned long long i = 0; i < dataList.len; i++) {
PmuSamplingData *data = (PmuSamplingData *)(dataList.data[i]);
diff --git a/src/records.cc b/src/records.cc
index 1f2cbe3..9b212a6 100644
--- a/src/records.cc
+++ b/src/records.cc
@@ -8,6 +8,7 @@ void reset_records()
{
records.processed_samples = 0;
records.pids.clear();
+ records.modules.clear();
}
void debug_print_records()
diff --git a/src/startup_opt.cc b/src/startup_opt.cc
index 14b4aa4..78cae70 100644
--- a/src/startup_opt.cc
+++ b/src/startup_opt.cc
@@ -92,9 +92,25 @@ void update_app_profile_data(AppConfig *app, struct PmuData &data)
// {函数名func: {内存地址addr: 计数count, ...}, ...}
auto &funcs = app->profile.funcs;
+ // 刷新modules记录避免直接匹配modules字符串此处的module是relapath路径
+ auto symbol = data.stack->symbol;
+ if (records.modules.find(symbol->module) == records.modules.end()) {
+ records.modules[symbol->module] = false;
+ if (strcmp(symbol->module, app->full_path.c_str()) == 0) {
+ records.modules[symbol->module] = true;
+ } else if (strstr(symbol->module, ".rto") != nullptr &&
+ strncmp(symbol->module, app->full_path.c_str(), strlen(app->full_path.c_str())) == 0) {
+ records.modules[symbol->module] = true;
+ }
+ }
+
+ if (!records.modules[symbol->module]) {
+ return;
+ }
+
// symbol->codeMapAddr symbol->offset
// 如果是BOLT优化过后的二进制的采样数据则只需记录地址和计数
- unsigned long addr = data.stack->symbol->codeMapAddr;
+ unsigned long addr = symbol->codeMapAddr;
if (records.pids[data.pid]->instance->version > 0) {
if (addrs.find(addr) != addrs.end()) {
@@ -108,18 +124,18 @@ void update_app_profile_data(AppConfig *app, struct PmuData &data)
// 原始二进制的采样数据,读取地址+符号+偏移
if (addrs.find(addr) != addrs.end()) {
addrs[addr].count++;
- funcs[addrs[addr].name][data.stack->symbol->offset]++;
+ funcs[addrs[addr].name][symbol->offset]++;
} else {
addrs[addr] = AddrInfo();
- if (data.stack->symbol->mangleName != nullptr) {
- addrs[addr].name = data.stack->symbol->mangleName;
+ if (symbol->mangleName != nullptr) {
+ addrs[addr].name = symbol->mangleName;
} else {
auto sym = SymResolverMapAddr(data.pid, addr);
addrs[addr].name = sym->mangleName;
}
- addrs[addr].offset = data.stack->symbol->offset;
+ addrs[addr].offset = symbol->offset;
addrs[addr].count = 1;
- funcs[addrs[addr].name][data.stack->symbol->offset] = 1;
+ funcs[addrs[addr].name][symbol->offset] = 1;
}
}
--
2.39.5 (Apple Git-154)

View File

@ -1,12 +1,14 @@
Name: D-FOT
Version: v1.0.2
Release: 1
Release: 2
Summary: %{name} is a dynamic feedback-directed optimization tool for openEuler.
License: Mulan PSL v2
URL: https://gitee.com/openeuler/%{name}
Source0: %{name}-%{version}.tar.gz
Patch1: 0001-filter-so-address-pmudata.patch
BuildRequires: cmake make gcc-c++
BuildRequires: boost-devel log4cplus-devel numactl-devel libkperf-devel oeAware-manager-devel
Requires: log4cplus boost libboundscheck oeAware-manager libkperf llvm-bolt
@ -36,6 +38,11 @@ install -D -m 0640 ./configs/dfot.ini ${RPM_BUILD_ROOT}/etc/dfot/
%attr(0440,root,root) %{_libdir}/oeAware-plugin/libdfot.so
%changelog
* Wed Dec 11 2024 rfwang07 <wangrufeng5@huawei.com> - v1.0.2-2
- ID:NA
- SUG:NA
- DESC: filter so address in pmudata
* Tue Dec 10 2024 rfwang07 <wangrufeng5@huawei.com> - v1.0.2-1
- ID:NA
- SUG:NA