以另一種方式提出問題,您是否可以確認當您mmap()實際訪問已存在於頁面緩存中的確切物理頁面的文件時?mmap是否直接訪問頁面緩存或頁面緩存的副本?
我問,因爲我正在測試一臺內存爲1TB的192核心機器上,在測試之前預先緩存到頁面緩存中的400GB數據文件上(只需刪除緩存,然後執行md5sum在文件上)。假設它們都(基本上)返回相同的內存區域(或者可能是相同的內存區域,但以某種方式映射多次),我最初分別有192個線程分別映射文件。因此,我假設兩個使用兩個不同映射到同一文件的線程都可以直接訪問相同的頁面。 (讓我們忽略NUMA在這個例子中,雖然他們顯然是在更高的線程數量顯著。)
然而,在實踐中,我發現性能會得到可怕在更高線數時,每個線程分別mmapped文件。當我們刪除它,而只是做了一個傳入線程的mmap(所有線程都直接訪問同一個內存區域),那麼性能會大大提高。
這一切都很棒,但我試圖找出原因。如果實際上映射文件只是授予對現有頁面緩存的直接訪問權限,那麼我認爲它應該映射多少次無關緊要 - 它應該全部放在同一個地方。
但是考慮到有這樣的性能成本,在我看來,實際上每個mmap都是獨立冗餘的(可能是通過從頁面緩存複製,或者可能通過從磁盤再次讀取)。
你可以評論爲什麼我看到共享訪問同一內存之間的這種不同的性能,而不是映射相同的文件?
謝謝,我感謝您的幫助!
這是一個很好的問題。我不認爲我能夠回答,但提供一些建議。 1 /爲什麼不介紹它? perf應該能夠很容易地告訴你瓶頸的位置(我希望)。我的猜測是,你打到mmap(小)的開銷,但在192線程,它不會擴展。另外,你有沒有嘗試使用巨大的頁面? – Aissen
因爲所有有趣的東西都發生在內核的深處,所以配置文件很棘手。就我的應用程序所知,它只是訪問內存 - 但是在內存映射,虛擬內存,頁面緩存,L3緩存和NUMA節點之間,還有很多移動部件需要注意。這就是說,我同意有更多的工作要做,以解決這個問題,但我希望有一個比我更熟悉內核知識的人可以給出一些建議,至少在*理論中應該發生什麼,就像在實踐中指導我的測試。 – quinthar
是的,但通常perf會知道內核在哪裏花費時間,如果你有正確的符號附加。關於你的問題,我不知道問題的根源是什麼。您是否嘗試在較小的機器上重現它? – Aissen