光说不练假把式先发测试报告。
1. 启动 6 个业务容器
for (std::uint16_t i = 1; i < 6; ++i) {
const auto pService = new (std::nothrow) CPerfTestTimerService;
if (SDP::CDispatcherCenterDemon::Instance()->RegisterTask(pService, CPerfTestTimerService::EN_SERVICE_TYPE, i, true)) {
SDP_RUN_LOG_ERROR("performance timer service register failed");
return -1;
}
}
2. 业务容器已启动创建 1000 万个定时器,每秒触发一次
CPerfTestTimerService::CPerfTestTimerService()
: m_nCount(0)
, m_vecMsTimerHandler(100000000)
, m_reportTimer()
{
}
std::int32_t CPerfTestTimerService::OnInit() {
SDP_FWD_CALL(SDP::CPollServiceReactor::OnInit());
this->SetAffinity();
m_lastTime = std::chrono::steady_clock::now();
for (auto& timer : m_vecMsTimerHandler) {
timer.m_pTestTimerService = this;
this->SetTimer(&timer, 1, 1);
}
m_reportTimer.m_pTestTimerService = this;
this->SetTimer(&m_reportTimer, 1, 1);
return 0;
}
3. 定时任务到,本容器统计计数 + 1
void CPerfTestTimerService::OnTimeout() {
++m_nCount;
}
4. 容器另创建一个汇报定时器,每秒触发一次
m_reportTimer.m_pTestTimerService = this;
this->SetTimer(&m_reportTimer, 1, 1);
5. 汇报定时到:将统计数据发送到统计容器。支持对象发送
void CPerfTestTimerService::OnReportTimeout() {
DEMO::CTimerSumMsg timerSumMsg;
timerSumMsg.m_nStatistics = m_nCount;
this->SendMsg(timerSumMsg);
m_nCount = 0;
}
6. 另起唯一的统计软件,接收每个测试容器统计汇报,汇总
void CDemoStaticService::OnSdpMsg(const CTimerSumMsg& rTimerSumMsg) {
m_nTimerStatistics += rTimerSumMsg.m_nStatistics;
}
// 统计容器起每秒触发定时器,定时时间到,打印总统计值
void CDemoStaticService::OnTimeout([[maybe_unused]] CStaticTimerHandler* pTestTimerHandler) {
++m_nSeconds;
m_fTotalTimerStatistics += static_cast<double>(m_nTimerStatistics);
std::printf("timer msg sum:%u, ---avg timer msg sum:%0.2f\n",
m_nTimerStatistics, m_fTotalTimerStatistics / static_cast<double>(m_nSeconds));
m_nTimerStatistics = 0;
}
7. 性能相关说明
编辑看右面统计值,每个容器 CPU 占有率 10% 左右,内存占用了 12.5% 的物理内存,启用内存池,虚拟内存较大 3.9g