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