为什么/过多的日志会影响我的应用程序的性能?

时间:2021-02-03 16:40:52

标签: performance logging operating-system log4j cpu

我最近读到过多的日志记录会影响我们应用程序的性能。但据我所知,日志记录是一项 IO 绑定作业(例如向控制台发送字节流或写入文件),并且我们还读取了当 IO 绑定作业发生时不使用 CPU 周期(CPU那时空闲)那么如果 IO 不消耗我的 CPU 周期,它怎么会影响我的应用程序的性能?

3 个答案:

答案 0 :(得分:0)

日志记录可以通过两种方式影响应用程序的性能。

首先,您使用的 API 可能会在您的应用程序代码中创建大量字符串,这些字符串可能占用 CPU 周期并创建需要收集的垃圾。

其次,日志线程需要在将字符串写入磁盘之前对其进行格式化。

根据您记录的频率和您记录的消息的复杂性,这可能会消耗比您预期更多的 CPU 周期。请注意,有很多未知数,例如您的机器拥有的内核数量、您的应用程序代码需要多少个内核等...

理想的做法是分析您的应用程序以查看 CPU 使用率的实际来源。

答案 1 :(得分:0)

它肯定会影响应用程序的性能。

  1. 当你调用一个日志方法时,你会为这个调用分配一个特定的堆栈。取决于您记录的位置(控制台、文件等),CPU 使用率可能会有所不同。
  2. 从内存和垃圾收集的角度来看,字符串本身就是重对象。通常,字符串池在日志语句的情况下是没有用的。
  3. 您的日志提取器通常作为库添加到您的应用中,它读取这些日志并将它们推送到远程服务器 (AppInsights)。本次演讲从您的应用程序进程中获取一定的 CPU 和 I/O。这些库通常实施了微批处理以减少副作用,但它仍然存在。
  4. 通常日志记录是异步行为,因此它不会对您当前的调用产生太大影响,但整个应用程序可能会面临一些压力。理想情况下,在我们真正开始批量登录之前,这应该不会太多。这就是为什么我们通常只在 prod 中启用警告及以上。

答案 2 :(得分:0)

就这样对待它:

当您在调试级别添加大量日志并在信息级别配置上运行您的应用程序时,您的程序仍然会计算消息并至少评估日志级别条件。

然后是 GC 的开销,您可以将日志发送到某个监控系统,或集中式日志记录机制等,这都需要 CPU 周期和内存。

在 java 中使用 lambdas 编写日志有一个强有力的论据,因为如果您使用字符串计算编写日志,则计算只会在级别检查得到满足后发生。

相关问题