【问题标题】:When log size is bigger, performance is low日志大小越大,性能越低
【发布时间】:2013-08-03 09:05:02
【问题描述】:

我有多个进程在运行 Linux 的嵌入式系统中运行。 每个进程都会将它们的日志转储到其对应的日志文件中, 一旦日志文件达到 20MB,日志将从上到下被覆盖。

例子:

如果假设,我的日志有 10 行限制,写完第 10 行后,它会回到第 1 行,重新开始写第 1 行、第 2 行等等。

但是,问题是如果日志大小更小,比如说 5MB,速度会更好。 如果日志大小为 20MB 会变慢,文件越大,系统越慢。

有人能解释一下背后的原因吗?

【问题讨论】:

    标签: linux performance file logging


    【解决方案1】:

    覆盖单行非常慢。因为您也必须在此行之后重写 all 行。假设您要覆盖文件中的第一行,则必须重写文件的所有内容。因为您不能在随机位置增大或缩小文件。对于大多数常见的文件系统来说,这至少是正确的。唯一的例外是当您的日志文件的每一行都具有相同的长度时,您可以直接覆盖它而无需扩大或缩小文件。

    一个更好的概念是日志轮换。不要拥有一个 20MB 的文件,而是保留两个 10MB 的文件。在第一个文件达到限制后,您将其移动到第二个文件(从而丢弃第二个文件)并再次启动第一个文件。这样您就不必重新编写文件了。相反,您总是只是追加到当前日志,这通常非常快。

    【讨论】:

    • Scai:我不明白为什么文件的所有内容都必须被覆盖。能详细点吗?
    • @Saran-san 因为一个文件由一个或多个特定大小的组成。块不对应于行、单词、字符或其他任何东西。当改变内容时,至少包含内容的块必须被重写。但是,如果内容增长或缩小,所有以下块也会受到影响,因为文件内容是在这些块上连续存储的。想象一张纸,上面有连续的文字。现在尝试在某处插入或删除一个新单词。所有剩余的内容都必须移动。
    • Scai:我觉得现在说得通了。谢谢你的解释:)
    【解决方案2】:

    我认为有两个主要原因。 1)软件观点(Linux Kernel) 2) 硬件角度(假设为硬盘)

    软件观点: 它取决于使用的文件系统的类型以及文件系统管理磁盘空间的效率。 Linux 有一种称为“缓冲区缓存”的东西,它被所有文件系统使用,每次对任何文件的写入都首先进入缓冲区缓存,并由内核守护进程及时刷新。缓存上的可写缓冲区块的数量有一些上限,一旦达到限制,它将刷新到相应的驱动程序,然后再刷新到磁盘..

    在您的情况下,例如,如果您重复写入大约 100 字节的数据并达到一定的限制,您将返回文件的开头并继续此操作。在这种情况下,可写缓冲区的数量会阻止您与 5MB 文件相比,在一段时间内生成 20MB 文件更多。另一个重要的一点是,在 20MB 文件的情况下,磁盘读/写次数更多,因为内核在更大的文件上刷新更多,因为它可能有更多的脏块。但是在一个 5MB 的文件上,脏块虽然没有那么多,你仍然可以在内核将它们刷新到磁盘之前覆盖它们。

    硬件观点: 这取决于为了将文件读/写到磁盘而必须发生的旋转/鼓运动的次数。假设您的 linux 内核(文件系统驱动程序)尽最大努力在 HDD 上分配顺序扇区,则 20MB 文件可能会占用分散在磁盘上的扇区,而 5MB 则几乎不分散,尤其是使用大量使用的 HDD。这意味着,如果您的文件为 100MB,与 20MB 文件相比,它会慢得多。而且由于您将反复覆盖已写入的扇区,因此与 20MB 文件相比,arm spin 会更多5MB 文件,尤其是在 20MB 的情况下磁盘访问更多..

    这就是我认为随着文件大小的增长,文件读/写速度会变慢的原因。再说一次,在上面的解释中,我没有考虑多个进程写入多个文件。它会使对 HDD 的读/写甚至更慢..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 2022-11-02
      • 2014-05-02
      • 1970-01-01
      • 2017-02-08
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多