2011-09-28 123 views
4

我想深入瞭解OS Linux上的虛擬內存管理。Linux上的虛擬內存大小

我真的不明白操作系統如何確定虛擬機的大小的過程。

我知道,一個32位的x86操作系統可以到3 GB的虛擬尋址空間放棄...它始終是真的嗎?

在我的情況,我有大約110 MB與物理存儲器和32位Linux和我的主要過程有一個VM尋址空間約660 MB。但是,物理內存(我的進程中的RSS)只有50 MB,因此我的物理RAM未滿。其餘的都是免費的,幾乎整個頁面都被頁面緩存使用。這似乎是一種正常的行爲。

如果我檢查/ proc/my_process_PID/SMAP,有幾個8 MB匿名VMA。

我的實際問題是我需要在代碼中做一個額外的10 MB malloc,但不幸的是OOM殺手殺死了我的進程(內存不足)...我認爲沒有更多的免費可用頁面堆的vm,不是嗎?某處存在巨大的內存泄漏嗎?

爲什麼OS不延長我的過程中VM的大小呢?

有關信息提供虛擬機的大小是無限的:-v的ulimit:無限

+0

你的問題到底是什麼;你期望操作系統給你不存在的內存?機器是否具有頁面文件或磁盤形式的任何「支持存儲」? – wildplasser

+0

我「不能」理解的是我的操作系統爲110 MB的物理內存提交了大約660 MB的虛擬內存,現在操作系統不允許我在進程中分配額外的10 MB。爲什麼他不將vm大小擴展到670 MB? –

+0

660/110有六倍過度使用。這很難。但請記住:還有其他過程。 (試圖找出哪些;也許你可以在那裏削減)而操作系統想要爲新啓動的進程和緩衝區保留一些冗餘內存。 – wildplasser

回答

8

可以有3GB的每個進程的虛擬內存(約,在很多32位Linux),並不斷創造新的進程佔用了千兆字節以千兆字節爲單位的虛擬內存。內核的開銷很小,但虛擬內存非常便宜。您使用的地址空間量可能並不重要,它可能不會觸發OOM殺手。

但是,您的系統只有這麼多RAM。當您在地址空間(寫入)中使用頁面啓動時,內核被迫查找物理RAM來映射它們。如果沒有物理RAM,內核可以從RAM中驅逐其他頁面 - 將它們交換出來或丟棄它們。但是如果它不能驅逐任何頁面,那麼它會觸發OOM殺手。

用完地址空間將導致malloc在我的系統上返回NULL,而不是觸發OOM殺手。

這聽起來像你的過程只是使用太多的RAM。 RSS不是您的進程使用的內存量,而只是物理內存量。如果你的進程存在內存泄漏並且持續增長,RSS最終會停止增長 - 因爲對於你使用的每一個新頁面,內核都會從你的進程中逐出一頁。

嘗試使用內存設置,像Valgrind的。這將幫助你理清你應該擔心的內存(malloc)以及你可以忽略的內存(共享庫和其他內存映射文件)。內核(和/ proc)不會給你足夠的細節。

1

Linux系統上可用的虛擬內存空間總量(大致)爲RAM + swap space-kernel overhead。 RAM是您安裝的硬件,內核開銷大致是一個常量(不同內核版本之間有所不同),因此控制可用虛擬機總空間的唯一簡單方法是添加或刪除交換空間。

除了總限制之外,還有每個進程的VM限制。這是可配置的,並且(至少在32位linux上)最多爲3GB,但可能會少一些。 ulimit -v會告訴你這個限制或可以用來改變它。

當一個進程請求更多的VM空間(通常是通過malloc的),內核將考慮所有的這些限制,以及其中是否會被超越,將只返回0。OOM殺手,而另一方面,當您接近總VM限制時開始投入。但是,當OOM殺手殺死你時,你就會死亡 - 沒有內存不足的錯誤或任何機會來捕捉它。因此,如果你真的遇到總的VM限制,並且想要避免這種情況,你可以分配更多的交換空間,或者擺脫(殺死或不首先啓動)其他正在使用的進程大量的虛擬機空間,以釋放一些爲您的程序。