簡體   English   中英

Linux上的虛擬內存大小

[英]Virtual Memory size on Linux

我試圖深入理解OS Linux上的虛擬內存管理。

我真的不明白操作系統如何確定進程的VM大小。

我知道32位x86操作系統可以提供高達3 GB的vm地址空間......它總是如此嗎?

在我的情況下,我有大約110 MB物理內存和32位Linux,我的主進程有一個約660 MB的虛擬機地址空間。 但是,物理內存中只有50 MB(我的進程的RSS),因此我的物理內存不足。 其余的是免費的,幾乎整個頁面緩存使用。 這似乎是一種正常行為。

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

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

為什么操作系統不會擴展我的進程vm大小呢?

有關信息,vm大小是無限的:ulimit -v:無限制

每個進程可以擁有3GB的虛擬內存(大約在許多32位Linux上),並繼續創建占用千兆字節虛擬內存的新進程。 內核中的開銷很小,但虛擬內存非常便宜。 您正在使用的地址空間量可能並不重要,它可能不會觸發OOM殺手。

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

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

聽起來你的過程只是使用了太多的RAM。 RSS是不是內存量的過程中使用,它只是現在在物理內存量。 如果您的進程有內存泄漏並且不斷增長,RSS最終會停止增長 - 因為對於您使用的每個新頁面,內核將從您的進程中逐出一頁。

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

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

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

當進程請求更多的VM空間(通常通過malloc)時,內核將查看所有這些限制,如果超過其中任何一個,將返回0.另一方面,OOM殺手只會在你啟動時啟動'越來越接近VM的總限制。 然而,當OOM殺手殺死你時,你就死了 - 沒有內存錯誤或任何抓住它的機會。

因此,如果您真的遇到了VM的總限制,並希望避免這種情況,您可以分配更多的交換空間,或者除了(首先殺死或不啟動)其他使用大量VM空間的進程以便為你的程序騰出一些東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM