我正試圖模擬內存稀釋。所以這裏是我在想什麼:Linux:手動減小堆大小
- 關閉提交。
- 減少可用的堆,以便內存耗盡可以更快地發生。
- 運行被測程序。
我的問題是w.r.t 2:是否有一種方法可以減少內核將分配的堆大小?我大概可以編寫另一個分配大量內存的程序,但是可能有一個更明智的方法?
我正試圖模擬內存稀釋。所以這裏是我在想什麼:Linux:手動減小堆大小
我的問題是w.r.t 2:是否有一種方法可以減少內核將分配的堆大小?我大概可以編寫另一個分配大量內存的程序,但是可能有一個更明智的方法?
您可以使用系統調用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,靜態數據。
如果使用ulimit -d
,則可以限制用於堆分配的數據段大小(以及全局/靜態變量)。
要模擬內存耗盡,還可以使用mmap映射大內存段,並確保將其「鎖定」在內存中。有關如何鎖定內存頁面的信息,請參閱mmap手冊頁。這樣,這些不會被交換,並且可用內存將會減少。
如果對大型連續mmap段的請求失敗,您可能需要請求幾個小尺寸的段(例如256KB)。更重要的是,如果你想一路走下去,你可能需要讓你的mmap進程免於Linux的「OOM殺手」(通過設置OOM prio爲-17)。否則,當Linux發現系統在空閒內存上運行得太低時,它可能會選擇並終止正在調用mmaps的進程,試圖釋放內存。