在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

內存內核中發生頁面遷移的典型場景

Linux愛好者 ? 來源:知乎 ? 2023-11-08 12:28 ? 次閱讀

1. 概述

頁面遷移(page migrate)最早是為NUMA系統提供一種將進程頁面遷移到指定內存節點的能力用來提升訪問性能。后來在內核中廣泛被使用,如內存規整、CMA、內存hotplug等。

頁面遷移對上層應用業務來說是不可感知的,因為其遷移的是物理頁面,而應用只訪問的是虛擬內存。內核遷移完成后,更新修改對應頁表指向遷移后的頁面即可。當然了這里說的不可感知是指業務不太關注,也不需要做對應修改。實際上有些場景發生頁面遷移是業務性能是有影響的,下面會詳細描述。

2. 典型場景

我們列舉2個內核中發生頁面遷移的典型場景。

2.1 NUMA Balancing引起的頁面遷移

在典型 NUMA 中,存在多個 node, 本地 CPU 訪問本地 node 節點對應的 memory 性能會快一些。

8acebe30-7dea-11ee-939d-92fbcf53809c.png

Linux 的 NUMA 自動均衡機制會嘗試將內存遷移到正在訪問它的 CPU 節點所在的 node。如下圖所示,CPU24 ~ CPU47訪問不是本地 node 對應的 memory,性能會比較慢,系統會將其遷移到本地 node 對應的 memory 以提升訪問性能。

8af5dbbe-7dea-11ee-939d-92fbcf53809c.png

遷移后如下圖:

8b1387d6-7dea-11ee-939d-92fbcf53809c.png

2.2 內存碎片整理

系統使用一段時候后,由于內存碎片的原因,較難滿足連續內存需求,如果需要分配連續大塊內存,需要進行內存規整以形成大塊連續內存,頁面遷移是內存碎片整理的基礎。

3. 實現分析

3.1 遷移模式

內核中通過接口migrate_pages實現頁而遷移, 分為3個模式。

模式 簡介 應用場景
MIGRATE_ASYNC 異步遷移,過程中不會發生阻塞 內存分配slowpath
MIGRATE_SYNC_LIGHT 輕度同步遷移,允許大部分的阻塞操作,唯獨不允許臟頁的回寫操作 kcompactd觸發的規整
MIGRATE_SYNC 同步遷移,遷移過程會發生阻塞,若需要遷移的某個page正在writeback或被locked會等待它完成 sysfs主動觸發的內存規整
MIGRATE_SYNC_NO_COPY 同步遷移,但不等待頁面的拷貝過程。頁面的拷貝通過回調migratepage(),過程可能會涉及DMA migrate_vma_pages

3.2 實現流程

內核文檔有描述這個API是怎么工作的。不過這個描述著實是不太友好, 不容易在腦海形成畫面。

8b3ac846-7dea-11ee-939d-92fbcf53809c.png

我們通過結合代碼實現,把這個轉化為流程圖:

8b69551c-7dea-11ee-939d-92fbcf53809c.jpg

總結一下,頁面遷移過程本質就是分配一個 new_page, 解除原有 page 映射,把舊 page 復制到新 page 并建立新 page 的映射。

4. 頁面遷移過程用戶態訪問處理

到這里可能會有疑問:如果在頁面遷移過程中,應用發生發訪問這個遷移中的頁面,會發生什么?

情景1: 舊頁面的頁表還未解映射, 此時發生缺頁可以正常訪問原來頁面。

8b85670c-7dea-11ee-939d-92fbcf53809c.jpg

情景2: 舊頁面解除了映射,但新頁面還未建立映射。這時訪問會發生等待,需要等新頁面建立映射并copy完成頁面后才能訪問。

8b964086-7dea-11ee-939d-92fbcf53809c.jpg

情景3: 完成了頁面遷移動作,可以正常訪問新頁面了。

8baf4310-7dea-11ee-939d-92fbcf53809c.jpg

下面我們重點分析一下,當舊頁面解除了映射,且新頁面未建立映射這個過程中發生了用戶態訪問,內核的處理流程是怎樣的。

首先我們看一下舊頁面解除了映射的過程:

staticbooltry_to_unmap_one(structpage*page,structvm_area_struct*vma,
unsignedlongaddress,void*arg)
{
...
if(PageHWPoison(page)&&!(flags&TTU_IGNORE_HWPOISON)){

...
}elseif(pte_unused(pteval)&&!userfaultfd_armed(vma)){
...
}elseif(IS_ENABLED(CONFIG_MIGRATION)&&
(flags&(TTU_MIGRATION|TTU_SPLIT_FREEZE))){
// 頁面遷移會設置TTU_MIGRATION標記,走到這個分支來
swp_entry_tentry;
pte_tswp_pte;

if(arch_unmap_one(mm,vma,address,pteval)

解除映射后,再次發生映射就走到do_swap_page中了。

vm_fault_tdo_swap_page(structvm_fault*vmf)
{
...
//獲取到這是一個在遷移過程的的PTE的標識
entry=pte_to_swp_entry(vmf->orig_pte);
if(unlikely(non_swap_entry(entry))){//不是傳統的Swapentry
if(is_migration_entry(entry)){//是遷移標記進來的
/*等待migration的完成。本質是在等待舊page釋放其page lock
*最終調用到wait_on_page_bit_common
*/
migration_entry_wait(vma->vm_mm,vmf->pmd,vmf->address);
}
...
}

總結一下:

頁面遷移前,首先會獲取舊頁面和新頁面的頁面鎖PG_lock,在解除映射的時候傳入了由于頁面遷移導致的解映射標記TTU_MIGRATION,設置了此標記會生成一個帶頁面遷移標識的swap_entry設置到pte中。在設置好的那一刻走,應用進程無法很順利地訪問這個頁面了,需要通過do_swap_entry路徑。

假如此時應用進程訪問了這個頁面,會走進到do_swap_entry,取出帶遷移標識的swap_entry,識別到這個標識,會等待頁面鎖釋放。頁面鎖只有在頁面遷移完成后才會被釋放,也就是會發生等待直到頁面遷移完成。

5. 用戶態如何避免發生頁面遷移

上面我們已經知道,如果有頁面遷移過程中發生用戶態訪問,很可能是需要發生等待其遷移完成, 這個過程需要一定耗時。而有時的場景我們是需要避免此種時延抖動,那有什么辦法呢?

方法就是讓這個頁面短時間內變得不可移動。

intmigrate_page_move_mapping(structaddress_space*mapping,
structpage*newpage,structpage*page,intextra_count)
{
...
if(page_count(page)!=expected_count)
return-EAGAIN;
...
returnMIGRATEPAGE_SUCCESS;
}

可以看到當發生頁面復制過程中,如果 page 的引用計數不符合預期(期望為0)時,這時系統認為有人在使用,不適用做遷移。那么,我們只需要增加 page 的引用計數就可以。

可以在不想被遷移的時間段開始前通過pin_user_pages這樣的接口,結束時unpin就可以了。接口最終會調到try_grab_page增加引用計數。

bool__must_checktry_grab_page(structpage*page,unsignedintflags)
{
...
refs=GUP_PIN_COUNTING_BIAS;//#defineGUP_PIN_COUNTING_BIAS(1U<

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10995

    瀏覽量

    214849
  • 內存
    +關注

    關注

    8

    文章

    3096

    瀏覽量

    74828
  • CMA
    CMA
    +關注

    關注

    0

    文章

    27

    瀏覽量

    9916
  • 虛擬內存
    +關注

    關注

    0

    文章

    77

    瀏覽量

    8175

原文標題:圖解|內存頁面遷移技術

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux內存管理之頁面回收

    請求調頁機制,只要用戶態進程繼續執行,他們就能獲得頁框,然而,請求調頁沒有辦法強制進程釋放不再使用的頁框。因此,遲早所有空閑內存將被分配給進程和高速緩存,Linux內核頁面回收算法(PFRA)采取從用戶進程和
    發表于 05-19 14:09 ?1185次閱讀
    Linux<b class='flag-5'>內存</b>管理之<b class='flag-5'>頁面</b>回收

    走進Linux內存系統探尋內存管理的機制和奧秘

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹Linux 內存組織結構和頁面布局,
    的頭像 發表于 01-05 09:47 ?1799次閱讀

    Linux內核內存泄漏怎么辦

    在Linux內核開發中,Kmemleak是一種用于檢測內核內存泄漏的工具。
    發表于 07-04 11:04 ?921次閱讀

    Linux內存相關知識科普

    ,Linux 內核幾種內存管理的方法,內存使用場景以及內存使用的那些坑。**從內存的原理和結構,
    發表于 07-25 14:43 ?816次閱讀
    Linux<b class='flag-5'>內存</b>相關知識科普

    Linux內核內存規整總結

    1.前言 伙伴系統作為內核最基礎的物理頁內存分配器,具有高效、實現邏輯簡介等優點,其原理頁也盡可能降低內存外部碎片產生,但依然無法杜絕碎片問題。外部碎片帶來的最大影響就是內存足夠,但是
    的頭像 發表于 11-11 11:17 ?1518次閱讀
    Linux<b class='flag-5'>內核</b><b class='flag-5'>內存</b>規整總結

    Linux內核內存管理架構解析

    內存管理子系統可能是linux內核中最為復雜的一個子系統,其支持的功能需求眾多,如頁面映射、頁面分配、頁面回收、
    的頭像 發表于 01-04 09:24 ?832次閱讀
    Linux<b class='flag-5'>內核</b><b class='flag-5'>內存</b>管理架構解析

    鴻蒙OS開發:【一次開發,多端部署】(典型布局場景

    雖然不同應用的頁面千變萬化,但對其進行拆分和分析,頁面中的很多布局場景是相似的。本小節將介紹如何借助自適應布局、響應式布局以及常見的容器類組件,實現應用中的典型布局
    的頭像 發表于 05-25 16:39 ?2404次閱讀
    鴻蒙OS開發:【一次開發,多端部署】(<b class='flag-5'>典型</b>布局<b class='flag-5'>場景</b>)

    鴻蒙OS開發:典型頁面場景【一次開發,多端部署】(設置應用頁面

    本小節以“設置”應用頁面為例,介紹如何使用自適應布局能力和響應式布局能力適配不同尺寸窗口。
    的頭像 發表于 05-27 10:33 ?1534次閱讀
    鴻蒙OS開發:<b class='flag-5'>典型</b><b class='flag-5'>頁面</b><b class='flag-5'>場景</b>【一次開發,多端部署】(設置應用<b class='flag-5'>頁面</b>)

    鴻蒙OS開發:典型頁面場景【一次開發,多端部署】實戰(設置典型頁面

    本示例展示了設置應用的典型頁面,其在小窗口和大窗口有不同的顯示效果,體現一次開發、多端部署的能力。
    的頭像 發表于 05-27 09:36 ?1404次閱讀
    鴻蒙OS開發:<b class='flag-5'>典型</b><b class='flag-5'>頁面</b><b class='flag-5'>場景</b>【一次開發,多端部署】實戰(設置<b class='flag-5'>典型</b><b class='flag-5'>頁面</b>)

    HarmonyOS Next 應用元服務開發-應用接續動態配置遷移按需遷移頁面

    按需遷移頁面棧,支持應用動態選擇是否進行頁面棧恢復(默認進行頁面棧信息恢復)。如果應用不想使用系統默認恢復的頁面棧,則可以設置不進行
    發表于 12-26 15:23

    Linux內存系統:內存使用場景

    out of memory 的時代過去了嗎?no,內存再充足也不可任性使用。1、內存的使用場景· page 管理· slab(kmalloc、內存池)· 用戶態
    發表于 08-25 07:42

    內存之旅——如何提升CMA利用率?

    (migrate type)的內存頁面,不同的遷移類型有各自的用途。舉例來說, MIGRATE_MOVABLE 表示保存在其頁面的數據是可以被遷移
    發表于 03-22 16:26

    一文解析Linux內存系統

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹Linux 內存組織結構和頁面布局,
    的頭像 發表于 09-01 10:46 ?2555次閱讀
    一文解析Linux<b class='flag-5'>內存</b>系統

    基于內存關聯分析的內存預拷貝遷移策略

    內存預拷貝遷移在密集型負載下存在內存臟頁反復傳輸的冋題,導致迭代輪數較多且大幅降低了內存預拷貝遷移的整體性能。臟頁概率預測能夠有效減少
    發表于 05-24 15:40 ?14次下載

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux
    的頭像 發表于 08-07 15:51 ?479次閱讀
    Linux<b class='flag-5'>內核</b>中的<b class='flag-5'>頁面</b>分配機制
    主站蜘蛛池模板: 在线免费看黄 | 国产精品福利一区二区亚瑟 | 欧美3d成人动画在线 | 亚洲影视网 | 日本丶国产丶欧美色综合 | 手机看片三级 | 丁香六月激情婷婷 | 国产免费久久精品 | 国产亚洲精品仙踪林在线播放 | 成 人 黄 色视频免费播放 | 五月婷婷在线免费观看 | 天天操天天射天天 | 成人ww| 91夫妻视频| 婷婷亚洲综合一区二区 | 婷婷激情小说 | 337p亚洲精品色噜噜狠狠 | 国产老头和美女在线观看 | 日韩一级欧美一级一级国产 | 男女视频在线观看免费 | 欧美精品video | 国产免费资源 | 五月婷婷在线视频 | 免费a级网站 | 四虎影视院 | 轻点灬大ji巴太粗太长了啊h | 一夜七次郎久久综合伊人 | 加勒比一本一道在线 | 大美女久久久久久j久久 | 欧美又粗又硬又大久久久 | 日韩一级精品视频在线观看 | 激情五月在线 | 亚洲伊人久久大香线蕉综合图片 | 亚洲午夜视频在线观看 | 天天综合亚洲国产色 | 调教r18车肉高h男男 | 亚洲va久久久久综合 | 欧美一级视频高清片 | 高黄视频| 91av视频在线 | 天天草综合 |