簡體   English   中英

mmapped大文件的窗口控制(linux,mmap)

[英]Window control for mmapped large file(linux, mmap)

映射大文件時如何控制RSS中的窗口? 現在讓我解釋一下我的意思。 例如,我們有一個超過 RAM 數倍的大文件,我們為多個進程進行共享內存映射,如果我們訪問某個虛擬地址位於此映射內存中的對象並捕獲頁面錯誤,然后從磁盤讀取,子問題是,如果我們不再使用給定的對象,是否會發生相反的情況? 如果像LRU一樣發生這種情況,那么LRU的大小是多少,如何控制呢? 這種情況下如何涉及頁面緩存?

RSS圖

這是 80 GB tar 文件的測試實例(2 線程,8 GB RAM)的 RSS 圖。 這個 3800 MB 的值是從哪里來的,並且當我在文件被映射后運行它時保持穩定? 我如何控制它(或建議內核控制它)?

只要您不采取顯式操作將頁面鎖定在內存中,它們最終就會自動換回。 內核基本上使用內存壓力試探法來決定將多少物理內存用於換入頁面,並根據需要經常重新平衡。

如果您想在控制此過程中發揮更積極的作用,請查看madvise()系統調用

這允許您調整您的 mmap 的分頁算法,操作如下:

  • MADV_FREE (自 Linux 4.5 起)

    • 應用程序不再需要 addr 和 len 指定范圍內的頁面。 內核因此可以釋放這些頁面,但釋放可能會延遲到發生內存壓力時。 ...
  • MADV_COLD (自 Linux 5.4 起)

    • 停用給定范圍的頁面。 如果存在內存壓力,這將使頁面更有可能成為回收目標。
  • MADV_SEQUENTIAL

    • 期望頁面引用按順序排列。 (因此,給定范圍內的頁面可以被積極地提前讀取,並可能在訪問后很快被釋放。)
  • MADV_WILLNEED

    • 期待在不久的將來訪問。 (因此,提前閱讀一些頁面可能是個好主意。)
  • MADV_DONTNEED

    • 不要指望在不久的將來訪問。 (暫時,應用程序在給定范圍內完成,因此內核可以釋放與其關聯的資源。)...

在創建mmap后發出madvise(MADV_SEQUENTIAL)可能足以獲得可接受的行為。 如果沒有,您還可以在遍歷頁面組時穿插一些MADV_WILLNEED / MADV_DONTNEED訪問提示(和/或MADV_FREE / MADV_COLD )。

暫無
暫無

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

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