【发布时间】:2021-02-03 16:40:52
【问题描述】:
我最近刚读到过多的日志记录会影响我们应用程序的性能。但是据我所知,我们知道日志记录是一项 IO 绑定的作业(例如向控制台发送字节流或写入文件),并且我们也读过,当发生 IO 绑定的作业时,不使用 CPU 周期(CPU那时是空闲的)那么如果 IO 不消耗我的 CPU 周期,它怎么会影响我的应用程序的性能呢?
【问题讨论】:
标签: performance logging operating-system log4j cpu
我最近刚读到过多的日志记录会影响我们应用程序的性能。但是据我所知,我们知道日志记录是一项 IO 绑定的作业(例如向控制台发送字节流或写入文件),并且我们也读过,当发生 IO 绑定的作业时,不使用 CPU 周期(CPU那时是空闲的)那么如果 IO 不消耗我的 CPU 周期,它怎么会影响我的应用程序的性能呢?
【问题讨论】:
标签: performance logging operating-system log4j cpu
日志记录可以通过两种方式影响应用程序的性能。
首先,您使用的 API 可能会在您的应用程序代码中创建大量字符串,这些字符串可能会占用 CPU 周期并产生需要收集的垃圾。
其次,日志记录线程需要在将字符串写入磁盘之前对其进行格式化。
根据您的日志记录频率和您记录的消息的复杂性,这可能会消耗比您预期更多的 CPU 周期。请注意,有很多未知数,例如您的机器有多少内核,您的应用程序代码需要多少内核等等...
理想的做法是分析您的应用程序以查看 CPU 使用率的实际来源。
【讨论】:
所以这样对待它:
当您在调试级别添加大量日志并在信息级别配置上运行应用程序时,您的程序仍会计算消息并评估日志级别条件最少。
然后是 GC 的开销,您可能会将日志发送到某个监控系统或集中式日志记录机制等,这都需要 CPU 周期和内存。
在 java 中使用 lambdas 写日志有这个强有力的论据,因为如果你写一个带有字符串计算的日志,计算只会在满足级别检查后发生。
【讨论】:
日志记录对于应用程序开发非常重要,因为它会影响性能。
日志记录通常涉及写入文件,并且此类 I/O 操作比基本的 CPU/内存中的流量消耗更多的资源,这可以在示例大规模测试执行中看到,我们可以看到较长的处理时间是忙于记录:
注意:我是这篇博文的作者,Logging impact on application performance。
【讨论】:
它肯定会影响应用程序的性能。
【讨论】: