Rhel

Linux 時間包裝器的結果告訴我這個 cp 命令發生了什麼?

  • March 29, 2022

我對這個問題的看法來自開發者方面。我編寫的程式碼放置在作為企業系統中眾多虛擬機之一執行的 RHEL 虛擬機上。正在使用的文件系統是一個遠端的、網路連接的儲存設備。

在批處理過程中,我們對簡單命令有一些高度可變性。所以我們設置了一個測試來獲取更多資訊,但現在我不知道我們發現了什麼。

我們每 30 分鐘執行一次以下命令並記錄輸出。它是一個 6 GB 文件的副本。我看到的是當系統忙於執行大量作業並且此測試命令獲得低 CPU 時間時,經過的時間從 11 秒躍升至 190 秒。

我可以看到的是,當 CPU 較低時,“I”列(文件系統輸入)會被填充,但在 CPU 較高時則不會。“w”列(非自願掉期)也高得多。

我的問題是,當 CPU 時間下降時,這個作業/命令發生了什麼迫使它執行這麼長時間?換入/換出是否將所有數據儲存在其他速度慢得多的設備上?通常,在換入/換出期間會發生什麼?

正在執行的命令:

/usr/bin/time -a -o filename.txt cp file.txt fileCopy.txt

/usr/bin/time 手冊頁中的列描述

e   Elapsed real time (in seconds).
S   Total number of CPU-seconds that the process spent in kernel mode.
U   Total number of CPU-seconds that the process spent in user mode.
P   Percentage of the CPU that this job got, computed as (%U + %S) / %E.
c   Number of times the process was context-switched involuntarily (because the time slice expired).
w   Number of waits: times that the program was context-switched voluntarily, for instance while waiting for an I/O operation to complete.
I   Number of filesystem inputs by the process.
O   Number of filesystem outputs by the process.

這個答案可能不是特定於您的範例,但它是對該問題的更一般的答案Generally, what happens during a swap in/out?請注意,其中一些將是概括性的,為了避免寫一篇關於記憶體管理的博士論文,我會掩蓋很多東西.

簡短的回答是,一切都與記憶體管理有關。在容器內部和容器外部。我們先來看一個非常簡單的案例——從磁碟讀取一些東西。首先,系統將查看您正在讀取數據的變數,並向核心請求那麼多的記憶體空間。由於我們處於一個新啟動的系統中,核心很容易分配記憶體,將其交給程序,然後您將值從磁碟複製到記憶體。簡單,輕鬆,快速。

所以讓我們增加一些複雜性。隨著系統啟動越來越多的作業,CPU 變得更忙(顯然!)。雖然這與記憶體管理沒有直接關係,但它確實與哪些程序獲得 CPU 時間片有關。最容易理解的調度器是循環調度器——核心遍歷它的程序列表,要求 CPU 週期,並按照它們在列表中出現的順序為每個程序提供相同數量的周期。這通常是他們將自己添加到列表中的順序。然後添加程序優先級的概念,這意味著某些特殊程序比其他程序更快地到達列表頂部。一般這類命令的優先級(cp) 將相當低,並且它不會真的太頻繁地要求 CPU 時間,因為它的大部分時間將花在等待磁碟響應上。

順便說一句,您從網路儲存讀取數據的事實增加了更多延遲,因為您不僅要求磁碟設備為您提供數據,而且還要求網路介面為您做一些事情。同樣,與記憶體管理討論沒有直接關係,但網路磁碟比本地磁碟慢,因此您在程序中花費更多時間等待 I/O 請求完成。

現在,讓我們看一個已經執行了一段時間的系統。大多數時候,您會看到“空閒”記憶體值相當低,通常是出乎意料的。這是否意味著 Linux 正在浪費你的記憶體?一點都不。部分記憶體消耗是磁碟記憶體 - 請參閱Linux At All My RAM!了解這方面的背景。

高記憶體使用的另一部分是 Linux 是懶惰的 - 它不做任何它不是絕對必須做的事情。其中之一是將記憶體頁面返回到“空閒”列表。當一個程序完成使用一個記憶體頁面時,核心會將該頁面標記為“乾淨”,但會將其留在“已使用”列表中。這僅僅意味著該頁面可供任何其他程序立即重用。請注意,一個頁面也可以被標記為“臟”——這意味著使用該記憶體的程序已完成並要求將其寫回磁碟,但由於沒有其他程序需要該特定頁面,Linux 正在等待直到其他人實際上需要它來實際將其刷新到磁碟並將頁面標記為可用。這在磁碟記憶體中最常見,但也可以在文件寫入中看到。

因此,我們的系統在“空閒”列表中沒有任何內容,但在“乾淨”和“臟”列表中有很多頁面。隨之而來的是一個新程序,它需要一些記憶體,然後 Linux 必須在“乾淨”或“臟”列表上找到足夠大的空間——如果它是臟的,它必須強制將該頁面刷新到磁碟. 就人類而言,這與從“空閒”列表中分配頁面一樣瞬間發生,但電腦術語實際上需要更長的時間。

在您的情況下,雖然容器本身是新的並且容器內的所有記憶體都是“空閒”的,但執行容器的作業系統可能幾乎沒有剩餘的“空閒”,而是從“乾淨”和“臟”頁面分配列表。當系統繁忙時,臟頁的刷新會更頻繁地發生,增加 IO 等待時間,增加分配記憶體的時間等等。

最重要的是,您的系統執行正常。它應該使不重要的程序(如 a )cp花費更長的時間(增加系統和使用者的時間片time),同時它擔心它正在執行的所有其他程序,尤其是它擁有的更高優先級的程序。是的,真的有可能寫一篇關於 Linux 記憶體管理的博士論文——就是這麼複雜。

引用自:https://unix.stackexchange.com/questions/697177