性能优化
优化 AuroraCore 组件性能的综合指南,包括 Logger 和 FileWatcher 的最佳实践。
🚀 Logger 性能优化
缓冲区管理
调整缓冲区大小
cpp
// 为高频日志设置更大的缓冲区
LoggerConfig config;
config.buffer_size = 1024 * 1024; // 1MB 缓冲区
config.flush_interval = 5000; // 5秒刷新间隔
Logger logger(config);
批量写入优化
cpp
// 使用批量日志记录
std::vector<std::string> logs;
logs.reserve(1000); // 预分配空间
// 收集日志
for (int i = 0; i < 1000; ++i) {
logs.push_back("Log message " + std::to_string(i));
}
// 批量写入
logger.log_batch(logs);
守护进程模式性能
启用高性能模式
cpp
// 配置高性能守护进程
LoggerDaemonConfig daemon_config;
daemon_config.thread_pool_size = 4; // 多线程处理
daemon_config.queue_size = 10000; // 大队列
daemon_config.batch_size = 100; // 批处理大小
daemon_config.compression_enabled = true; // 启用压缩
LoggerDaemon daemon(daemon_config);
内存映射文件
cpp
// 使用内存映射提高 I/O 性能
LoggerConfig config;
config.use_mmap = true;
config.mmap_size = 64 * 1024 * 1024; // 64MB 映射
config.sync_interval = 10000; // 10秒同步
Logger logger(config);
日志级别优化
cpp
// 运行时动态调整日志级别
if (performance_critical_section) {
logger.set_level(LogLevel::ERROR); // 仅记录错误
} else {
logger.set_level(LogLevel::INFO); // 正常详细度
}
// 使用条件日志记录
if (logger.is_enabled(LogLevel::DEBUG)) {
logger.debug("Expensive debug info: " + expensive_operation());
}
📁 FileWatcher 性能优化
inotify 限制调整
系统级别优化
bash
# 增加 inotify 限制
echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches
echo 8192 | sudo tee /proc/sys/fs/inotify/max_user_instances
# 永久设置
echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf
echo "fs.inotify.max_user_instances=8192" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
应用级别检查
cpp
// 检查 inotify 限制
FileWatcherConfig config;
if (config.check_inotify_limits()) {
std::cout << "inotify 限制足够" << std::endl;
} else {
std::cerr << "警告:inotify 限制可能不足" << std::endl;
}
高效监视管理
选择性监视
cpp
// 仅监视必要的事件类型
FileWatcherConfig config;
config.events = FileEvent::CREATED | FileEvent::MODIFIED;
// 排除 ACCESSED 事件以减少噪音
// 使用文件过滤器
config.file_filter = [](const std::string& path) {
return path.ends_with(".log") || path.ends_with(".txt");
};
FileWatcher watcher(config);
目录层次优化
cpp
// 避免深层递归监视
FileWatcherConfig config;
config.recursive = true;
config.max_depth = 3; // 限制递归深度
config.exclude_patterns = {
"*/\.git/*", // 排除 git 目录
"*/node_modules/*", // 排除 node_modules
"*/\.cache/*" // 排除缓存目录
};
FileWatcher watcher("/project/root", config);
回调函数优化
异步处理
cpp
// 使用线程池处理事件
class AsyncFileHandler {
private:
std::thread_pool pool{4};
public:
void handle_event(const FileEvent& event) {
// 快速返回,异步处理
pool.submit([event]() {
// 耗时的文件处理逻辑
process_file_change(event);
});
}
};
AsyncFileHandler handler;
watcher.set_callback([&handler](const FileEvent& event) {
handler.handle_event(event);
});
事件去重
cpp
// 实现事件去重机制
class DeduplicatingHandler {
private:
std::unordered_map<std::string, std::chrono::steady_clock::time_point> last_events;
std::chrono::milliseconds debounce_time{100};
public:
bool should_process(const FileEvent& event) {
auto now = std::chrono::steady_clock::now();
auto& last_time = last_events[event.path];
if (now - last_time > debounce_time) {
last_time = now;
return true;
}
return false;
}
};
⚙️ 系统级优化
CPU 亲和性设置
cpp
// 设置线程 CPU 亲和性
#include <pthread.h>
#include <sched.h>
void set_thread_affinity(std::thread& t, int cpu_id) {
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);
pthread_setaffinity_np(t.native_handle(), sizeof(cpu_set_t), &cpuset);
}
// 为 Logger 守护进程设置专用 CPU
std::thread logger_thread([]() {
LoggerDaemon daemon;
daemon.run();
});
set_thread_affinity(logger_thread, 2); // 使用 CPU 2
I/O 调度优化
bash
# 设置 I/O 调度器为 deadline(适合日志写入)
echo deadline | sudo tee /sys/block/sda/queue/scheduler
# 调整 I/O 优先级
ionice -c 1 -n 4 ./AuroraCore_logger_daemon
内存管理
内存池使用
cpp
// 使用内存池减少分配开销
class MemoryPool {
private:
std::vector<std::unique_ptr<char[]>> blocks;
std::stack<char*> free_blocks;
size_t block_size;
public:
MemoryPool(size_t block_size, size_t initial_blocks)
: block_size(block_size) {
for (size_t i = 0; i < initial_blocks; ++i) {
auto block = std::make_unique<char[]>(block_size);
free_blocks.push(block.get());
blocks.push_back(std::move(block));
}
}
char* allocate() {
if (free_blocks.empty()) {
auto block = std::make_unique<char[]>(block_size);
char* ptr = block.get();
blocks.push_back(std::move(block));
return ptr;
}
char* ptr = free_blocks.top();
free_blocks.pop();
return ptr;
}
void deallocate(char* ptr) {
free_blocks.push(ptr);
}
};
// 在 Logger 中使用内存池
static MemoryPool log_pool(1024, 100);
大页内存
bash
# 启用大页内存
echo 1024 | sudo tee /proc/sys/vm/nr_hugepages
# 在应用中使用大页
mmap(nullptr, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
📊 性能监控
内置性能指标
cpp
// Logger 性能统计
LoggerStats stats = logger.get_stats();
std::cout << "日志写入速率: " << stats.logs_per_second << " logs/s" << std::endl;
std::cout << "平均延迟: " << stats.average_latency_ms << " ms" << std::endl;
std::cout << "缓冲区使用率: " << stats.buffer_usage_percent << "%" << std::endl;
// FileWatcher 性能统计
FileWatcherStats fw_stats = watcher.get_stats();
std::cout << "事件处理速率: " << fw_stats.events_per_second << " events/s" << std::endl;
std::cout << "监视的文件数: " << fw_stats.watched_files_count << std::endl;
std::cout << "队列深度: " << fw_stats.queue_depth << std::endl;
系统监控
bash
# 监控 CPU 使用率
top -p $(pgrep AuroraCore)
# 监控内存使用
ps -o pid,vsz,rss,comm -p $(pgrep AuroraCore)
# 监控 I/O 统计
iostat -x 1
# 监控 inotify 使用
find /proc/*/fd -lname anon_inode:inotify 2>/dev/null | wc -l
性能分析工具
bash
# 使用 perf 进行性能分析
perf record -g ./AuroraCore_app
perf report
# 使用 valgrind 检查内存性能
valgrind --tool=callgrind ./AuroraCore_app
kcachegrind callgrind.out.*
# 使用 strace 分析系统调用
strace -c -p $(pgrep AuroraCore)
🔧 故障排除
常见性能问题
高 CPU 使用率
cpp
// 检查回调函数效率
auto start = std::chrono::high_resolution_clock::now();
callback_function(event);
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
if (duration.count() > 1000) { // 超过 1ms
std::cerr << "警告:回调函数执行时间过长: " << duration.count() << "μs" << std::endl;
}
内存泄漏
cpp
// 定期检查内存使用
class MemoryMonitor {
private:
size_t baseline_memory;
public:
MemoryMonitor() : baseline_memory(get_memory_usage()) {}
void check_memory_growth() {
size_t current = get_memory_usage();
if (current > baseline_memory * 1.5) { // 增长超过 50%
std::cerr << "警告:内存使用量异常增长" << std::endl;
}
}
private:
size_t get_memory_usage() {
std::ifstream status("/proc/self/status");
std::string line;
while (std::getline(status, line)) {
if (line.starts_with("VmRSS:")) {
return std::stoul(line.substr(6));
}
}
return 0;
}
};
磁盘 I/O 瓶颈
bash
# 检查磁盘 I/O 等待
iostat -x 1 | grep -E "(Device|sda|await)"
# 如果 await 时间过高,考虑:
# 1. 使用 SSD 存储
# 2. 增加缓冲区大小
# 3. 减少同步频率
# 4. 使用异步 I/O
📈 性能基准测试
Logger 基准测试
cpp
// 日志写入性能测试
void benchmark_logger() {
Logger logger;
const int num_logs = 100000;
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < num_logs; ++i) {
logger.info("Benchmark log message " + std::to_string(i));
}
logger.flush(); // 确保所有日志都写入
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
double logs_per_second = (double)num_logs / duration.count() * 1000;
std::cout << "Logger 性能: " << logs_per_second << " logs/s" << std::endl;
}
FileWatcher 基准测试
cpp
// 文件监视性能测试
void benchmark_filewatcher() {
FileWatcher watcher("/tmp/test_dir");
std::atomic<int> event_count{0};
watcher.set_callback([&event_count](const FileEvent& event) {
event_count++;
});
watcher.start();
auto start = std::chrono::high_resolution_clock::now();
// 创建大量文件
const int num_files = 10000;
for (int i = 0; i < num_files; ++i) {
std::ofstream file("/tmp/test_dir/file_" + std::to_string(i) + ".txt");
file << "test content";
}
// 等待所有事件处理完成
std::this_thread::sleep_for(std::chrono::seconds(5));
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
double events_per_second = (double)event_count / duration.count() * 1000;
std::cout << "FileWatcher 性能: " << events_per_second << " events/s" << std::endl;
std::cout << "处理的事件数: " << event_count << "/" << num_files << std::endl;
}
📝 最佳实践总结
Logger 最佳实践
- 使用适当的缓冲区大小(1-4MB)
- 启用批量写入以减少系统调用
- 在性能关键路径中降低日志级别
- 使用异步日志记录避免阻塞主线程
- 定期轮转日志文件防止单个文件过大
- 使用压缩减少磁盘空间使用
FileWatcher 最佳实践
- 调整系统 inotify 限制
- 使用文件过滤器减少不必要的事件
- 限制递归监视深度
- 实现事件去重避免重复处理
- 使用异步回调处理
- 定期清理不再需要的监视器
系统级最佳实践
- 设置适当的线程优先级和 CPU 亲和性
- 使用高性能文件系统(如 ext4、XFS)
- 配置适当的 I/O 调度器
- 启用大页内存(如果适用)
- 监控系统资源使用情况
- 定期进行性能基准测试