2013-08-02 44 views
0

我有多个进程在运行Linux的嵌入式系统中运行。 每个进程都会将其日志转储到其相应的日志文件 一旦日志文件达到20MB,日志将从顶部到底部被覆盖。当日志大小较大时,性能较差

例子:

如果想,我的日志有10个线路限制,写作10日线后,它会回到第1行,并开始了写作一号线,二号线等。

但是,问题是如果日志大小较小,可以说5MB,速度更好。 如果日志大小为20MB,则它变得越慢,文件越大,系统越慢。

难道有人请解释它背后的原因吗?

回答

2

覆盖单行非常慢。因为你必须在这一行之后重写全部行。假如你想覆盖文件中的第一行,所有文件的内容都必须重写。因为你无法在随机位置增长或缩小文件。对于大多数通用文件系统来说,这至少是正确的。唯一的例外是当你的日志文件的每一行有相同的长度,那么你可以覆盖它而不需要增长或缩小文件。

一个更好的概念是对数旋转。而不是有一个20MB的文件,保持两个10MB的文件。在第一个达到极限之后,将其移动到第二个文件(从而抛出第二个文件)并再次启动第一个文件。那么你将不必重新编写你的文件。相反,你总是只是追加到当前日志,通常是非常快。

+0

Scai:我不明白为什么文件的所有内容必须被覆盖。你能否详细说明一下? –

+1

@ Saran-san因为一个文件包含一个或多个特定大小的*块*。块不对应于行或单词或字符或其他任何东西。在更改内容时,至少包含内容的块必须重写。但是,如果内容增长或缩小,则以下所有块也会受到影响,因为文件内容会连续存储在这些块上。 想象一张带*连续*书写文字的纸。现在尝试在某处插入或删除一个新单词。所有剩下的内容将不得不移动。 – scai

+0

Scai:我觉得现在有道理。谢谢你的解释 :) –

1

我认为有2个主要原因。 的观点1)软件点(Linux内核) 2)的观点五金点(硬盘假定)的观点

软件点: 这取决于使用以及如何有效类型的文件系统的文件系统管理磁盘空间。 Linux有一种叫做“缓冲区缓存”的功能,所有文件系统都使用这种缓存功能,并且每次写入任何文件都会首先进入缓冲区缓存,并由内核守护程序及时刷新。缓存上的可写缓冲区数量有一些上限,一旦达到限制,它将把它们冲刷到各个驱动程序,这些驱动程序会将内存刷新到磁盘上。

就像你的情况一样,重复大约100字节的数据并达到一定的限制时,您将返回到文件的开头并继续执行此操作。在此情况下,您在20MB文件上在一段时间内生成的可写缓冲区块的数量多于5MB文件。而其他重要的一点是,在20MB文件的情况下,磁盘读/写的次数更多,因为内核会在更大的文件上刷新更多,因为它可能有更多的脏块。但是在一个5MB的文件中,脏块虽然没有那么多,但在内核将它们刷新到磁盘之前,仍然可能会覆盖它们。

硬件观点: 这取决于为了读/写文件到磁盘而必须进行的旋转/鼓的移动次数。假设您的Linux内核(文件系统驱动程序)尽力在HDD上分配顺序扇区,20MB文件可能占用散布在磁盘上的扇区,而5MB几乎没有使用大量使用的HDD。这意味着,如果您的文件为100MB,则与20MB文件相比,速度会更慢。并且,如果反复覆盖已写入的扇区,与20MB的文件相比,在20MB文件的情况下,手臂旋转会更多。特别是当磁盘访问更多在20MB的情况下。

这是我认为会随着文件大小的增长而使文件读取/写入速度变慢。再次,在上面的解释中,我没有考虑将多个进程写入多个文件..它会使读/写速度更慢..