Unix命令告訴程序執行期間使用了多少RAM?
假設我正在執行一個腳本(例如在 Python 中)。為了找出程序花了多長時間,一個人會執行
time python script1.py
是否有一個命令可以跟踪腳本執行時使用了多少 RAM?為了找出有多少 RAM 可用,可以使用
free
,但此命令不適合上述任務。
time(1)命令(您可能需要安裝它-也許作為包-
time
,它應該在 中/usr/bin/time
)接受許多參數,包括一個可以理解的格式字元串(帶-f
或--format
)(以及其他)%M Maximum resident set size of the process during its lifetime,
in Kbytes.
%K Average total (data+stack+text) memory use of the process, in
Kbytes.
不要將該
/usr/bin/time
命令與time
內置的 bash混淆。您可能需要輸入完整的文件路徑/usr/bin/time
(要求您的 shell 執行命令而不是內置命令)或輸入command time
或\time
(感謝Toby Speight & to Arrow的評論)。所以你可以試試(RSS 是resident set size)
/usr/bin/time -f "mem=%K RSS=%M elapsed=%E cpu.sys=%S user=%U" python script1.py
你也可以試試
/usr/bin/time --verbose python script1.py
你在問:
腳本執行時使用了多少 RAM?
這表明您的誤解。在 Linux(或任何現代多程序作業系統)上執行的應用程序正在使用虛擬記憶體,每個程序(包括
python
執行腳本的程序)都有自己的虛擬地址空間。程序不直接在物理RAM 中執行,但有自己的虛擬地址空間(並在其中執行),核心通過複雜的按需分頁實現虛擬記憶體,使用惰性寫時複製技術並配置MMU。RAM是在內部使用和管理的物理設備和資源由核心實現虛擬記憶體(另請閱讀有關頁面記憶體和抖動的資訊)。您可能想花幾天時間了解有關作業系統的更多資訊。我推薦閱讀作業系統:三個簡單的部分,這是一本可免費下載的書。RAM 由整個作業系統使用(不是直接由單個程序使用),並且給定程序的 RAM 中的實際頁面可能會隨時間變化(並且可能以某種方式與其他程序共享)。因此,給定程序的 RAM 消耗沒有很好的定義,因為它在不斷變化(您可能想要它的平均值或峰值等),同樣對於它的虛擬地址空間的大小也是如此。
您還可以使用(特別是如果您的腳本執行幾秒鐘)top(1)實用程序(可能在其他一些終端中),或ps(1)或pmap(1) -也許使用watch(1)重複該操作
ps
或pmap
命令. 您甚至可以直接使用/proc/
(參見proc(5) …),也許是watch cat /proc/$(pidof python)/status
or/proc/$(pidof python)/stat
or/proc/$(pidof python)/maps
etc…但是對於給定程序, RAM 使用量(由核心對某些程序)**隨時間變化***很大(***甚至它的虛擬地址空間也在變化,例如通過呼叫mmap(2)並由ld-linux(8)
munmap
使用,dlopen( 3),malloc(3) &以及 Python 解釋器所需的許多其他函式…)。free
您還可以使用strace(1)來了解 Python 為您的腳本執行的系統呼叫(這樣您就會了解它如何使用
mmap
&munmap
和其他系統呼叫(2))。您可能會限製或僅獲取strace
與記憶體(即虛擬地址空間)相關的系統呼叫。-e trace=%memory``-e trace=memory
順便說一句,tracemalloc Python 功能也可能很有用。
我猜您只關心虛擬記憶體,即虛擬地址空間(而不是 RAM),Python 解釋器使用它來執行您的 Python 腳本。這在流程執行期間正在發生變化。RSS(或虛擬地址空間的最大峰值大小)實際上可能更有用。
另請參閱LinuxAteMyRAM。