2017-07-25 98 views
8

我有一個數據結構,我想重新進行按需分頁。 mmap似乎是運行一些初始實驗的簡單方法。但是,我想限制mmap使用的緩衝區緩存量。該機器有足夠的內存將整個數據結構分頁到緩存中,但出於測試原因(也有一些生產原因),我不想讓它這樣做。用於mmap的限制緩衝區緩存

有沒有辦法限制mmap使用的緩衝區緩存量?

或者,mmap替代方案可以實現類似的功能,但仍會限制內存使用情況。

+2

緩衝區緩存由內核自動維護。它本身不會導致內存不足錯誤。你爲什麼想自己控制它? – fukanchik

+0

@fukanchik由於我的環境,我必須確切知道我的進程將使用多少內存,並將其限制爲此。另外,我有一臺擁有100GB內存的機器,但我想測試軟件,就好像機器只有1GB內存一樣。 – JaredC

+0

我認爲你最好的選擇不是在應用程序內處理這個問題,而是在操作系統層面處理。這是一個很好的起點:https://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process – Frank

回答

3

從我的理解,這是不可能的。內存映射由操作系統控制。內核將以最好的方式決定如何使用可用內存,但它總體上看待系統。我不知道支持進程級緩存的配額(至少,我在Linux或BSD中沒有看到這樣的API)。

madvise提供內核提示,但它不支持限制用於一個進程的緩存。您可以給它一些暗示,例如MADV_DONTNEED,這將減少其他應用程序緩存的壓力,但我認爲它會造成更多的傷害而不是更好,因爲它很可能會使緩存效率降低,這會導致更多的IO負載在系統上。

我只看到兩種選擇。 On試圖解決操作系統級別的問題,另一個是在應用程序級別解決它。

在OS層面上,我看到兩個選項:

  1. 你可以運行一個虛擬機,但最有可能的,這是不是你想要的。我也希望它不會提高整個系統的性能。不過,這至少是一種定義內存消耗上限的方法。
  2. Docker是我想到的另一個想法,也是在操作系統級別上運行,但據我所知,它不支持在高速緩存上定義配額。我不認爲它會起作用。

只留下一個選項,即查看應用程序級別。您可以使用顯式的文件系統操作,而不是使用內存映射文件。如果你需要完全控制緩衝區,我認爲這是唯一可行的選擇。它比內存映射更多的工作,並且不保證性能更好。

如果您希望保留內存映射,那麼也可以只映射內存中的部分文件,並在超出內存配額時取消映射其他部分。它也存在與顯式文件IO操作相同的問題(更多的實現工作和非平凡的調優以找到一個好的緩存策略)。

話雖如此,你可能會質疑限制緩存內存使用的要求。我期望內核在分配內存資源方面做得非常好。至少,這可能會比我繪製的解決方案更好。 (顯式文件IO加上一個內部緩存可能很快,但實現和調整並不是微不足道的,這裏是對比的權衡:mmap() vs. reading blocks

在測試期間,您可以運行應用程序與ionice -c 3nice -n 20稍微減少了對其他生產應用程序的影響。 還有一個工具叫做nocache。我從來沒有使用過它,但在閱讀其文檔時,它似乎與您的問題有些相關。

0

可能通過使用mmap()Linux Control Groups(更一般地,herehere)來完成此操作。安裝完成後,您可以對進程所使用的物理內存量等進行任意限制。作爲一個例子,在這裏我們限制了物理內存爲128兆內存和交換內存爲256兆:

cgcreate -g memory:/limitMemory 
echo $((128 * 1024 * 1024)) > /sys/fs/cgroup/memory/limitMemory/memory.limit_in_bytes 
echo $((256 * 1024 * 1024)) > /sys/fs/cgroup/memory/limitMemory/memory.memsw.limit_in_bytes 
1

我會去在一個時刻的文件,只圖件的途徑,所以你可以保留在準確全面控制使用多少內存。

-1

您可能會使用ipc共享內存段,您將成爲您的內存段的主人。