2013-04-09 62 views
2

我正試圖模擬內存稀釋。所以這裏是我在想什麼:Linux:手動減小堆大小

  1. 關閉提交。
  2. 減少可用的堆,以便內存耗盡可以更快地發生。
  3. 運行被測程序。

我的問題是w.r.t 2:是否有一種方法可以減少內核將分配的堆大小?我大概可以編寫另一個分配大量內存的程序,但是可能有一個更明智的方法?

回答

6

您可以使用系統調用ulimit刪除最大進程內存大小。該命令可從shell獲得。有問題的選項是-v(最大內存大小),因此,例如過程限制到最大2GB的,你會怎麼做:

ulimit -v 2097152 

然後你再從外殼啓動進程。

如果使用-H選項來限制ulimit,那麼它會設置一個硬限制,一旦它被設置就不能增加(root可以增加限制)。

如果你想從一個程序的控制,您可以使用setrlimit系統調用的方式,如:

#include <sys/types.h> 
#include <sys/resource.h> 

struct rlimit the_limit = { 2097152 * 1024, RLIM_INFINITY }; 
if (-1 == setrlimit(RLIMIT_AS, &the_limit)) { 
    perror("setrlimit failed"); 
} 

這臺軟限制2GB,你可以通過改變RLIM_INFINITY設定的硬性限制值。請注意,如果您是根,您只能增加硬性限制。

此限制適用於可用於進程的內存總量,而不僅限於可用作堆的內存。

使用-d選項可以限制堆內存。撥打setrlimit的等效名稱是RLIMIT_DATA。此限制僅適用於內存分配 - 例如malloc,mmap,靜態數據。

2

如果使用ulimit -d,則可以限制用於堆分配的數據段大小(以及全局/靜態變量)。

0

要模擬內存耗盡,還可以使用mmap映射大內存段,並確保將其「鎖定」在內存中。有關如何鎖定內存頁面的信息,請參閱mmap手冊頁。這樣,這些不會被交換,並且可用內存將會減少。

如果對大型連續mmap段的請求失敗,您可能需要請求幾個小尺寸的段(例如256KB)。更重要的是,如果你想一路走下去,你可能需要讓你的mmap進程免於Linux的「OOM殺手」(通過設置OOM prio爲-17)。否則,當Linux發現系統在空閒內存上運行得太低時,它可能會選擇並終止正在調用mmaps的進程,試圖釋放內存。