!3 update libkperf dependence and adapt code for oeaware 2.0
From: @rfwang07 Reviewed-by: @li-yancheng Signed-off-by: @li-yancheng
This commit is contained in:
commit
29a72fbea0
70
0001-update-libkperf-dependence.patch
Normal file
70
0001-update-libkperf-dependence.patch
Normal file
@ -0,0 +1,70 @@
|
||||
From 2cd49e73b30659f6faa9ff439083506f0ccec712 Mon Sep 17 00:00:00 2001
|
||||
From: rfwang07 <wangrufeng5@huawei.com>
|
||||
Date: Tue, 3 Dec 2024 15:40:47 +0800
|
||||
Subject: [PATCH] update libkperf dependence
|
||||
|
||||
---
|
||||
CMakeLists.txt | 9 ---------
|
||||
include/opt.h | 2 +-
|
||||
src/startup_opt.cc | 5 ++---
|
||||
3 files changed, 3 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 00675c2..df8006e 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -19,10 +19,6 @@ endif()
|
||||
|
||||
add_compile_options(-fPIC -Wall -Wextra)
|
||||
|
||||
-# libkperf
|
||||
-message("-- libkperf library path: ${LIB_KPERF_LIBPATH}")
|
||||
-message("-- libkperf include path: ${LIB_KPERF_INCPATH}")
|
||||
-
|
||||
set(dfot_tuner_sysboost_src
|
||||
src/oeaware_plugins/instance.cc
|
||||
src/oeaware_plugins/tuner_sysboost.cc
|
||||
@@ -37,11 +33,6 @@ add_library(dfot SHARED ${dfot_tuner_sysboost_src})
|
||||
|
||||
include_directories(dfot PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
- ${LIB_KPERF_INCPATH}
|
||||
-)
|
||||
-
|
||||
-target_link_directories(dfot PUBLIC
|
||||
- ${LIB_KPERF_LIBPATH}
|
||||
)
|
||||
|
||||
target_link_libraries(dfot kperf sym dl log4cplus boost_system boost_filesystem)
|
||||
diff --git a/include/opt.h b/include/opt.h
|
||||
index f998501..2c40cbe 100644
|
||||
--- a/include/opt.h
|
||||
+++ b/include/opt.h
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
-#include "pmu.h"
|
||||
+#include "libkperf/pmu.h"
|
||||
#include "configs.h"
|
||||
|
||||
extern bool check_dependence_ready();
|
||||
diff --git a/src/startup_opt.cc b/src/startup_opt.cc
|
||||
index b408205..5b2ad9c 100644
|
||||
--- a/src/startup_opt.cc
|
||||
+++ b/src/startup_opt.cc
|
||||
@@ -9,9 +9,8 @@
|
||||
|
||||
#include "boost/filesystem.hpp"
|
||||
|
||||
-// libkperf
|
||||
-#include "pmu.h"
|
||||
-#include "symbol.h"
|
||||
+#include "libkperf/pmu.h"
|
||||
+#include "libkperf/symbol.h"
|
||||
|
||||
// D-FOT
|
||||
#include "interface.h"
|
||||
--
|
||||
2.39.5 (Apple Git-154)
|
||||
|
||||
626
0002-adapt-the-code-for-oeaware-2.0.patch
Normal file
626
0002-adapt-the-code-for-oeaware-2.0.patch
Normal file
@ -0,0 +1,626 @@
|
||||
From 82bd0304d05a4f4c7ca913eab7d0863912bccfa3 Mon Sep 17 00:00:00 2001
|
||||
From: rfwang07 <wangrufeng5@huawei.com>
|
||||
Date: Tue, 3 Dec 2024 23:05:06 +0800
|
||||
Subject: [PATCH] adapt the code for oeaware 2.0
|
||||
|
||||
---
|
||||
CMakeLists.txt | 11 +-
|
||||
include/interface.h | 74 --------
|
||||
include/logs.h | 12 +-
|
||||
include/opt.h | 2 +-
|
||||
include/tuner.h | 21 ++-
|
||||
src/configs.cc | 2 +-
|
||||
src/oeaware_plugins/instance.cc | 11 +-
|
||||
src/oeaware_plugins/tuner_sysboost.cc | 249 ++++++++++++--------------
|
||||
src/startup_opt.cc | 14 +-
|
||||
9 files changed, 158 insertions(+), 238 deletions(-)
|
||||
delete mode 100644 include/interface.h
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index df8006e..dda676e 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -1,8 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
project(D-FOT)
|
||||
|
||||
-set(CMAKE_CXX_STANDARD 11)
|
||||
-
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
message("-- Build type: Debug")
|
||||
add_compile_options(-g3 -O0)
|
||||
@@ -17,7 +15,7 @@ else()
|
||||
add_compile_options(-O3)
|
||||
endif()
|
||||
|
||||
-add_compile_options(-fPIC -Wall -Wextra)
|
||||
+add_compile_options(-std=c++17 -fPIC -Wall -Wextra)
|
||||
|
||||
set(dfot_tuner_sysboost_src
|
||||
src/oeaware_plugins/instance.cc
|
||||
@@ -31,8 +29,13 @@ set(dfot_tuner_sysboost_src
|
||||
|
||||
add_library(dfot SHARED ${dfot_tuner_sysboost_src})
|
||||
|
||||
+
|
||||
include_directories(dfot PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
+ # 因为oeAware头文件问题,此处临时适配
|
||||
+ /usr/include/libkperf
|
||||
+ /usr/include/oeaware
|
||||
+ /usr/include/oeaware/interface
|
||||
)
|
||||
|
||||
-target_link_libraries(dfot kperf sym dl log4cplus boost_system boost_filesystem)
|
||||
+target_link_libraries(dfot boundscheck kperf sym dl log4cplus boost_system boost_filesystem)
|
||||
diff --git a/include/interface.h b/include/interface.h
|
||||
deleted file mode 100644
|
||||
index 0a49743..0000000
|
||||
--- a/include/interface.h
|
||||
+++ /dev/null
|
||||
@@ -1,74 +0,0 @@
|
||||
-/******************************************************************************
|
||||
- * Copyright (c) 2024 Huawei Technologies Co., Ltd.
|
||||
- * oeAware is licensed under Mulan PSL v2.
|
||||
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
- * You may obtain a copy of Mulan PSL v2 at:
|
||||
- * http://license.coscl.org.cn/MulanPSL2
|
||||
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
- * See the Mulan PSL v2 for more details.
|
||||
- ******************************************************************************/
|
||||
-#ifndef __INTERFACE_H__
|
||||
-#define __INTERFACE_H__
|
||||
-
|
||||
-#include <stdbool.h>
|
||||
-#include <stdint.h>
|
||||
-
|
||||
-#ifdef __cplusplus
|
||||
-extern "C" {
|
||||
-#endif
|
||||
-
|
||||
-struct DataBuf {
|
||||
- int len;
|
||||
- void *data;
|
||||
-};
|
||||
-
|
||||
-struct DataRingBuf {
|
||||
- /* instance name */
|
||||
- const char *instance_name;
|
||||
- /* buf write index, initial value is -1 */
|
||||
- int index;
|
||||
- /* instance run times */
|
||||
- uint64_t count;
|
||||
- struct DataBuf *buf;
|
||||
- int buf_len;
|
||||
-};
|
||||
-
|
||||
-struct Param {
|
||||
- const struct DataRingBuf **ring_bufs;
|
||||
- int len;
|
||||
-};
|
||||
-
|
||||
-struct Interface {
|
||||
- const char* (*get_version)();
|
||||
- /* The instance name is a unique identifier in the system. */
|
||||
- const char* (*get_name)();
|
||||
- const char* (*get_description)();
|
||||
- /* Specifies the instance dependencies, which is used as the input information
|
||||
- * for instance execution.
|
||||
- */
|
||||
- const char* (*get_dep)();
|
||||
- /* Instance scheduling priority. In a uniform time period, a instance with a
|
||||
- * lower priority is scheduled first.
|
||||
- */
|
||||
- int (*get_priority)();
|
||||
- int (*get_type)();
|
||||
- /* Instance execution period. */
|
||||
- int (*get_period)();
|
||||
- bool (*enable)();
|
||||
- void (*disable)();
|
||||
- const struct DataRingBuf* (*get_ring_buf)();
|
||||
- void (*run)(const struct Param*);
|
||||
-};
|
||||
-
|
||||
-/* Obtains the instances from the plugin.
|
||||
- * The return value is the number of instances.
|
||||
- */
|
||||
-int get_instance(struct Interface **interface);
|
||||
-
|
||||
-#ifdef __cplusplus
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
-#endif
|
||||
diff --git a/include/logs.h b/include/logs.h
|
||||
index f27d289..331060c 100644
|
||||
--- a/include/logs.h
|
||||
+++ b/include/logs.h
|
||||
@@ -22,11 +22,11 @@
|
||||
|
||||
#define DFOT_LOG_PATH "/etc/dfot/dfot.log"
|
||||
|
||||
-#define DEBUG(fmt) LOG4CPLUS_DEBUG(logger.get(), fmt)
|
||||
-#define INFO(fmt) LOG4CPLUS_INFO(logger.get(), fmt)
|
||||
-#define WARN(fmt) LOG4CPLUS_WARN(logger.get(), fmt)
|
||||
-#define ERROR(fmt) LOG4CPLUS_ERROR(logger.get(), fmt)
|
||||
-#define FATAL(fmt) LOG4CPLUS_FATAL(logger.get(), fmt)
|
||||
+#define DEBUG(fmt) LOG4CPLUS_DEBUG(dfot_logger.get(), fmt)
|
||||
+#define INFO(fmt) LOG4CPLUS_INFO(dfot_logger.get(), fmt)
|
||||
+#define WARN(fmt) LOG4CPLUS_WARN(dfot_logger.get(), fmt)
|
||||
+#define ERROR(fmt) LOG4CPLUS_ERROR(dfot_logger.get(), fmt)
|
||||
+#define FATAL(fmt) LOG4CPLUS_FATAL(dfot_logger.get(), fmt)
|
||||
|
||||
static std::map<std::string, log4cplus::LogLevel> LOG_LEVEL = {
|
||||
{"DEBUG", log4cplus::DEBUG_LOG_LEVEL},
|
||||
@@ -51,6 +51,6 @@ private:
|
||||
log4cplus::Initializer initializer;
|
||||
};
|
||||
|
||||
-extern Logger logger;
|
||||
+extern Logger dfot_logger;
|
||||
|
||||
#endif
|
||||
diff --git a/include/opt.h b/include/opt.h
|
||||
index 2c40cbe..ff0241b 100644
|
||||
--- a/include/opt.h
|
||||
+++ b/include/opt.h
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
-#include "libkperf/pmu.h"
|
||||
+#include <libkperf/pmu.h>
|
||||
#include "configs.h"
|
||||
|
||||
extern bool check_dependence_ready();
|
||||
diff --git a/include/tuner.h b/include/tuner.h
|
||||
index 326615c..46db4f7 100644
|
||||
--- a/include/tuner.h
|
||||
+++ b/include/tuner.h
|
||||
@@ -12,8 +12,25 @@
|
||||
#ifndef __TUNER_H__
|
||||
#define __TUNER_H__
|
||||
|
||||
-#include "interface.h"
|
||||
+#include <oeaware/data_list.h>
|
||||
+#include <oeaware/interface/topic.h>
|
||||
+#include <oeaware/interface/interface.h>
|
||||
|
||||
-extern struct Interface sysboost_tuner;
|
||||
+class SysboostTuner : public oeaware::Interface {
|
||||
+public:
|
||||
+ SysboostTuner();
|
||||
+ ~SysboostTuner();
|
||||
+ oeaware::Result OpenTopic(const oeaware::Topic &topic) override;
|
||||
+ void CloseTopic(const oeaware::Topic &topic) override;
|
||||
+ void UpdateData(const DataList &dataList) override;
|
||||
+ oeaware::Result Enable(const std::string ¶m) override;
|
||||
+ void Disable() override;
|
||||
+ void Run() override;
|
||||
+
|
||||
+private:
|
||||
+ oeaware::Topic depTopic;
|
||||
+ void *processingArea;
|
||||
+ size_t processingAreaSize;
|
||||
+};
|
||||
|
||||
#endif
|
||||
diff --git a/src/configs.cc b/src/configs.cc
|
||||
index 9cc0c38..9aa6d36 100644
|
||||
--- a/src/configs.cc
|
||||
+++ b/src/configs.cc
|
||||
@@ -81,7 +81,7 @@ int parse_general(boost::property_tree::ptree pt)
|
||||
} else {
|
||||
configs->log_level = it->second;
|
||||
}
|
||||
- logger.setLogLevel(configs->log_level);
|
||||
+ dfot_logger.setLogLevel(configs->log_level);
|
||||
configs->sampling_strategy = pt.get<int>("general.COLLECTOR_SAMPLING_STRATEGY");
|
||||
configs->high_load_threshold = pt.get<int>("general.COLLECTOR_HIGH_LOAD_THRESHOLD");
|
||||
configs->collector_sampling_period = pt.get<int>("general.COLLECTOR_SAMPLING_PERIOD");
|
||||
diff --git a/src/oeaware_plugins/instance.cc b/src/oeaware_plugins/instance.cc
|
||||
index 5a5e7bf..b51c987 100644
|
||||
--- a/src/oeaware_plugins/instance.cc
|
||||
+++ b/src/oeaware_plugins/instance.cc
|
||||
@@ -1,12 +1,11 @@
|
||||
-#include "logs.h"
|
||||
+#include <oeaware/interface/interface.h>
|
||||
|
||||
-#include "interface.h"
|
||||
+#include "logs.h"
|
||||
#include "tuner.h"
|
||||
|
||||
-Logger __attribute__((visibility("hidden"))) logger("D-FOT");
|
||||
+Logger __attribute__((visibility("hidden"))) dfot_logger("D-FOT");
|
||||
|
||||
-extern "C" int get_instance(struct Interface **interface)
|
||||
+extern "C" void GetInstance(std::vector<std::shared_ptr<oeaware::Interface>> &interface)
|
||||
{
|
||||
- *interface = &sysboost_tuner;
|
||||
- return 1;
|
||||
+ interface.emplace_back(std::make_shared<SysboostTuner>());
|
||||
}
|
||||
diff --git a/src/oeaware_plugins/tuner_sysboost.cc b/src/oeaware_plugins/tuner_sysboost.cc
|
||||
index 8bca214..cfab1fc 100644
|
||||
--- a/src/oeaware_plugins/tuner_sysboost.cc
|
||||
+++ b/src/oeaware_plugins/tuner_sysboost.cc
|
||||
@@ -1,163 +1,163 @@
|
||||
#include <cstring>
|
||||
+#include <securec.h>
|
||||
+
|
||||
+#include <oeaware/interface/interface.h>
|
||||
+#include <oeaware/pmu_sampling_data.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "utils.h"
|
||||
#include "configs.h"
|
||||
#include "records.h"
|
||||
-#include "interface.h"
|
||||
|
||||
#include "opt.h"
|
||||
-
|
||||
-// 当前优化插件需要的采样数据来源于oeaware-collector采样实例PMU_CYCLES_SAMPLING
|
||||
-// 本插件不显式依赖该PMU_CYCLES_SAMPLING(因为可以预置profile来优化)
|
||||
-// 注意如果oeaware-collector仓库对应采样实例名字有变化时,此处也要同步修改
|
||||
-#define PMU_CYCLES_SAMPLING "pmu_cycles_sampling"
|
||||
+#include "tuner.h"
|
||||
+
|
||||
+// 当前优化插件需要的采样数据来源于oeaware-manager采样实例pmu_sampling_collector
|
||||
+// 本插件通过订阅获取pmu_sampling_collector的采样数据,也可以预置profile来优化
|
||||
+// 注意如果oeaware-manager仓库对应采样实例名字有变化时,此处也要同步修改
|
||||
+#define DEP_INSTANCE_NAME "pmu_sampling_collector"
|
||||
+// 订阅性能事件
|
||||
+#define DEP_TOPIC_NAME "cycles"
|
||||
// sysboost优化插件实例名
|
||||
#define TUNER_INSTANCE_NAME "dfot_tuner_sysboost"
|
||||
|
||||
-// 从collector获取ringbuf
|
||||
-void get_collector_ringbuf(
|
||||
- const struct Param *param, const struct DataRingBuf **ringbuf, uint64_t *cnt)
|
||||
+SysboostTuner::SysboostTuner()
|
||||
{
|
||||
- const struct DataRingBuf *buf = nullptr;
|
||||
- static int last_record_index = -1; // 记录上一次处理的ring_bufs下标
|
||||
- static uint64_t last_record_count = 0; // 记录上一次处理时采集插件的运行次数
|
||||
-
|
||||
- *ringbuf = nullptr;
|
||||
- *cnt = 0;
|
||||
-
|
||||
- // 如果插件无变化,可以快速找到对应param
|
||||
- if (last_record_index >= 0 && last_record_index < param->len &&
|
||||
- param->ring_bufs[last_record_index] != nullptr &&
|
||||
- strcmp(param->ring_bufs[last_record_index]->instance_name, PMU_CYCLES_SAMPLING) == 0) {
|
||||
- buf = param->ring_bufs[last_record_index];
|
||||
- } else {
|
||||
- for (int i = 0; i < param->len; i++) {
|
||||
- if (param->ring_bufs[i] == nullptr) {
|
||||
- continue;
|
||||
- }
|
||||
- if (strcmp(param->ring_bufs[i]->instance_name, PMU_CYCLES_SAMPLING) == 0) {
|
||||
- buf = param->ring_bufs[i];
|
||||
- last_record_index = i;
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (buf == nullptr) {
|
||||
- last_record_index = -1;
|
||||
- last_record_count = 0;
|
||||
- return;
|
||||
- }
|
||||
+ // 基类参数
|
||||
+ name = TUNER_INSTANCE_NAME;
|
||||
+ version = "1.0.0";
|
||||
+ description = "dfot tuner: sysboost";
|
||||
+ priority = 2;
|
||||
+ type = oeaware::TUNE;
|
||||
+ period = 1000;
|
||||
+
|
||||
+ depTopic.instanceName = DEP_INSTANCE_NAME;
|
||||
+ depTopic.topicName = DEP_TOPIC_NAME;
|
||||
+
|
||||
+ processingArea = nullptr;
|
||||
+ processingAreaSize = 0;
|
||||
+}
|
||||
|
||||
- if (buf->count > last_record_count) {
|
||||
- // 数据有更新,注意DataBuf已经全部刷新的场景
|
||||
- *ringbuf = buf;
|
||||
- *cnt = std::min(buf->count - last_record_count, (uint64_t)buf->buf_len);
|
||||
- last_record_count = buf->count;
|
||||
- } else if (buf->count < last_record_count) {
|
||||
- // 异常场景
|
||||
- WARN("[run] record data count: " << last_record_count
|
||||
- << " is large than " << "current count: " << buf->count);
|
||||
- *ringbuf = nullptr;
|
||||
- last_record_count = 0;
|
||||
+SysboostTuner::~SysboostTuner()
|
||||
+{
|
||||
+ if (processingArea != nullptr) {
|
||||
+ free(processingArea);
|
||||
+ processingArea = nullptr;
|
||||
+ processingAreaSize = 0;
|
||||
}
|
||||
}
|
||||
|
||||
-void get_sampling_data_from_collector(const struct Param *param)
|
||||
+/// @brief 调优插件不需要打开topic
|
||||
+/// @param topic
|
||||
+/// @return
|
||||
+oeaware::Result SysboostTuner::OpenTopic(const oeaware::Topic &topic)
|
||||
{
|
||||
- const struct DataRingBuf *ringbuf = nullptr;
|
||||
- uint64_t cnt = 0; // 需要处理的DataBuf的个数,小于buf_len
|
||||
+ (void)topic;
|
||||
+ return oeaware::Result(OK);
|
||||
+}
|
||||
|
||||
- int64_t start_ts = get_current_timestamp();
|
||||
+/// @brief 调优插件不需要关闭topic
|
||||
+/// @param topic
|
||||
+void SysboostTuner::CloseTopic(const oeaware::Topic &topic)
|
||||
+{
|
||||
+ (void)topic;
|
||||
+}
|
||||
|
||||
- get_collector_ringbuf(param, &ringbuf, &cnt);
|
||||
- if (ringbuf == nullptr || cnt == 0) {
|
||||
+/// @brief 处理依赖采集插件实例的新采样数据
|
||||
+/// @param dataList 采样数据
|
||||
+void SysboostTuner::UpdateData(const DataList &dataList)
|
||||
+{
|
||||
+ if (configs == nullptr) {
|
||||
+ FATAL("[update] no valid configs found");
|
||||
return;
|
||||
}
|
||||
|
||||
- // 从ringbuf->index开始,倒序处理cnt个DataBuf,同时校验PmuData的ts;
|
||||
+ static bool processing = false;
|
||||
+ if (processing) {
|
||||
+ DEBUG("[update] last processing is not finished, skip");
|
||||
+ return;
|
||||
+ }
|
||||
+ processing = true;
|
||||
+
|
||||
+ int64_t start_ts = get_current_timestamp();
|
||||
uint64_t total_samples = 0;
|
||||
- for (int i = 0; i < (int)cnt; i++) {
|
||||
- int index = (ringbuf->buf_len + ringbuf->index - i) % ringbuf->buf_len;
|
||||
- process_pmudata((struct PmuData *)(ringbuf->buf[index].data), ringbuf->buf[index].len);
|
||||
- total_samples += (uint64_t)ringbuf->buf[index].len;
|
||||
+ for (unsigned long long i = 0; i < dataList.len; i++) {
|
||||
+ PmuSamplingData *data = (PmuSamplingData *)(dataList.data[i]);
|
||||
+
|
||||
+ // 复制一份采样数据到插件公共内存中,防止数据被覆盖,
|
||||
+ // 如果内存不足,则重新申请内存
|
||||
+ if (processingArea == nullptr ||
|
||||
+ processingAreaSize < sizeof(PmuData) * data->len) {
|
||||
+ if (processingArea != nullptr) {
|
||||
+ free(processingArea);
|
||||
+ }
|
||||
+ processingArea = malloc(sizeof(PmuData) * data->len);
|
||||
+ if (processingArea == nullptr) {
|
||||
+ processingAreaSize = 0;
|
||||
+ continue;
|
||||
+ }
|
||||
+ processingAreaSize = sizeof(PmuData) * data->len;
|
||||
+ }
|
||||
+ auto ret = memcpy_s(
|
||||
+ processingArea, processingAreaSize, data->pmuData, sizeof(PmuData) * data->len);
|
||||
+ if (ret != EOK) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ process_pmudata((PmuData *)processingArea, data->len);
|
||||
+ total_samples += data->len;
|
||||
}
|
||||
records.processed_samples += total_samples;
|
||||
|
||||
int64_t end_ts = get_current_timestamp();
|
||||
- DEBUG("[run] processing pmudata cost: " << (end_ts - start_ts) << " ms, "
|
||||
+ DEBUG("[update] processing pmudata cost: " << (end_ts - start_ts) << " ms, "
|
||||
<< "current: " << total_samples << " samples, "
|
||||
<< "total: " << records.processed_samples << " samples");
|
||||
+ processing = false;
|
||||
}
|
||||
|
||||
-const char *sysboost_get_version()
|
||||
+/// @brief 使能调优插件实例
|
||||
+/// @param param 预留参数
|
||||
+/// @return
|
||||
+oeaware::Result SysboostTuner::Enable(const std::string ¶m)
|
||||
{
|
||||
- return "v1.0";
|
||||
-}
|
||||
-
|
||||
-const char *sysboost_get_name()
|
||||
-{
|
||||
- return TUNER_INSTANCE_NAME;
|
||||
-}
|
||||
-
|
||||
-const char *sysboost_get_description()
|
||||
-{
|
||||
- return "dfot tuner: sysboost";
|
||||
-}
|
||||
-
|
||||
-const char *sysboost_get_dep()
|
||||
-{
|
||||
- // 本插件启动时,不依赖采样插件,兼容使用预置profile的场景
|
||||
- // 本插件启动后,增加对PMU_CYCLES_SAMPLING的依赖,方便获取ringbuf数据
|
||||
- // configs非空即表示插件已启动
|
||||
- return configs != nullptr ? PMU_CYCLES_SAMPLING : nullptr;
|
||||
-}
|
||||
-
|
||||
-int sysboost_get_priority()
|
||||
-{
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-int sysboost_get_type()
|
||||
-{
|
||||
- return -1;
|
||||
-}
|
||||
-
|
||||
-// 每隔多少ms执行一次run
|
||||
-int sysboost_get_period()
|
||||
-{
|
||||
- return configs != nullptr ? configs->tuner_check_period : 1000;
|
||||
-}
|
||||
-
|
||||
-bool sysboost_enable()
|
||||
-{
|
||||
- logger.init();
|
||||
+ (void)param;
|
||||
+
|
||||
+ dfot_logger.init();
|
||||
|
||||
if (configs == nullptr &&
|
||||
parse_dfot_ini(DEFAULT_DFOT_CONFIG_PATH) != DFOT_OK) {
|
||||
ERROR("[enable] instance [" << TUNER_INSTANCE_NAME << "] init configs failed");
|
||||
- return false;
|
||||
+ return oeaware::Result(FAILED);
|
||||
}
|
||||
|
||||
if (!check_configs_valid()) {
|
||||
ERROR("[enable] invalid configs");
|
||||
- return false;
|
||||
+ return oeaware::Result(FAILED);
|
||||
}
|
||||
|
||||
if (!check_dependence_ready()) {
|
||||
ERROR("[enable] dependencies are not ready");
|
||||
- return false;
|
||||
+ return oeaware::Result(FAILED);
|
||||
}
|
||||
|
||||
reset_records();
|
||||
|
||||
+ if (Subscribe(depTopic).code != OK) {
|
||||
+ ERROR("[enable] subscribe dep topic error");
|
||||
+ return oeaware::Result(FAILED);
|
||||
+ }
|
||||
+
|
||||
INFO("[enable] plugin instance [" << TUNER_INSTANCE_NAME << "] enabled");
|
||||
- return true;
|
||||
+ return oeaware::Result(OK);
|
||||
}
|
||||
|
||||
-void sysboost_disable()
|
||||
+/// @brief 禁用调优插件实例
|
||||
+void SysboostTuner::Disable()
|
||||
{
|
||||
+ if (Unsubscribe(depTopic).code != OK) {
|
||||
+ ERROR("[disable] unsubscribe dep topic error");
|
||||
+ }
|
||||
+
|
||||
for (auto it = configs->apps.begin(); it != configs->apps.end(); ++it) {
|
||||
AppConfig *app = *it;
|
||||
if (app->status != OPTIMIZED) {
|
||||
@@ -167,20 +167,14 @@ void sysboost_disable()
|
||||
}
|
||||
|
||||
cleanup_configs();
|
||||
- INFO("[disable] plugin " << TUNER_INSTANCE_NAME << " disabled");
|
||||
+ INFO("[disable] instance [" << TUNER_INSTANCE_NAME << "] disabled");
|
||||
}
|
||||
|
||||
-const struct DataRingBuf *sysboost_get_ring_buf()
|
||||
+/// @brief 调优插件主逻辑
|
||||
+void SysboostTuner::Run()
|
||||
{
|
||||
- // 调优插件不需要向其他插件提供数据
|
||||
- return nullptr;
|
||||
-}
|
||||
-
|
||||
-void sysboost_run(const struct Param *param)
|
||||
-{
|
||||
- // 1. 刷新采样数据
|
||||
- // 2. 检查优化条件
|
||||
- // 3. 获取profile,实施优化
|
||||
+ // 1. 检查优化条件
|
||||
+ // 2. 获取profile,实施优化
|
||||
static bool optimizing = false;
|
||||
|
||||
if (configs == nullptr) {
|
||||
@@ -196,9 +190,6 @@ void sysboost_run(const struct Param *param)
|
||||
|
||||
optimizing = true;
|
||||
|
||||
- // step1: 刷新采样数据
|
||||
- get_sampling_data_from_collector(param);
|
||||
-
|
||||
for (auto it = configs->apps.begin(); it != configs->apps.end(); ++it) {
|
||||
AppConfig *app = *it;
|
||||
// step2: 检查应用是否满足优化条件
|
||||
@@ -217,17 +208,3 @@ void sysboost_run(const struct Param *param)
|
||||
|
||||
optimizing = false;
|
||||
}
|
||||
-
|
||||
-struct Interface sysboost_tuner = {
|
||||
- .get_version = sysboost_get_version,
|
||||
- .get_name = sysboost_get_name,
|
||||
- .get_description = sysboost_get_description,
|
||||
- .get_dep = sysboost_get_dep,
|
||||
- .get_priority = sysboost_get_priority,
|
||||
- .get_type = sysboost_get_type,
|
||||
- .get_period = sysboost_get_period,
|
||||
- .enable = sysboost_enable,
|
||||
- .disable = sysboost_disable,
|
||||
- .get_ring_buf = sysboost_get_ring_buf,
|
||||
- .run = sysboost_run,
|
||||
-};
|
||||
\ No newline at end of file
|
||||
diff --git a/src/startup_opt.cc b/src/startup_opt.cc
|
||||
index 5b2ad9c..5abb16f 100644
|
||||
--- a/src/startup_opt.cc
|
||||
+++ b/src/startup_opt.cc
|
||||
@@ -7,13 +7,11 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
-#include "boost/filesystem.hpp"
|
||||
+#include <boost/filesystem.hpp>
|
||||
|
||||
-#include "libkperf/pmu.h"
|
||||
-#include "libkperf/symbol.h"
|
||||
+#include <libkperf/pmu.h>
|
||||
+#include <libkperf/symbol.h>
|
||||
|
||||
-// D-FOT
|
||||
-#include "interface.h"
|
||||
#include "utils.h"
|
||||
#include "configs.h"
|
||||
#include "records.h"
|
||||
@@ -159,7 +157,7 @@ int dump_app_addrs_to_file(AppConfig *app)
|
||||
return DFOT_ERROR;
|
||||
}
|
||||
|
||||
- // 当前仅处理PMU_CYCLES_SAMPLING数据,性能事件固定为cycles
|
||||
+ // 当前仅处理pmu_sampling_collector数据,性能事件固定为cycles
|
||||
fprintf(fp, "cycles\n");
|
||||
for (auto it = app->profile.addrs.begin(); it != app->profile.addrs.end(); ++it) {
|
||||
fprintf(fp, "%lx %d\n", it->first, it->second.count);
|
||||
@@ -265,7 +263,7 @@ void dump_app_profile_to_file(AppConfig *app)
|
||||
ERROR("[run] fopen " << app->collected_profile << " error");
|
||||
return;
|
||||
}
|
||||
- // 当前仅处理PMU_CYCLES_SAMPLING数据,性能事件固定为cycles
|
||||
+ // 当前仅处理pmu_sampling_collector数据,性能事件固定为cycles
|
||||
fprintf(fp, "no_lbr cycles:\n");
|
||||
for (auto it1 = app->profile.funcs.begin(); it1 != app->profile.funcs.end(); ++it1) {
|
||||
for (auto it2 = it1->second.begin(); it2 != it1->second.end(); ++it2) {
|
||||
@@ -411,7 +409,7 @@ void process_pmudata(struct PmuData *data, int len)
|
||||
}
|
||||
|
||||
for (AppConfig* app : updated_apps) {
|
||||
- DEBUG("[run] collected addrs for [" << app->app_name
|
||||
+ DEBUG("[update] collected addrs for [" << app->app_name
|
||||
<< ": " << app->instances.size() - 1 << "]: "
|
||||
<< app->profile.addrs.size());
|
||||
|
||||
--
|
||||
2.39.5 (Apple Git-154)
|
||||
|
||||
80
0003-adapt-include-dir-for-oeaware.patch
Normal file
80
0003-adapt-include-dir-for-oeaware.patch
Normal file
@ -0,0 +1,80 @@
|
||||
From 80257a974c20bb8c966e310aedb2aff3faaed94f Mon Sep 17 00:00:00 2001
|
||||
From: rfwang07 <wangrufeng5@huawei.com>
|
||||
Date: Sat, 7 Dec 2024 14:48:47 +0800
|
||||
Subject: [PATCH] adapt include dir for oeaware
|
||||
|
||||
---
|
||||
CMakeLists.txt | 4 ----
|
||||
include/tuner.h | 4 ++--
|
||||
src/oeaware_plugins/instance.cc | 2 +-
|
||||
src/oeaware_plugins/tuner_sysboost.cc | 7 ++++---
|
||||
4 files changed, 7 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index dda676e..0dd5c51 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -32,10 +32,6 @@ add_library(dfot SHARED ${dfot_tuner_sysboost_src})
|
||||
|
||||
include_directories(dfot PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
- # 因为oeAware头文件问题,此处临时适配
|
||||
- /usr/include/libkperf
|
||||
- /usr/include/oeaware
|
||||
- /usr/include/oeaware/interface
|
||||
)
|
||||
|
||||
target_link_libraries(dfot boundscheck kperf sym dl log4cplus boost_system boost_filesystem)
|
||||
diff --git a/include/tuner.h b/include/tuner.h
|
||||
index 46db4f7..b72cc3c 100644
|
||||
--- a/include/tuner.h
|
||||
+++ b/include/tuner.h
|
||||
@@ -13,8 +13,8 @@
|
||||
#define __TUNER_H__
|
||||
|
||||
#include <oeaware/data_list.h>
|
||||
-#include <oeaware/interface/topic.h>
|
||||
-#include <oeaware/interface/interface.h>
|
||||
+#include <oeaware/topic.h>
|
||||
+#include <oeaware/interface.h>
|
||||
|
||||
class SysboostTuner : public oeaware::Interface {
|
||||
public:
|
||||
diff --git a/src/oeaware_plugins/instance.cc b/src/oeaware_plugins/instance.cc
|
||||
index b51c987..767b1aa 100644
|
||||
--- a/src/oeaware_plugins/instance.cc
|
||||
+++ b/src/oeaware_plugins/instance.cc
|
||||
@@ -1,4 +1,4 @@
|
||||
-#include <oeaware/interface/interface.h>
|
||||
+#include <oeaware/interface.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "tuner.h"
|
||||
diff --git a/src/oeaware_plugins/tuner_sysboost.cc b/src/oeaware_plugins/tuner_sysboost.cc
|
||||
index cfab1fc..0c99a5a 100644
|
||||
--- a/src/oeaware_plugins/tuner_sysboost.cc
|
||||
+++ b/src/oeaware_plugins/tuner_sysboost.cc
|
||||
@@ -1,8 +1,9 @@
|
||||
#include <cstring>
|
||||
#include <securec.h>
|
||||
|
||||
-#include <oeaware/interface/interface.h>
|
||||
-#include <oeaware/pmu_sampling_data.h>
|
||||
+#include <oeaware/interface.h>
|
||||
+#include <oeaware/data_list.h>
|
||||
+#include <oeaware/data/pmu_sampling_data.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "utils.h"
|
||||
@@ -15,7 +16,7 @@
|
||||
// 当前优化插件需要的采样数据来源于oeaware-manager采样实例pmu_sampling_collector
|
||||
// 本插件通过订阅获取pmu_sampling_collector的采样数据,也可以预置profile来优化
|
||||
// 注意如果oeaware-manager仓库对应采样实例名字有变化时,此处也要同步修改
|
||||
-#define DEP_INSTANCE_NAME "pmu_sampling_collector"
|
||||
+#define DEP_INSTANCE_NAME OE_PMU_SAMPLING_COLLECTOR
|
||||
// 订阅性能事件
|
||||
#define DEP_TOPIC_NAME "cycles"
|
||||
// sysboost优化插件实例名
|
||||
--
|
||||
2.39.5 (Apple Git-154)
|
||||
|
||||
41
D-FOT.spec
41
D-FOT.spec
@ -1,49 +1,31 @@
|
||||
Name: D-FOT
|
||||
Version: v1.0.1
|
||||
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
|
||||
|
||||
BuildRequires: cmake make gcc-c++ boost-devel log4cplus-devel numactl-devel
|
||||
BuildRequires: git
|
||||
Patch1: 0001-update-libkperf-dependence.patch
|
||||
Patch2: 0002-adapt-the-code-for-oeaware-2.0.patch
|
||||
Patch3: 0003-adapt-include-dir-for-oeaware.patch
|
||||
|
||||
Requires: oeAware-manager llvm-bolt
|
||||
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
|
||||
|
||||
ExclusiveArch: aarch64
|
||||
|
||||
%global libkperf_name libkperf
|
||||
%global libkperf_tagver v1.2.1
|
||||
%global libkperf_source https://gitee.com/openeuler/libkperf.git
|
||||
|
||||
%description
|
||||
%{name} is a dynamic feedback-directed optimization tool for openEuler.
|
||||
|
||||
%prep
|
||||
%autosetup -n %{name}-%{version}
|
||||
mkdir thirdparty && cd thirdparty
|
||||
git clone --recurse-submodules %{libkperf_source}
|
||||
cd %{libkperf_name}
|
||||
git checkout %{libkperf_tagver}
|
||||
cd ..
|
||||
mv %{libkperf_name} %{libkperf_name}-%{libkperf_tagver}
|
||||
cd ..
|
||||
%autosetup -n %{name}-%{version} -p1
|
||||
|
||||
%build
|
||||
# build libkperf.so
|
||||
cd thirdparty/%{libkperf_name}-%{libkperf_tagver}
|
||||
sh build.sh
|
||||
cd ../../
|
||||
|
||||
# build libdfot.so
|
||||
mkdir build && cd build
|
||||
cmake .. \
|
||||
-DLIB_KPERF_LIBPATH=%{_builddir}/%{name}-%{version}/thirdparty/%{libkperf_name}-%{libkperf_tagver}/output/lib \
|
||||
-DLIB_KPERF_INCPATH=%{_builddir}/%{name}-%{version}/thirdparty/%{libkperf_name}-%{libkperf_tagver}/output/include \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DCMAKE_SKIP_RPATH=TRUE
|
||||
%{cmake} .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_SKIP_RPATH=TRUE
|
||||
make
|
||||
|
||||
%install
|
||||
@ -58,6 +40,11 @@ install -D -m 0640 ./configs/dfot.ini ${RPM_BUILD_ROOT}/etc/dfot/
|
||||
%attr(0440,root,root) %{_libdir}/oeAware-plugin/libdfot.so
|
||||
|
||||
%changelog
|
||||
* Tue Dec 3 2024 rfwang07 <wangrufeng5@huawei.com> - v1.0.1-2
|
||||
- ID:NA
|
||||
- SUG:NA
|
||||
- DESC: update libkperf dependence and adapt code for oeaware 2.0
|
||||
|
||||
* Wed Nov 27 2024 rfwang07 <wangrufeng5@huawei.com> - v1.0.1-1
|
||||
- ID:NA
|
||||
- SUG:NA
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user