[零声教育] C++高性能日志课程总结

高性能日志

1 数据肯定是批量写入的

如果数据单笔写入会造成 磁盘寻址、频繁用户态/内核态的切换 (耗时)

2 fwrite/write 的区别

  • fwrite() 是C标准库中的函数,而 write() 是系统调用接口。
  • fwrite底层也是通过write来实现的。

二者均都有缓冲区,系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数增大,效率就低下。而fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。

  • 假如write按照调用者要求写入十个字节的数据在内核缓冲区,这中间会涉及到用户态与内核态之间的切换。(由于使用了系统调用)

  • 而fwrite不一样,fwrite每次都会先把数据写入一个应用进程缓冲区,等到该缓冲区满了,系统会调用write一次性把相应数据写进内核缓冲区中。同样减少了系统调用(即write调用)。

因此当 buf_size 设置的比较大的时候,write 的性能比较优;当 buf_size 设置的比较小的时候,缓冲区会容易写满,频繁使用系统调用,OS会进行变态,增加耗时

3 log4cpp

3.1 设计理念
  • 输出格式

    • c++风格

      warn_log.warnStream() << "xxx = " << 100;箭头运算符重载

    • C语言风格

      warn_log.info("xxx = %d", 100);

  • 输出位置

    • 打印到本地文件

      log4cpp::FileAppender

    • 输出到控制台

      log4cpp::OstreamAppender

3.2 日志性能的问题

支持回滚的日志(RollignFileAppender)

  1. 换了一个文件后,会在程序里面记录每次写入的数据大小,总计超过比如1M 再重写另外一个文件

    此处log4cpp 错误的做法是:每次写日志都会去调用 lseek 函数去获取文件大小(耗时多),这也是影响效率的关键

FileAppender

每次日志都调用write

异步日志的高性能:支持批量写入,日志达到一定量的时候,才会调用write去写入文件

4 异步设计

4.1 多线程写入

多个线程将日志写入到缓存队列里,需要加锁

4.2 日志什么时候写入磁盘

引入双缓存机制:两个缓存队列。

日志写满一个缓存队列的话,才去notify 日志读取线程将日志从缓存队列中取出然后写入,然后下一条日志写到另外一个缓存队列中去。

而不是一个日志写到缓存队列中就通知线程进行日志读取。

实际做法原理:使用多个大数组缓冲区作为日志缓冲区,多个大数组缓冲区以双循环链表方式连接,并使用两个指针p1和p2指向链表两个节点,分别用以生成数据、与消费数据

生产者可以是多线程,共同持有p1来生产数据,消费者是一个后台线程,持有p2去消费数据

4.3 如果缓存队列快满了(还未满),导致日志长时间未写入

日志写线程:notify 唤醒 + 超时唤醒

4.4 程序崩溃了,日志没有及时写入

使用gdb,打开-g,可以产生coredump,通过coredump方式

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

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

相关文章

重学SpringBoot3-ErrorMvcAutoConfiguration类

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 重学SpringBoot3-ErrorMvcAutoConfiguration类 ErrorMvcAutoConfiguration类的作用工作原理定制 ErrorMvcAutoConfiguration示例代码1. 添加自定义错误页面2.自定义错误控制器3. ErrorAttributes定制错误信息 结…

Java学习记录(十七)IO流(三)

转换流&#xff08;在字节流中想使用字符流的方法时使用&#xff09; 转换流是字节流和字符流之间的桥梁&#xff0c;转换流本身其实就是字符流所以可以使用字符流里的相关方法&#xff0c;通过InputStreamReader字符转换输入流能将字节流转化为字符流输入到内存中&#xff0c…

YOLOv8改进 | 注意力机制 | 添加YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目标,其希望通过学习遮挡面和未遮挡面之间的…

.net core框架

ASP.NET Core 入门 跨平台开源框架 B/S 类与方法 Console 部分称为“类”。 类“拥有”方法&#xff1b;或者可以说方法存在于类中。 WriteLine() 部分称为“方法”。 想要使用方法就要知道方法在哪里 —————————— 执行流 一次执行一段 ASP.NET Core 是什么东西…

玩转SpringBoot:SpringBoot的几种定时任务实现方式

引言 在现代软件开发中&#xff0c;定时任务是一种常见的需求&#xff0c;用于执行周期性的任务或在特定的时间点执行任务。这些任务可能涉及数据同步、数据备份、报表生成、缓存刷新等方面&#xff0c;对系统的稳定性和可靠性有着重要的影响。Spring Boot提供了强大且简单的定…

VikeCTF 2024

VikeCTF 2024 WP 由于环境原因很多靶场的过程图片没法复现截图。。。 web Ponies 算是一个签到题&#xff0c;看到源码这里其实是一个快速跳转的程序&#xff0c;我们看到tag.src直接进行访问&#xff0c;可以看到源码里面&#xff0c;从里面分析拿到flag function recurs…

分享那些在云发生的奇妙故事 ~~ 征文挑战赛来啦!

云布道师 简介&#xff1a; 在数字化转型的大潮下&#xff0c;云计算已深度渗透各行各业&#xff0c;成为企业创新和发展的关键驱动力。本栏目旨在通过全面挖掘并生动展现“客户如何用好云”的实战历程&#xff0c;深入剖析行业痛点解决之道&#xff0c;以鲜活的案例故事呈现云…

Rust 语言的 for 循环用法

在 Rust 中&#xff0c;for 循环是一种用于迭代集合&#xff08;如数组、切片、向量、字符串、映射、通道等&#xff09;或其他可迭代对象的方式。Rust 的 for 循环语法相对直观&#xff0c;并且与许多其他编程语言中的 for 循环类似。 以下是 for 循环在 Rust 中的一些常见用…

流畅的Python(十八)-使用asyncio包处理并发

一、核心要义 1. 对比一个简答的多线程程序和对应的asyncio版,说明多线程和异步任务之间的关系 2. 网络下载的异步版 3. 在异步编程中,与回调相比&#xff0c;协程显著提升性能的方式 二、代码示例 1、相关知识点 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time …

算法50:动态规划专练(力扣514题:自由之路-----4种写法)

题目: 力扣514 &#xff1a; 自由之路 . - 力扣&#xff08;LeetCode&#xff09; 题目的详细描述&#xff0c;直接打开力扣看就是了&#xff0c;下面说一下我对题目的理解: 事例1&#xff1a; 输入: ring "godding", key "gd" 输出: 4. 1. ring的第…

RStudio更换R语言版本

今天下载R语言用于读取.xlsx文件的readxl包时&#xff0c;RStudio提示该包是使用R-4.3.3版本构建&#xff0c;而我现在使用的是R-4.3.2版本&#xff0c;所以需要升级一下R语言版本&#xff0c;这里先下载最新版本的R语言&#xff0c; 下载地址&#xff1a;The Comprehensive R…

Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)

文章目录 1、什么是Jenkins的流水线?2、流水线语法2.1、声明式流水线2.2、脚本化流水线 3、流水线示例3.1、使用声明式流水线的语法编写的 Jenkinsfile 文件3.2、Pipeline 各种语言示例3.2.1 Java&#xff1a;3.2.2 Node.js / JavaScript3.2.3 Python 4、一套完整的Devops Jen…

【ICCV21】Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

文章目录 0. Abstract1. Introduction2. Related Work3. Method3.1 Overall Architecture3.2 Shifted Window based Self-Attention3.3 Architecture Variants 4. Experiments4.1 Image Classification on ImageNet-1K4.2 Object Detection on COCO4.3 Semantic Segmentation o…

基于JavaWeb开发的springboot网咖管理系统[附源码]

基于JavaWeb开发的springboot网咖管理系统[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &a…

【办公类-40-02】20240311 python模仿PPT相册功能批量插入照片,更改背景颜色 (家长会系列二)

作品展示——用Python插入PPT相册 背景需求&#xff1a; 马上就要家长会&#xff0c;我负责做会议前的照片滚动PPT&#xff0c;通常都是使用PPT的相册功能批量导入照片&#xff0c; 生成给一个新的PPT文件 更改背景颜色 设置4秒间隔&#xff0c;应用到全部 保存&#xff0c;改…

springboot单体项目链路日志跟踪及接口耗时

最近接触一个新的传统项目&#xff0c;在联调过程中&#xff0c;查看日志特别不方便&#xff0c;既无trackId&#xff0c;即无接口耗时&#xff0c;所以写了该博客。话不多说&#xff0c;直接上代码 1、实体类user package com.yk.domain;import lombok.Data;Data public cla…

【IVA】人工智能领域常用的术语(1)

在人工智能和机器学习领域&#xff0c;"检测"、"识别"和"分类"是常用的术语&#xff0c;它们在问题解决中有着不同的含义&#xff1a; 检测&#xff08;Detection&#xff09;&#xff1a;检测是指在图像或视频中定位和识别特定目标的过程。目标…

Hadoop伪分布式配置--没有DataNode或NameNode

一、原因分析 重复格式化NameNode 二、解决方法 1、输入格式化NameNode命令&#xff0c;找到data和name存放位置 ./bin/hdfs namenode -format 2、删除data或name&#xff08;没有哪个删哪个&#xff09; sudo rm -rf data 3、重新格式化NameNode 4、重新启动即可。

sheng的学习笔记- AI-类别不平衡问题

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 什么是类别不平衡问题 类别不平衡&#xff08;class-imbalance&#xff09;&#xff0c;也叫数据倾斜&#xff0c;数据不平衡&#xff0c;就是指分类任务中不同类别的训练样例数目差别很大的情况。 例如有998个反例&#xf…

vue3全局引入element-plus后怎么使用Message进行消息提示

全局引入 main.ts import element-plus/dist/index.css 在需要使用提示的组件中引入 import { ElMessage } from element-plus 使用举例