高性能日志系统 性能测试

news2024/9/20 0:46:48

百万并发压测

测试环境

  • 云服务器环境
    • 2核2G 2M Linux华为云服务器
    • Ubuntu系统
  • 本地电脑环境
    • 处理器:AMD Ryzen 7 4800H with Radeon Graphics2.90 GHz
    • 已安装的内存(RAM):16.0GB(15.4GB可用)
    • 系统类型:64位操作系统,基于x64的处理器

测试结果

  • 响应:耗时1.20599秒,高负载情况下实现百万并发
  • 吞吐量:每秒处理829365日志,处理数据量79M,实现高并发情况下的数据处理性能
  • 多线程并发:5个线程并行处理日志,充分利用CPU提高运行性能
当前日志器:root 未检测到日志格式,默认设置为[ %d{%H:%M:%S}%T%t%T[%p]%T[%c]%T%f:%l%T%m%n ]!
当前日志器:root 未检测到落地方向,默认设置为标准输出!
DEBUG 同步日志器: root创建成功...
[09:02:59][140191453075264][INFO][root][logger.cc:31] ************************************************
[09:02:59][140191453075264][INFO][root][logger.cc:32] 异步日志测试: 1 线程, 1000000 条日志
DEBUG异步日志器: async_bench_logger1创建成功...
线程数量: 1
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 1.31725 秒
每秒日志数量: 759204 条
每秒日志数据量: 72 MB
[09:03:01][140191453075264][INFO][root][logger.cc:44] ************************************************
[09:03:01][140191453075264][INFO][root][logger.cc:31] ************************************************
[09:03:01][140191453075264][INFO][root][logger.cc:32] 异步日志测试: 5 线程, 1000000 条日志
DEBUG异步日志器: async_bench_logger2创建成功...
线程数量: 5
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 0.860284 秒
每秒日志数量: 1170953 条
每秒日志数据量: 111 MB
[09:03:01][140191453075264][INFO][root][logger.cc:44] ************************************************
[09:03:01][140191453075264][INFO][root][logger.cc:10] ************************************************
[09:03:01][140191453075264][INFO][root][logger.cc:11] 同步日志测试: 1 线程, 1000000 条日志
DEBUG 同步日志器: sync_bench_logger1创建成功...
线程数量: 1
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 1.1581 秒
每秒日志数量: 863533 条
每秒日志数据量: 82 MB
[09:03:03][140191453075264][INFO][root][logger.cc:23] ************************************************
[09:03:03][140191453075264][INFO][root][logger.cc:10] ************************************************
[09:03:03][140191453075264][INFO][root][logger.cc:11] 同步日志测试: 5 线程, 1000000 条日志
DEBUG 同步日志器: sync_bench_logger2创建成功...
线程数量: 5
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 1.10798 秒
每秒日志数量: 902719 条
每秒日志数据量: 86 MB
[09:03:04][140191453075264][INFO][root][logger.cc:23] ************************************************
root@hcss-ecs-b4a9:/home/bitlog/bench# make
g++ -g -std=c++11 logger.cc -o logger -lpthread
root@hcss-ecs-b4a9:/home/bitlog/bench# ./logger
当前日志器:root 未检测到日志格式,默认设置为[ %d{%H:%M:%S}%T%t%T[%p]%T[%c]%T%f:%l%T%m%n ]!
当前日志器:root 未检测到落地方向,默认设置为标准输出!
DEBUG 同步日志器: root创建成功...
[09:04:32][140250054625088][INFO][root][logger.cc:10] ************************************************
[09:04:32][140250054625088][INFO][root][logger.cc:11] async日志测试: 1 线程, 1000000 条日志
DEBUG异步日志器: async_bench_logger1创建成功...
线程数量: 1
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 1.53762 秒
每秒日志数量: 650421 条
每秒日志数据量: 62 MB
[09:04:34][140250054625088][INFO][root][logger.cc:23] ************************************************
[09:04:34][140250054625088][INFO][root][logger.cc:10] ************************************************
[09:04:34][140250054625088][INFO][root][logger.cc:11] async日志测试: 5 线程, 1000000 条日志
DEBUG异步日志器: async_bench_logger2创建成功...
线程数量: 5
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 0.923734 秒
每秒日志数量: 1087104 条
每秒日志数据量: 103 MB
[09:04:35][140250054625088][INFO][root][logger.cc:23] ************************************************
[09:04:35][140250054625088][INFO][root][logger.cc:10] ************************************************
[09:04:35][140250054625088][INFO][root][logger.cc:11] sync日志测试: 1 线程, 1000000 条日志
DEBUG 同步日志器: sync_bench_logger3创建成功...
线程数量: 1
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 1.37098 秒
每秒日志数量: 729480 条
每秒日志数据量: 69 MB
[09:04:36][140250054625088][INFO][root][logger.cc:23] ************************************************
[09:04:36][140250054625088][INFO][root][logger.cc:10] ************************************************
[09:04:36][140250054625088][INFO][root][logger.cc:11] sync日志测试: 5 线程, 1000000 条日志
DEBUG 同步日志器: sync_bench_logger4创建成功...
线程数量: 5
日志总数量: 1000000
单条日志大小: 100 字节
总耗时: 1.20599 秒
每秒日志数量: 829365 条
每秒日志数据量: 79 MB
[09:04:37][140250054625088][INFO][root][logger.cc:23] ************************************************

容错测试

磁盘故障注入测试

  • 磁盘写满测试:通过不断的向磁盘中写入数据,直到磁盘满载,从而测试系统在无法写入日志文件如何运行,期望系统可以正确捕获异常,并正确处理日志文件的写入失败
  • 磁盘只读测试:日志文件目录挂载为只读,目的就是在无法写入日志的时候,是否可以识别出该情况【测试失败,后期更改】

 

#include "../logs/maglog.h"
#include <fstream>
#include <iostream>

void testDiskFull() {
    LOGI("开始磁盘写满测试");

    // 模拟磁盘写满
    std::ofstream ofs("/home/bitlog/test/fill_disk.txt", std::ios::binary);
    const size_t bufferSize = 1024 * 1024; // 1 MB
    char buffer[bufferSize] = {0};

    try {
        while (true) {
            ofs.write(buffer, bufferSize);
            if (ofs.fail()) {
                LOGE("磁盘已满或写入失败!");
                break;
            }
        }
    } catch (const std::exception &e) {
        LOGE("磁盘写满测试异常: %s", e.what());
    }

    LOGI("磁盘写满测试结束");
}

void testDiskReadOnly() {
    LOGI("开始磁盘只读测试");

    // 将目录挂载为只读
    std::string command = "sudo mount -o remount,ro /home/bitlog/log";
    if (system(command.c_str()) != 0) {
        LOGE("无法将磁盘目录挂载为只读");
    }

    LOGI("磁盘只读测试结束");
}

int main() {
    // 执行磁盘写满测试
    testDiskFull();

    // 执行磁盘只读测试
    testDiskReadOnly();

    return 0;
}

 网络故障测试

  • 网络延迟测试:模拟日志系统在网络波动时候的行为,经测试可以实现在高延迟网络条件下继续进行稳定的传输数据


#include"../logs/maglog.h"
#include <cstdlib>
#include <iostream>

void testNetworkDelay()
{
    LOGI("开始网络延迟测试");

    // 删除现有的 netem 规则,防止冲突
    std::string deleteCommand = "sudo tc qdisc del dev eth0 root";
    int deleteResult = system(deleteCommand.c_str());
    if (deleteResult == 0) {
        LOGI("成功删除现有的网络延迟规则");
    } else {
        LOGW("未找到现有的网络延迟规则,可能未设置或已被删除");
    }

    // 添加新的网络延迟规则
    std::string command = "sudo tc qdisc add dev eth0 root netem delay 100ms";
    int addResult = system(command.c_str());
    if (addResult == 0) {
        LOGI("成功引入100ms的网络延迟");
    } else {
        LOGE("无法引入网络延迟,命令执行失败");
    }

    // 打印当前的网络配置
    std::string showCommand = "sudo tc qdisc show dev eth0";
    LOGI("当前网络配置如下:");
    int showResult = system(showCommand.c_str());
    if (showResult != 0) {
        LOGE("无法显示当前的网络配置");
    }

    LOGI("网络延迟测试结束");
}

int main(){
    // 执行网络延迟测试
    testNetworkDelay();

    return 0;
}

资源限制测试

  • CPU压力测试:通过引入CPU高负载,测试系统在高CPU占用情况下的性能。希望看到系统是否能够继续高效地处理日志记录任务
  • 内存压力测试:通过模拟高内存占用,测试系统在内存资源有限时的表现。希望确认系统在内存压力下的稳定性和响应能力

 

 

#include "../logs/maglog.h"
#include <cstdlib>

void testCpuStress() {
    LOGI("开始CPU压力测试");

    // 模拟CPU高负载
    std::string command = "stress-ng --cpu 2 --timeout 60s";
    if (system(command.c_str()) != 0) {
        LOGE("CPU压力测试失败");
    }

    LOGI("CPU压力测试结束");
}

void testMemoryStress() {
    LOGI("开始内存压力测试");

    // 模拟内存压力
    std::string command = "stress-ng --vm 1 --vm-bytes 90% --timeout 60s";
    if (system(command.c_str()) != 0) {
        LOGE("内存压力测试失败");
    }

    LOGI("内存压力测试结束");
}

int main() {
    // 执行CPU压力测试
    testCpuStress();

    // 执行内存压力测试
    testMemoryStress();

    return 0;
}

 混合读写测试

实时读取写入测试,模拟高并发场景下的并发读写日志,测试日志的性能和稳定性

 

#include"../logs/maglog.h"
#include <fstream>
#include <thread>
#include <vector>
#include <mutex>
#include <chrono>
#include <string>
void writeLogs(int numMessages, int threadId) {
    for (int i = 0; i < numMessages; ++i) {
        LOGI("线程 %d 写入的日志消息 %d 时间戳: %ld", threadId, i, std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()));
    }
}

void readLogs(const std::string &logFile, int numReads){
    for (int i = 0; i < numReads; ++i) {
        std::ifstream ifs(logFile);
        if (!ifs.is_open()) {
            LOGE("无法打开日志文件进行读取: %s", logFile.c_str());
            return;
        }

        std::string line;
        while (std::getline(ifs, line)) {
            // 模拟读取操作,可以在实际使用时处理或输出日志内容// LOGI("读取的日志内容: %s", line.c_str()); // 如果需要打印读取内容,可以启用这行
        }

        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟读取间隔
    }
}

int main(){
    const std::string logFile = "test_logs.txt";
    const int numMessages = 1000;
    const int numReads = 100;

    // 使用 GlobalLoggerBuilder 初始化日志系统
    bitlog::GlobalLoggerBuilder::ptr lbp(new bitlog::GlobalLoggerBuilder);
    lbp->buildLoggerName("test_logger");
    lbp->buildLoggerLevel(bitlog::LogLevel::value::INFO); // 确保设置正确的日志级别
    lbp->buildFormatter("%m");
    lbp->buildSink<bitlog::FileSink>(logFile); // 设置日志输出文件为 test_logs.txt
    lbp->buildLoggerType(bitlog::Logger::Type::LOGGER_SYNC); // 使用同步日志器
    lbp->build();

    // 创建写入和读取线程
    std::thread writer1(writeLogs, numMessages, 1);
    std::thread writer2(writeLogs, numMessages, 2);
    std::thread reader(readLogs, logFile, numReads);

    // 等待所有线程完成
    writer1.join();
    writer2.join();
    reader.join();

    LOGI("日志写入与读取测试完成。");

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件工程造价师习题练习 5

1.下面哪项是EO的主要目的&#xff08; &#xff09; A. 改变应用行为 B. 维护一个或多个ILFs C. 呈现信息给用户 D. 执行数学公式和计算 外部输出&#xff08;EO&#xff09;是发送数据或控制信息到边界外部的基本过程&#xff0c;与EQ相比还包含了额外的处理逻辑。EO的主…

TypeError: Cannot read properties of undefined (reading ‘scrollIntoView‘)(已解决)

问题复现&#xff1a;眨眼睛使用vitevue3实现跳转dom功能时使用了scrollIntoView方法&#xff0c;在打包上传以后使用该功能报错 小友可能会陷入误区&#xff0c;以为是函数方法有问题&#xff0c;毕竟在开发时是没有问题的&#xff0c; 而实际上呢问题出在获取节点失败了 在这…

企业级批量无人值守安装

企业级批量无人值守安装 一、批量无人值守安装1.简介PXE工作流程 2.核心技术&#xff08;dhcp、httpd、tftp&#xff09;3.实验3.1 准备环境3.2 防护关闭3.3 软件安装3.4 软件配置DHCP服务设置httpd服务配置tftp服务配置 3.5 编写引导安装相关文件&#xff0c;放到指定位置3.5.…

基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码

介绍 适用于高能耗企业、建筑、工厂、园区的水、电、气、热、油、空压机等能源数据采集、分析、报表&#xff1b; 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 软件架构 软件功能 数字大屏 使用说明

关于鸣潮启动器450张图片杂谈—从代码分析为何使用帧动画

关于鸣潮启动器450张图片杂谈—从代码分析为何使用帧动画 前言 在鸣潮启动器的目录下 Wuthering Waves\kr_game_cache\animate_bg\99de27ae82e3c370286fba14c4fcb699打开该目录发现有450张图片&#xff0c;不难看出启动器的背景动画是由这450张图片不断切换实现的 qt框架 从…

小白公式量化--用Python指标公式模块做量化策略研究

《小白公式量化系统》是纯Python开发的&#xff0c;因此我们可以借用《小白公式量化系统》的金融模块&#xff0c;来实现自己的Python量化框架&#xff0c;以及用Python实现量化研究、选股、人工智能机器学习&#xff0c;以及打造自己的行情软件和量化平台。我们后面文章讲介绍…

【大模型从入门到精通27】开源库框架LangChain 语义搜索:高级检索策略1

这里写目录标题 语义搜索&#xff1a;高级检索策略简介最大边际相关性 (MMR)自我查询检索上下文压缩增强语义搜索的高级文档检索技术引言设置环境导入必要的库初始化向量数据库以进行相似性搜索导入 Chroma 向量存储库和 OpenAI 嵌入 填充向量数据库定义文本列表以填充数据库创…

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

目录 前言 1.扩大检测框区域 2.先检测手部&#xff0c;后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测&#xff0c;然后扩大检测框区域&#xff0c;并对该区域使用YOLOv8-s-pose使用关键…

达梦数据库版本介绍

达梦数据库根据不同用户的不同需求&#xff0c;提供了三种版本的数据库&#xff1a;DM Standard Edition 标准版、DM Enterprise Edition 企业版、DM Security Edition 安全版。那么这三种版本有什么区别&#xff0c;我们该如何选择合适的版本&#xff1f;下面先介绍三种版本各…

【笔记】泰山派环境配置遇到E: Unable to locate package repo

答案来自通义千问&#xff0c;解决了我的问题&#xff0c;做一些记录 你尝试在Ubuntu或Debian系统上使用apt命令安装repo工具&#xff0c;但是遇到了问题&#xff0c;因为repo不是直接在软件源中作为一个独立的包提供的。repo是Google的一个Git仓库管理工具&#xff0c;通常用…

【系统架构设计】系统性能评价(二)

【系统架构设计】系统性能评价&#xff08;二&#xff09; 性能指标性能计算性能设计阿姆达尔解决方案负载均衡 性能评估基准测试程序Web 服务器的性能评估 性能指标 性能计算 性能设计 阿姆达尔解决方案 阿姆达尔定律&#xff1a; 系统中对某部件采用某种更快的执行方式&a…

Centos8和stream 9防火墙基本使用

查发行版&#xff1a; [rootlocalhost nps-0.26.10]# cat /etc/redhat-releaseCentOS Stream release 9查看防火墙状态 systemctl status firewalld firewall-cmd --state开启/关闭/重启防火墙 systemctl start firewalld[rootlocalhost conf]# systemctl start firewalld …

Eureka原理与实践:深入探索微服务架构的核心组件

在微服务架构日益盛行的今天&#xff0c;服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka&#xff0c;作为Netflix开源的服务注册与发现框架&#xff0c;凭借其简单、健壮的特性&#xff0c;在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理&…

ubuntu 24.04 安装 Nvidia 显卡驱动 + CUDA + cuDNN,配置 AI 深度学习训练环境,简单易懂,一看就会!

ubuntu 24.04 安装 Nvidia 显卡驱动 CUDA cuDNN&#xff0c;配置 AI 深度学习训练环境&#xff0c;简单易懂&#xff0c;一看就会&#xff01; 1.查看本机显卡型号 lspci | grep -i nvidia输出如下&#xff1a; 01:00.0 3D controller: NVIDIA Corporation GM108M [GeForc…

焦虑迷雾中的幻觉挑战?专家教你如何拨云见日!

在这个快节奏、高压力的时代&#xff0c;焦虑症已成为许多人难以言说的秘密。它不仅让人心情沉重&#xff0c;更有可能在极端情况下引发幻觉&#xff0c;仿佛置身于一个光怪陆离、难以分辨真假的世界。面对这样的困境&#xff0c;我们该如何自救&#xff0c;如何找到那束穿透焦…

ansible【自动化配置】(thirty day)

回顾 1、mysql和python &#xff08;1&#xff09;不需要执行mysql_ssl_rsa_setup &#xff08;2&#xff09;Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql &#xff08;1&#xff09;connpymysql.connect(host,user,password,database,prot) …

OpenCV图像处理——积分图像计算(C++/Python)

概述 积分图像是一种高效的图像处理技术&#xff0c;最初由Crow在1984年提出&#xff0c;目的是为了提高多尺度透视投影的渲染速度。它通过构建一个积分图&#xff0c;使得图像中任意矩形区域的像素和能够在常数时间内快速计算出来&#xff0c;极大地减少了在图像模糊、边缘提…

WARNING: There was an error checking the latest version of pip. 解决方案

WARNING: There was an error checking the latest version of pip. 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开…

【单片机】51单片机入门教程(二):定时器的模式详解与中断应用实例

文章目录 51单片机定时器教程:模式详解与中断应用实例1. 介绍2. 51单片机定时器/计数器概述3. 定时器控制寄存器与中断入口4. 模式0:13位定时器/计数器5. 模式1:16位定时器/计数器6. 模式2:8位自动重装载定时器/计数器7. 模式3:分割两个独立的8位定时器/计数器8. 总结51单…

Vue.js入门系列(十):深入理解Vue指令及自定义指令的使用

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…