我有多個進程在運行Linux的嵌入式系統中運行。 每個進程都會將其日誌轉儲到其相應的日誌文件 一旦日誌文件達到20MB,日誌將從頂部到底部被覆蓋。當日志大小較大時,性能較差
例子:
如果想,我的日誌有10個線路限制,寫作10日線後,它會回到第1行,並開始了寫作一號線,二號線等。
但是,問題是如果日誌大小較小,可以說5MB,速度更好。 如果日誌大小爲20MB,則它變得越慢,文件越大,系統越慢。
難道有人請解釋它背後的原因嗎?
我有多個進程在運行Linux的嵌入式系統中運行。 每個進程都會將其日誌轉儲到其相應的日誌文件 一旦日誌文件達到20MB,日誌將從頂部到底部被覆蓋。當日志大小較大時,性能較差
例子:
如果想,我的日誌有10個線路限制,寫作10日線後,它會回到第1行,並開始了寫作一號線,二號線等。
但是,問題是如果日誌大小較小,可以說5MB,速度更好。 如果日誌大小爲20MB,則它變得越慢,文件越大,系統越慢。
難道有人請解釋它背後的原因嗎?
覆蓋單行非常慢。因爲你必須在這一行之後重寫全部行。假如你想覆蓋文件中的第一行,所有文件的內容都必須重寫。因爲你無法在隨機位置增長或縮小文件。對於大多數通用文件系統來說,這至少是正確的。唯一的例外是當你的日誌文件的每一行有相同的長度,那麼你可以覆蓋它而不需要增長或縮小文件。
一個更好的概念是對數旋轉。而不是有一個20MB的文件,保持兩個10MB的文件。在第一個達到極限之後,將其移動到第二個文件(從而拋出第二個文件)並再次啓動第一個文件。那麼你將不必重新編寫你的文件。相反,你總是隻是追加到當前日誌,通常是非常快。
我認爲有2個主要原因。 的觀點1)軟件點(Linux內核) 2)的觀點五金點(硬盤假定)的觀點
軟件點: 這取決於使用以及如何有效類型的文件系統的文件系統管理磁盤空間。 Linux有一種叫做「緩衝區緩存」的功能,所有文件系統都使用這種緩存功能,並且每次寫入任何文件都會首先進入緩衝區緩存,並由內核守護程序及時刷新。緩存上的可寫緩衝區數量有一些上限,一旦達到限制,它將把它們沖刷到各個驅動程序,這些驅動程序會將內存刷新到磁盤上。
就像你的情況一樣,重複大約100字節的數據並達到一定的限制時,您將返回到文件的開頭並繼續執行此操作。在此情況下,您在20MB文件上在一段時間內生成的可寫緩衝區塊的數量多於5MB文件。而其他重要的一點是,在20MB文件的情況下,磁盤讀/寫的次數更多,因爲內核會在更大的文件上刷新更多,因爲它可能有更多的髒塊。但是在一個5MB的文件中,髒塊雖然沒有那麼多,但在內核將它們刷新到磁盤之前,仍然可能會覆蓋它們。
硬件觀點: 這取決於爲了讀/寫文件到磁盤而必須進行的旋轉/鼓的移動次數。假設您的Linux內核(文件系統驅動程序)盡力在HDD上分配順序扇區,20MB文件可能佔用散佈在磁盤上的扇區,而5MB幾乎沒有使用大量使用的HDD。這意味着,如果您的文件爲100MB,則與20MB文件相比,速度會更慢。並且,如果反覆覆蓋已寫入的扇區,與20MB的文件相比,在20MB文件的情況下,手臂旋轉會更多。特別是當磁盤訪問更多在20MB的情況下。
這是我認爲會隨着文件大小的增長而使文件讀取/寫入速度變慢。再次,在上面的解釋中,我沒有考慮將多個進程寫入多個文件..它會使讀/寫速度更慢..
Scai:我不明白爲什麼文件的所有內容必須被覆蓋。你能否詳細說明一下? –
@ Saran-san因爲一個文件包含一個或多個特定大小的*塊*。塊不對應於行或單詞或字符或其他任何東西。在更改內容時,至少包含內容的塊必須重寫。但是,如果內容增長或縮小,則以下所有塊也會受到影響,因爲文件內容會連續存儲在這些塊上。 想象一張帶*連續*書寫文字的紙。現在嘗試在某處插入或刪除一個新單詞。所有剩下的內容將不得不移動。 – scai
Scai:我覺得現在有道理。謝謝你的解釋 :) –