我有多个进程在运行 Linux 的嵌入式系统中运行。每个进程都会将其日志转储到其相应的日志文件中,一旦日志文件达到 20MB,日志将从上到下被覆盖。
例子:
如果假设,我的日志有 10 行限制,写完第 10 行后,它会回到第 1 行并重新开始写第 1 行、第 2 行等等。
但是,问题是如果日志大小更小,比如 5MB,速度会更好。如果日志大小为 20MB,它会变慢,文件大小越大,系统越慢。
有人可以解释一下背后的原因吗?
我有多个进程在运行 Linux 的嵌入式系统中运行。每个进程都会将其日志转储到其相应的日志文件中,一旦日志文件达到 20MB,日志将从上到下被覆盖。
例子:
如果假设,我的日志有 10 行限制,写完第 10 行后,它会回到第 1 行并重新开始写第 1 行、第 2 行等等。
但是,问题是如果日志大小更小,比如 5MB,速度会更好。如果日志大小为 20MB,它会变慢,文件大小越大,系统越慢。
有人可以解释一下背后的原因吗?
覆盖单行非常慢。因为您也必须重写此行之后的所有行。假设您要覆盖文件中的第一行,则必须重写文件的所有内容。因为您不能在随机位置增大或缩小文件。对于大多数常见的文件系统来说,这至少是正确的。唯一的例外是当您的日志文件的每一行都具有相同的长度时,您可以直接覆盖它而无需扩大或缩小文件。
一个更好的概念是日志轮换。不要拥有一个 20MB 的文件,而是保留两个 10MB 的文件。在第一个文件达到限制后,您将其移动到第二个文件(从而丢弃第二个文件)并再次启动第一个文件。这样您就不必重新编写文件了。相反,您总是只是附加到通常非常快的当前日志。
我认为有两个主要原因。1) 软件观点(Linux 内核) 2) 硬件观点(假设为硬盘)
软件观点:这取决于使用的文件系统的类型以及文件系统管理磁盘空间的效率。Linux 有一种称为“缓冲区缓存”的东西,所有文件系统都使用它,每次写入任何文件都首先进入缓冲区缓存,并由内核守护进程及时刷新。缓存中可写缓冲区块的数量有一些上限,一旦达到限制,它将刷新到相应的驱动程序,然后再刷新到磁盘。
与您的情况一样,例如,如果您重复写入大约 100 字节的数据并达到一定的限制,您将返回文件的开头并继续此操作。在这种情况下,您生成的可写缓冲区块的数量超过与 5MB 文件相比,20MB 文件的时间段更长。另一个重要的一点是,在 20MB 文件的情况下,磁盘读/写次数更多,因为内核在更大的文件上刷新更多,因为它可能有更多的脏块。但是在一个 5MB 的文件上,脏块虽然没有那么多,你仍然可以在内核将它们刷新到磁盘之前覆盖它们。
硬件观点:这取决于为了将文件读/写到磁盘而必须发生的旋转/鼓移动的数量。假设您的 linux 内核(文件系统驱动程序)尽最大努力在 HDD 上分配顺序扇区,则 20MB 文件可能会占用分散在磁盘上的扇区,而 5MB 则几乎不分散,尤其是使用大量使用的 HDD。这意味着,如果您的文件为 100MB,与 20MB 文件相比,它会慢得多。而且由于您将反复覆盖已写入的扇区,因此与 20MB 文件相比,arm spin 会更多5MB 文件,尤其是在 20MB 的情况下磁盘访问更多..
这就是我认为随着文件大小的增长,文件读/写速度会变慢的原因。再次,在上面的解释中,我没有考虑多个进程写入多个文件。它会使读/写甚至更慢到硬盘..