linux多线程服务端编程第五章-高效的多线程日志 读后感
linux 服务端 多线程 c++   发布于 2018-12-14   67人围观  0条评论
linux 服务端 多线程 c++   发表于 2018-12-14   67人围观  0条评论

前言

最近在读陈硕的moduo网络库的书,记录总结一些东西。

本章分析和设计一个高效的多线程日志库。

功能需求

  • 必要的需求
    • 日志级别设定
  • 非必要需求
    • 日志目的地 - 对于诊断日志来说,日志目的地即本机,因为往网络写日志消息并不可靠,诊断日志的功能之一就是诊断网络故障。
    • 日志消息格式可配置 - 可变可不变,尽量保持日志解析的方便程度,即尽量保持日志格式的不可变性
    • 日志运行时过滤器 - 控制不同组件输出不同的日志级别,可要可不要

性能需求

简而言之,就是高效,日志前端写入不会阻塞或尽量不阻塞。对日志消息前端而言,要做到低延迟、低CPU开销、少阻塞;对于日志消息后端而言,要做到足够大的吞吐量以及占用较少资源。

书中列出了几个具体指标:

  • 每秒写几千上万条日志消息时,不会带来明显的性能损失
  • 能应对一个进程产生大量日志数据的场景,例如1GB/min
  • 不阻塞正常执行的流程
  • 在多线程程序中,不造成争用

多线程异步日志

在多线程服务程序中,如果在网络IO或者业务线程中直接往磁盘写数据,写操作可能会比较耗时,直接导致请求方超时。故,在常规的实时业务处理流程中应该避免磁盘IO。

以下过程仅仅是自述理解使用,具体过程建议看书,书中写的非常详细。

muduo网络使用的双缓冲技术,即准备两块buffer,A和B,然后日志前端会兵乓式往A和B写入日志消息,日志后端会处理不在使用的那块buffer中的日志消息。在实施过程中准备了四块buffer,日志前端持有A和B,日志后端持有C和D。日志前端和后端分别持有两块Buffer Vector,V1和V2。

日志前端往A中写数据,写满时将A压入V1,用B替换A,之后继续往B中写入数据,通知日志后端处理数据。

日志后端处理过程为,等待日志前端写满A的通知,压入当前正使用的buffer到V1中,并替换日志前端的A和B为日志后端的C和D。日志后端交换V1和V2,该操作即清空日志前端的Buffer Vector,并将原Vector交于后端处理。日志后端在写入日志数据到磁盘之后,重新用A和B填满后端所需要的两块buffer。

上一篇: linux多线程服务端编程第六章-muduo网络库简介 读后感

下一篇: linux多线程服务端编程第四章-C++多线程系统编程精要 读后感

立即登录,发表评论
没有帐号?立即注册
0 条评论