小小的日志,大大的坑

京东云开发者
• 阅读 196

作者:京东零售 王军

1. 背景

压测过程中优化线程池以后单机qps存在性能瓶颈,优化过程中发现默认线程池及日志对性能存在严重的影响所以引发了一系列对日志优化的整理

2.哪些场景可能导致性能问题

在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索。绝大多数人都认可日志的重要性,但是又有哪些场景可能导致性能问题?今天就让我们来聊聊Java日志性能那些事。

2.1 不合理的书写方法

小小的日志,大大的坑

如上3种写法,我相信大家或多或少都在项目代码中看到过,那么他们之前有区别呢,会对性能造成什么影响? 如果此时关闭 DEBUG 日志级别,差异就出现了

格式1 依然还是要执行字符串拼接,即使它不输出日志,属于浪费。

格式2 的缺点就是参数会提前做JSON序列化也产生性能损耗。

所以推荐格式3,新增日志开关,只有在执行时才会动态的拼接,关闭相应日志级别后,不会有性能损耗。



2.2 不合理的日志

尽量多的日志,能够把用户的请求串起来,更容易断定出问题的代码位置。由于当前分布式系统,且业务庞杂,任何日志的缺失对于程序员定位问题都是极大的障碍。所以要合理的打印日志,设置合理的日志级别

小小的日志,大大的坑

2.3 日志输出格式

位置信息 官网称作 Location Information,含义是当前这行日志是哪个类的哪个方法哪一行打印的。

可配置的模式有很多,具体见官网 https://logging.apache.org/log4j/2.x/manual/layouts.html#Patterns

这里只说和位置相关的 %C or %class, %F or %file, %l or %location, %L or %line, %M or %method。

官网这几个模式的说明中也都反复强调了会影响性能。同时也给出了具体的性能数据,比常用的同步 logger 慢 1.3 ~ 5 倍。如果在异步 logger 中使用位置信息,将会慢 30 ~ 100 倍。



3. 如何尽量避免日志对性能产生影响

3.1 日志级别动态调整

用好DEBUG级别!项目代码需要打印大量 INFO级别日志,以支持问题定位及测试排查等。但这些大量的 INFO日志对生产环境是无效的,大量的日志会吃掉 CPU 性能,此时需要能动态调整日志级别,既满足可随时查看 INFO日志,又能满足不需要时可动态关闭,不影响服务性能需要。

3.2 不打无用日志

日志内容,能少就少,不在循环中打,大 list 简化,不打无用内容。

明显知道的异常栈不要打印(比如自定义异常捕获后直接打印异常信息即可)

3.3 避免字符串拼接

避免使用字符串连接:在日志记录中,字符串连接是一项较为昂贵的操作,特别是在循环中使用。每次进行字符串连接都会产生一个新的字符串对象,浪费了内存和时间。应优先考虑使用占位符的形式,如使用slf4j库中的"{}",然后传入参数,并避免使用字符串连接。

3.4 新增日志开关

按需新增日志开关减少不必要的性能损耗,例如JSON序列化及字符串拼接等等。(若无相关操作则不需要新增日志开关,反而存在一堆废代码)

3.5 调整日志输出格式

影响性能的位置信息按需选择减少性能损耗

3.6 日志异步打印(谨慎选择)

同步打印日志磁盘 I/O 成为瓶颈,导致大量线程 Block,异步缺可能产生日志丢失。



4. 优化成果

4.1优化前(单机80qps..性能已经不可用 耗时高达1500+ms):

小小的日志,大大的坑



4.2优化后(单机200qps tp999稳定在575ms):

小小的日志,大大的坑

点赞
收藏
评论区
推荐文章
面试字节跳动Java工程师该怎么准备?值得收藏!
性能调优影响MySQLServer性能的相关因素1.商业需求对性能的影响2.系统架构及实现对性能的影响3.Query语句对系统性能的影响4.Schema设计对系统的性能影响5.硬件环境对系统性能的影响MySQL数据库锁定机制1.MySQL锁定机制简介2.各种锁定机制分析3.合理利用锁机制优化MySQLMySQL数据库Que
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
10个月前
JAVA应用CPU跳点自动DUMP工具 | 京东物流技术团队
背景在做系统监控时,CPU的使用率是一个关键的指标,它反映了系统的性能稳定性以及是否存在异常情况,能帮助我们了解系统的负载情况。通过监控CPU使用率,可以判断系统是否正常运行或者是否存在性能问题。如果CPU使用率过高,可能表示系统存在资源瓶颈,需要进行优化
京东云开发者 京东云开发者
6个月前
奇怪!应用的日志呢??
1.问题回顾问题背景是在进行中台应用中间件迁移过程中,发现存在项目启动失败或者项目正常启动(jsf正常挂载并正常运行,mq正常发送和消费)但是无任何日志打印现象。更奇怪的是不打印日志竟然是偶发的,在测试环境中多次部署都未出现项目启动但无日志打印情况,而且玄
京东云开发者 京东云开发者
4个月前
JAVA应用CPU跳点自动DUMP工具
背景在做系统监控时,CPU的使用率是一个关键的指标,它反映了系统的性能稳定性以及是否存在异常情况,能帮助我们了解系统的负载情况。通过监控CPU使用率,可以判断系统是否正常运行或者是否存在性能问题。如果CPU使用率过高,可能表示系统存在资源瓶颈,需要进行优化
京东云开发者 京东云开发者
3个月前
买药秒送 JADE动态线程池实践及原理浅析
一、背景及JADE介绍买药秒送是健康即时零售业务新的核心流量场域,面对京东首页高流量曝光,我们对频道页整个技术架构方案进行升级,保障接口高性能、系统高可用。动态线程池是买药频道应用的技术之一,我们通过3轮高保真压测最终初步确定了线程池的核心参数。但我们仍面
京东云开发者 京东云开发者
1个月前
日志框架简介-Slf4j+Logback入门实践
作者:京东零售张洪前言随着互联网和大数据的迅猛发展,分布式日志系统和日志分析系统已广泛应用,几乎所有应用程序都使用各种日志框架记录程序运行信息。因此,作为工程师,了解主流的日志记录框架非常重要。虽然应用程序的运行结果不受日志的有无影响,但没有日志的应用程序
绣鸾 绣鸾
1年前
CleanMyMac X for mac(v4.14.3)
是一款Mac系统清理和优化软件,它可以帮助用户清理垃圾文件、卸载无用应用程序、优化系统性能等。以下是CleanMyMacX的主要特点:1.系统清理:CleanMyMacX可以清理Mac系统中的垃圾文件、缓存文件、日志文件等,释放磁盘空间,提高系统性能。2.
小小的日志,大大的坑 | 京东云技术团队
在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索。绝大多数人都认可日志的重要性,但是又有哪些场景可能导致性能问题?今天就让我们来聊聊Java日志性能那些事。