【问题标题】:Why/How too much logs impacts my application's performance?为什么/多少日志会影响我的应用程序的性能?
【发布时间】:2021-02-03 16:40:52
【问题描述】:

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

【问题讨论】:

    标签: performance logging operating-system log4j cpu


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 但是如果我在 Java 中使用文字创建相似/常见的字符串对象,并且我们知道这些对象将进入字符串常量池(不会为相同的字符串创建新的字符串对象)怎么办? ?如果我的记录器客户端是单线程的呢?
    • 如果您只是使用字符串文字,那么该部分不会增加内存压力。您的“记录器客户端”应用程序代码或记录库是什么意思?
    • 记录器客户端的意思是我的班级将持有的记录库对象的引用。
    • 通常,您的应用程序代码将持有对一个对象的引用,该对象将简单地将日志事件排入应用程序代码线程中的中断器中。您应该真正分析您的应用程序以了解 CPU 使用情况。
    【解决方案2】:

    所以这样对待它:

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

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

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

    【讨论】:

      【解决方案3】:

      日志记录对于应用程序开发非常重要,因为它会影响性能。

      日志记录通常涉及写入文件,并且此类 I/O 操作比基本的 CPU/内存中的流量消耗更多的资源,这可以在示例大规模测试执行中看到,我们可以看到较长的处理时间是忙于记录:

      注意:我是这篇博文的作者,Logging impact on application performance

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-10-17
          • 1970-01-01
          • 2012-05-11
          • 1970-01-01
          • 2019-06-19
          • 1970-01-01
          • 2022-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多