日志系统——性能测试

日志系统项目已经编写完成,在本节完成性能测试之后就正式结束了

 测试代码如下

#include "../logs/mjwlog.h"
#include <vector>
#include <thread>


//参数:日志器名称,线程数量,输出日志条数,单条日志大小
void perform(const std::string& loggername,const size_t thread_count,const size_t msg_count,const size_t msg_size)
{
    //1. 获取日志器
    mjwlog::Logger::ptr logger = mjwlog::LoggerManage::GetInstance().GetLogger(loggername);
    if(logger.get()==nullptr) return;
    //2. 创建日志信息
    std::string msg(msg_size,'#');
    //3. 创建多线程
    std::vector<double> cost_time;
    std::vector<std::thread> threads;
    size_t singal_thread_ologs=msg_count/thread_count;//单个线程需要输出的日志条数
    std::cout<<"总输出日志条数:"<<msg_count<<"条"<<" 输出日志总大小:"<<(msg_count*msg_size)/(1024*1024)<<" MB"<<std::endl;
    for(int i=0;i<thread_count;i++)
    {
        threads.emplace_back([&,i,singal_thread_ologs](){
            //4. 开始时间
            auto start=std::chrono::high_resolution_clock::now();
            //5. 开始输出
            for(int j=0;j<singal_thread_ologs;j++)
            {
                logger->fatal("%s",msg.c_str());
                //std::cout<<"输出"<<std::endl;
            }
            //6. 结束时间
            auto end=std::chrono::high_resolution_clock::now();
            //记录结果
            std::chrono::duration<double> result=end-start;
            cost_time.push_back(result.count());
            //输出该线程测试信息
            std::cout<<"线程"<<i<<" 输出日志数量:"<<singal_thread_ologs<<" 耗时: " << result.count() << "s\n";
        });
    }
    //回收线程
    for(int i=0;i<thread_count;i++)
    {
        threads[i].join();
    }
    //7.计算总耗时
    //多线程输出时,由于多个线程并非执行,因此计算总耗时并不是所有线程所消耗时间相加
    //而是取最大耗时
    double max_cost_time=cost_time[0];
    for(int i=0;i<thread_count;i++)
    {
        max_cost_time=max_cost_time<cost_time[i]?cost_time[i]:max_cost_time;
    }
    std::cout<<max_cost_time<<std::endl;
    size_t msg_pre_sec=msg_count/max_cost_time;//每秒打印日志条数
    size_t size_pre_sec=(msg_count*msg_size)/(max_cost_time*1024*1024);//每秒输出大小,单位MB
    
    //8. 输出结果

    std::cout<<"总耗时:"<<max_cost_time<<"s"<<std::endl;
    std::cout<<"每秒输出日志条数:"<<msg_pre_sec<<std::endl;
    std::cout<<"每秒输出大小:"<<size_pre_sec<<" MB"<<std::endl;
}

//同步日志器性能测试
void sync_perform()
{
    std::unique_ptr<mjwlog::LoggerBuild> lb(new mjwlog::GlobalLoggerBuild());
    lb->BuildDefaultLevel(mjwlog::LogLevel::level::WARN);
    lb->BuildFormat("%m%n");
    lb->BuildLoggerName("sync_logger");
    lb->BuildSink<mjwlog::FileSink>("./logfile/sync_logger.log");    
    lb->BuildLoggerType(mjwlog::type::SyncLogger);
    lb->build();
    //单线程
    //perform("sync_logger",1,1000000,100);
    //多线程
    perform("sync_logger",5,1000000,100);

}

//异步日志器性能测试
void async_perform()
{
    std::unique_ptr<mjwlog::LoggerBuild> lb(new mjwlog::GlobalLoggerBuild());
    lb->BuildDefaultLevel(mjwlog::LogLevel::level::WARN);
    lb->BuildFormat("%m%n");
    lb->BuildLoggerName("async_logger");
    lb->BuildSink<mjwlog::FileSink>("./logfile/async_logger.log");    
    lb->BuildLoggerType(mjwlog::type::AsyncLogger);
    lb->BuileUnsafeBuffer();//开启不安全测试模式
    lb->build();
    
    //单线程
    //perform("async_logger",1,1000000,100);
    //多线程
    perform("async_logger",5,1000000,100);
}


int main()
{
    async_perform();
    return 0;
}

主要测试要素:同步/异步 & 单线程/多线程

1. 输出100w+条指定长度日志所需时间

2. 每秒可以输出多少条日志

3. 每秒可以输出多少大小的日志(MB)

测试环境

腾讯云服务器

CPU:2核

内存:2G

硬盘:SSD运营盘 40G

系统:CentOS 7.6 64bit

 同步日志下单线程

 同步日志下多线程

异步日志下单线程

 异步日志下多线程

 从上面的实验数据我们发现,在单线程的情况下异步日志器还没有同步日志器效率高,这是因为现在的I/O操作在用户态都会有缓冲区进行缓冲,因此我们当前测试用例看起来的同步实际上也是在操作内存,只有在缓冲区满了才会涉及到阻塞磁盘写入,而我们异步日志器效率比较低是因为单线程异步日志器中也存在大量的锁冲突,而同步日志器则没有,因此性能异步日志器性能有一定程度上的降低

 当我们切入到多线程后,发现同步日志器性能不但没有提升而且还下降了,而异步日志器性能则有有效的提升,这是因为同步日志器要将日志亲自写入到磁盘中,因此其性能上限收到磁盘读写速度的限制,即使多线程也难以提升,反而因为锁冲突导致性能下降;而异步日志器上限则是CPU的处理性能,日志输出时不会因为落地而阻塞,因此多线程下有了显著提升。

当然这是在云服务器的渣机下的实验数据,如果在各位自己的电脑上实验相信能够更上一层楼。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主机安全等级保护测试流程通常根据《信息系统安全等级保护基本要求框架》和《信息安全技术 网络安全等级保护测评要求》进行。首先,测试人员会进行现场测评,覆盖到被测系统安全技术的各个层面和安全管理的不同方面。在主机安全方面,测试人员会对主机的安全性能和安全保护措施进行评估。 主机安全等级保护测试流程包括以下几个步骤: 1. 收集信息:测试人员会收集与主机安全相关的信息,包括主机的配置、安全策略、安全控制措施等。这些信息可以通过检查文档、访谈相关人员等方式获取。 2. 风险分析:测试人员会对主机存在的潜在风险进行分析,包括可能的漏洞、安全隐患和威胁。通过分析风险,可以确定主机安全保护的重点和优先级。 3. 测试准备:根据测试计划,测试人员会准备测试环境、测试工具和测试数据。测试环境应符合主机的实际运行环境,测试工具可以包括漏洞扫描工具、安全配置检查工具等。 4. 测试执行:测试人员会根据测试计划执行各项测试任务。主机安全测试可以包括对主机的身份认证、访问控制、日志记录、漏洞扫描等方面的测试。 5. 结果分析:测试人员会对测试结果进行分析,评估主机的安全性能和安全保护措施的有效性。通过分析结果,可以了解主机存在的安全问题,并提出相应的改进建议。 6. 测评报告:最后,测试人员会编写测评报告,总结主机安全等级保护测试的结果和发现的问题。报告中会包括对主机安全现状的评价和对应的等级保护要求之间的差距,并分析这些差距导致的风险。 总之,主机安全等级保护测试流程主要包括信息收集、风险分析、测试准备、测试执行、结果分析和测评报告等步骤,通过这些步骤可以对主机的安全性能进行评估,并提出相应的改进建议。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [网络安全等级保护.pptx](https://download.csdn.net/download/qq_43934844/87886344)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [等保系列之——网络安全等级保护测评:工作流程及工作内容](https://blog.csdn.net/xinzhouqifu6/article/details/120700883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值