日志系统——性能测试

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

 测试代码如下

#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的处理性能,日志输出时不会因为落地而阻塞,因此多线程下有了显著提升。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/107122.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+mybatis+pgsql多个数据源配置

一、配置文件 jdk环境&#xff1a;1.8 配置了双数据源springbootdruidpgsql&#xff0c;application.properties配置修改如下&#xff1a; #当前入库主数据库 spring.primary.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.primary.datasource.driver-class…

1.Flink源码编译

目录 1.环境版本 1.1 jdk 1.2.maven 1.3.node 1.4.scala 2.下载flink源码 3.编译源码 4.idea打开flink源码 5.运行wordcount 1.环境版本 软件地址 链接&#xff1a;https://pan.baidu.com/s/1ZxYydR8rBfpLCcIdaOzxVg 提取码&#xff1a;12xq 1.1 jdk 1.2 maven 1.…

基于Red Hat Enterprise Linux 7操作系统的PostgresSql15的备份恢复(实践笔记)

零、前言 本文是基于阿里云ECS服务器进行的实践操作&#xff0c;操作系统版本&#xff1a;Red Hat Enterprise Linux 7 PG数据库版本&#xff1a;PostgresSql 15 PG安装方式&#xff1a;yum 由于本人新接触pg数据&#xff0c;本次也是出于好奇&#xff0c;就对pg数据库的pg_du…

MTK6833_MT6833核心板_天玑700安卓5G核心板规格性能介绍

MTK6833安卓核心板采用台积电 7nm 制程的5G SoC&#xff0c;2*Cortex-A766*Cortex-A55架构&#xff0c;搭载Android12.0操作系统&#xff0c;主频最高达2.2GHz 。内置 5G 双载波聚合技术&#xff08;2CC&#xff09;及双 5G SIM 卡功能&#xff0c;实现优异的功耗表现及实时连网…

Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

一、前言 不同于之前的term。terms等结构化查询&#xff0c;全文搜索首先对查询词进行分析&#xff0c;然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据&#xff08;text类型&#xff09;,默认的数据形式是人类的自然语言&#xff0c;如对话内容、图书名…

VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

image.png 背景 前段时间我们想实现 Pulsar 消息的追踪流程&#xff0c;追踪实现的效果图如下&#xff1a; 实现其实比较简单&#xff0c;其中最重要的就是如何存储消息。 消息的读取我们是通过 Pulsar 自带的 BrokerInterceptor 实现的&#xff0c;对这个感兴趣的朋友后面会单…

用大白话来讲讲多线程的知识架构

感觉多线程的知识又多又杂&#xff0c;自从接触java&#xff0c;就在一遍一遍捋脉络和深入学习。现在将这次的学习成果展示如下。 什么是多线程&#xff1f; 操作系统运行一个程序&#xff0c;就是一个线程。同时运行多个程序&#xff0c;就是多线程。即在同一时间&#xff0…

python爬虫的js逆向入门到进阶教程文章分享汇总~持续更新

目录 一、内容介绍二 、专栏内容-持续更新1、JS逆向入门2、Js逆向进阶3、爬虫基础知识4、工具与安装5、漫星内容分享 三、星球使用四、b站up主视频推荐 一、内容介绍 二 、专栏内容-持续更新 1、JS逆向入门 2023-08-25》11.常见加密>xx音乐RSA加密 https://articles.zsxq.c…

项目进度管理(4-1)关键链法

1 关键链法产生的背景 关键链法&#xff08;Critical Chain Method&#xff0c;CCM&#xff09;起源于20世纪80年代&#xff0c;是由Eliyahu M. Goldratt在他的著作《关键链》&#xff08;"Critical Chain"&#xff09;中首次提出和阐述的。Eliyahu M. Goldratt是以…

玩转git第7章节,本地git的用户名和密码的修改

一 本地git的用户名和密码 1.1 本地用户名和密码修改 1.本地用户名修改 2.凭据管理 3.进行修改密码 1.2 代码提交操作

ChatGPT在医疗系统的应用探索动态

注意&#xff1a;本信息仅供参考&#xff0c;发布该内容旨在传递更多信息的目的&#xff0c;并不意味着赞同其观点或证实其说法。 生成式人工智能&#xff0c;如OpenAI开发的ChatGPT&#xff0c;被认为是可以颠覆医疗行业的工具。尽管该技术刚刚起步&#xff0c;但已有许多医…

接口测试总结分享(http与rpc)

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP&#xff08;H…

SpringCloud超详细教程

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

C语言(第三十二天)

1. 递归是什么&#xff1f; 递归是学习C语言函数绕不开的一个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 写一个史上最简单的C语言递归代码&#xff1a; #include <stdio.h>…

二、前端监控之方案调研

前端监控体系 一个完整的前端监控体系包括了日志采集、日志上报、日志存储、日志切分&计算、数据分析、告警等流程。 对于一名前端开发工程师来说&#xff0c;也就意味着工作不再局限于前端业务的开发工作&#xff0c;需要有Nginx服务运维能力、实时/离线分析能力、Node应…

常见的时序数据库

1.概念 时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签&#xff08;按照时间的顺序变化&#xff0c;即时间序列化&#xff09;的数据&#xff0c;带时间标签的数据也称为时间序列数据。 时间序列数据主要由电力行业、化工行业、气象行业、地理信息…

Redis通信协议

文章目录 Redis通信协议RESP协议数据类型 模拟Redis客户端 Redis通信协议 RESP协议 Redis是一个CS架构的软件&#xff0c;通信一般分为两步(不包含pipeline和PubSub)&#xff1a; 客户端(client)向服务端(server)发送一条命令。服务器解析并执行命令&#xff0c;返回响应结果…

远程调试环境配置

远程调试环境配置 前期准备ssh连接 前期准备 安装vscode中的两个扩展包php-debug和remote-ssh 然后安装与PHP版本对应的xdebug 访问xdebug的官方网页&#xff0c;复制自己的phpinfo源码到方框中&#xff0c;再点击Analyse ssh连接 输入&#xff0c;你想要远程连接的主机i…

Unity中的数学基础——贝塞尔曲线

一&#xff1a;前言 一条贝塞尔曲线是由一组定义的控制点P0到 Pn&#xff0c;n1为线性&#xff0c;n2为二次......第一个和最后一个控制点称为起点和终点&#xff0c;中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值&#xff08; Mathf.Lerp&#xff09…

分布式 - 服务器Nginx:一小时入门系列之TCP反向代理和负载均衡

文章目录 1. HTTP反向代理和TCP反向代理2. http 块和 stream 块3. TCP反向代理配置4. TCP 负载均衡 1. HTTP反向代理和TCP反向代理 Nginx可以作为HTTP反向代理和TCP反向代理。 HTTP反向代理是指Nginx作为Web服务器的代理服务器&#xff0c;接收客户端的HTTP请求&#xff0c;然…