簡體   English   中英

mmap是否直接訪問頁面緩存或頁面緩存的副本?

[英]Does mmap directly access the page cache, or a copy of the page cache?

要以另一種方式提出問題,您是否可以確認當mmap()文件時,您實際上訪問了頁面緩存中已有的確切物理頁面?

我問,因為我正在測試具有1TB RAM的192核心機器上的400GB數據文件,該文件在測試之前預先緩存到頁面緩存中(通過刪除緩存,然后對文件執行md5sum) 。

最初,我有所有192個線程,每個mmap單獨mmap文件,假設他們將(基本上)得到(基本上)相同的內存區域(或可能相同的內存區域,但不知何故映射多次)。 因此,我假設使用兩個不同映射到同一文件的兩個線程都可以直接訪問相同的頁面。 (讓我們在這個例子中忽略NUMA,但顯然它在較高的線程數時很重要。)

然而,在實踐中,我發現性能會得到更高的線程數量可怕的 ,當每個線程分別mmapped文件。 當我們刪除它而只是做了一個傳遞給線程的mmap(這樣所有線程只是直接訪問相同的內存區域),然后性能得到了顯着提高。

這一切都很棒,但我想弄明白為什么。 如果事實上mmapping文件只是授予對現有頁面緩存的直接訪問權限,那么我認為映射它的次數並不重要 - 它應該全部轉到完全相同的位置。

但鑒於存在這樣的性能成本,在我看來,實際上每個mmap都是獨立且冗余填充的(可能是通過從頁面緩存中復制,或者可能是從磁盤再次讀取)。

您能否評論為什么我在同一內存的共享訪問與映射同一文件之間看到如此不同的性能?

謝謝,謝謝你的幫助!

我想我找到了答案,它處理的是頁面目錄。 答案是肯定的,同一文件的兩個mmapped區域將訪問相同的底層頁面緩存數據。 但是,每個映射都需要將每個虛擬頁面獨立映射到物理頁面 - 這意味着頁面目錄中的條目數量是訪問同一RAM的2倍。

基本上,每個mmap()都在虛擬內存中創建一個新范圍。 該范圍的每個頁面對應一個物理內存頁面,該映射存儲在分層頁面目錄中 - 每4KB頁面有一個條目。 因此,大區域的每個mmap()都會在頁面目錄中生成大量條目。

我的猜測是它實際上並沒有預先定義它們,這就是為什么即使對於一個巨大的文件,mmap()也可以即時調用。 但隨着時間的推移,它可能必須建立這些條目,因為mmapped范圍存在缺陷,這意味着隨着時間的推移它被填寫。 填充頁面目錄的額外工作可能是使用不同mmaps的線程比共享同一mmap的線程慢的原因。 我打賭內核需要在取消映射范圍時擦除所有這些條目 - 這就是unmmap()速度太慢的原因。

(還有翻譯后備緩沖區,但這是每個CPU,而且這么小我覺得這里不重要。)

無論如何,這聽起來像重新映射相同的區域只會增加額外的開銷,因為在我看來似乎沒有收獲。

暫無
暫無

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

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