log4j2异步打印性能提升方式

 更新时间:2021-12-22 15:59:55   作者:佚名   我要评论(0)

目录log4j2异步打印性能提升分析原因解决方案log4j2性能提升点理解为以下三点log4j2异步打印性能提升
压测结果发现,log4j升级成log4j2之后对

log4j2异步打印性能提升

压测结果发现,log4j升级成log4j2之后对系统性能影响并不大,更改打印日志方式(同步修改成异步打印)

这里写图片描述

压测结果发现TPS在开始阶段提升较快,当压力上来之后,TPS下降迅速,不如同步的数据(log4j2用的版本是2.3)

分析原因

获取压测是堆栈日志如下:

这里写图片描述

这里写图片描述

发现线程都在跑LockSupport.parkNanos也就是unsafe.park(false, 1);(private static final Unsafe unsafe = Unsafe.getUnsafe();)这行代码。

具体功能是:调用 park后,线程将一直阻塞直到超时或者中断等条件出现。unpark可以终止一个挂起的线程,使其恢复正常。

经过分析压测,发现当并发量打的时候该方法造成了大量的线程切换,也就是说明消费速度跟不上生产速度。线程被频繁的休眠/唤醒导致 cpu使用率高,且性能较低。

解决方案

上边原因分析到了,查询下解决方案,发现了log4j的bug,已经在2.7版本修复,所以替换log4j2的版本为2.7(JDK版本需要1.7以上,否则回报(unsupported major.minor version 51.0))

个人推荐JDK版本使用1.8。

具体代码变动如下:

这里写图片描述

没有了unsafe.park(false, 1); 被block的线程没有一直被调度

log4j2性能提升点

1、log4j1写日志多线程情况是阻塞的,log4j2不会阻塞,生产者只负责生产,通过无锁队列ringbuffer的无阻塞内存队列作为缓冲(即使用Disruptor),多生产者多线程的竞争是通过CAS实现,性能较高,至于最后落地,虽然两者都会调用synchronized方法写入日志,log4j2的asynclogger支持多个消费者,每个消费者取一批待处理的日志,类似于分段,用于提高性能

2、Disruptor简介

log4j2之所以能在异步写日志时性能提高这么多,离不开优秀的mq组件disruptor。

disruptor的主要设计思想是无锁的高并发,在设计上采用内存屏障的机制和CAS操作实现此思想。主流的并发程序

都离不开锁对资源的管控,或者尽量避开锁的使用。

理解为以下三点

1、有一个基于数组的循环数据结构(环装缓冲区)。这个循环数据结构,它是个拥有多个可用元素引用的数组。预先分配了对象内存空间。生产者与消费者通过这个循环数据结构进行读写操作,并不会有锁或资源竞争。

2、在Disruptor中,采用消费者-生产者模型进行读写的分离,所有事件(events)以组播的方式被发布给所有消费者,以便下游队列通过并行的方式进行消费。因为消费者的并行消费,需要协调消费者间的依赖关系。

3、生产者和消费者中有个序列计数器,指示缓冲区中当前正在被它所处理的元素。所有生产者或消费者都只可以修改它自己的序列计数器,但同时可以读取其他的序列计数器,内存屏障加序列号的方式实现了无锁的并发机制。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • log4j2日志异步打印(实例讲解)
  • Springboot2.x 使用 Log4j2 异步打印日志的实现
  • 使用Log4j2代码方式配置实现线程级动态控制
  • Logback与Log4j2日志框架性能对比与调优方式
  • 关于log4j2的异步日志输出方式
  • log4j2的高并发死锁问题配置优化方式

相关文章

  • log4j2异步打印性能提升方式

    log4j2异步打印性能提升方式

    目录log4j2异步打印性能提升分析原因解决方案log4j2性能提升点理解为以下三点log4j2异步打印性能提升 压测结果发现,log4j升级成log4j2之后对
    2021-12-22
  • C语言之直接插入排序算法的方法

    C语言之直接插入排序算法的方法

    目录一、什么是直接插入排序二、代码讲解总结直接 插入排序 (Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插
    2021-12-22
  • C语言实现求解最小公倍数的算法示例

    C语言实现求解最小公倍数的算法示例

    目录题目描述问题分析方法一:穷举法方法二:定理法题目描述 求任意两个正整数的最小公倍数 问题分析 两个或多个整数公有的倍数叫做它们的公
    2021-12-22
  • .NET中IoC框架Autofac用法讲解

    .NET中IoC框架Autofac用法讲解

    1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是依赖注入 2 简介 Autofac与C#语言的结合非常紧密,并学习它非常的简单,也是.NET
    2021-12-22
  • Vue lazyload图片懒加载实例详解

    Vue lazyload图片懒加载实例详解

    文档:https://github.com/hilongjw/vue-lazyload 1.安装 cnpm i vue-lazyload -S 或 npm i vue-lazyload -S 2.实例 导入配置等操作 src/
    2021-12-22
  • 用Docker搭建nextcloud个人网盘教程

    用Docker搭建nextcloud个人网盘教程

    目录一、简介二、部署环境三、工具四、部署过程总结一、简介 nextcloud是一个非常好用的网盘系统,功能强大插件齐全,非常适用于个人网盘和企
    2021-12-22
  • 基于Python实现人像雪景小程序

    基于Python实现人像雪景小程序

    目录导语?正文1)素材环境(仅部分)2)运行环境3)代码演示4)效果展示导语 哈喽~大家早上好鸭! 冷空气来袭,不少地方一夜入冬,南方地区除了
    2021-12-22
  • Python的Scrapy框架解析

    Python的Scrapy框架解析

    目录一.为什么使用Scrapy框架?二.Scrapy框架每个组件介绍三.Scrapy框架工作原理总结一.为什么使用Scrapy框架? Scrapy是一个快速、高
    2021-12-22
  • python数据分析之文件读取详解

    python数据分析之文件读取详解

    目录前言:一·Numpy库中操作文件二·Pandas库中操作文件三·补充总结前言: 如果你使用的是Anaconda中的Jupyter,则不需要下载Pands和Numpy
    2021-12-22
  • C语言实现求最大公约数的三种方法

    C语言实现求最大公约数的三种方法

    目录题目描述问题分析代码实现方法一:穷举法方法二:辗转相除法方法三:更相减损法题目描述 求任意两个正整数的最大公约数 问题分析 最大公
    2021-12-22

最新评论