日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

代碼多副本功能

在NUMA架構(gòu)(尤其是ARM實(shí)例)中,不同NUMA節(jié)點(diǎn)具有各自的本地內(nèi)存,當(dāng)一個(gè)NUMA節(jié)點(diǎn)上的程序或進(jìn)程需要訪問(wèn)其他NUMA節(jié)點(diǎn)的代碼段時(shí),就會(huì)引入額外的延遲和性能開(kāi)銷(xiāo)。通過(guò)代碼多副本功能,可以將遠(yuǎn)程節(jié)點(diǎn)的代碼段復(fù)制到本地節(jié)點(diǎn),避免了跨節(jié)點(diǎn)訪問(wèn),從而解決NUMA架構(gòu)中因跨節(jié)點(diǎn)訪問(wèn)帶來(lái)的性能延遲問(wèn)題。

背景信息

  • 什么是代碼段跨節(jié)點(diǎn)訪問(wèn)?對(duì)系統(tǒng)有什么影響?

    • 什么是代碼段跨節(jié)點(diǎn)訪問(wèn)?

      非統(tǒng)一內(nèi)存訪問(wèn)NUMA (Non-Uniform Memory Access) 是一種計(jì)算機(jī)架構(gòu)設(shè)計(jì),用于處理多處理器系統(tǒng)中的內(nèi)存訪問(wèn)延遲和帶寬不均勻的問(wèn)題。不同的處理器核心和內(nèi)存子系統(tǒng)整體被稱為節(jié)點(diǎn)(node),每個(gè)節(jié)點(diǎn)都有自己的本地內(nèi)存。當(dāng)一個(gè)進(jìn)程在NUMA架構(gòu)中運(yùn)行時(shí),可能由于內(nèi)存不足或負(fù)載平衡等原因,操作系統(tǒng)會(huì)將內(nèi)存分配在其他節(jié)點(diǎn)上。當(dāng)應(yīng)用程序或進(jìn)程需要訪問(wèn)的代碼段存儲(chǔ)在另一個(gè)NUMA節(jié)點(diǎn)上時(shí),就需要通過(guò)跨節(jié)點(diǎn)訪問(wèn)的方式來(lái)獲取代碼段中的指令。

    • 對(duì)系統(tǒng)有什么影響?

      跨節(jié)點(diǎn)訪問(wèn)代碼段可能會(huì)產(chǎn)生一些性能問(wèn)題,例如增加訪問(wèn)延遲、降低執(zhí)行效率和增加內(nèi)存帶寬的占用等。這是由于跨節(jié)點(diǎn)訪問(wèn)需要通過(guò)總線或互聯(lián)網(wǎng)絡(luò)傳輸數(shù)據(jù),并在遠(yuǎn)程節(jié)點(diǎn)上進(jìn)行內(nèi)存訪問(wèn),這些操作通常比本地內(nèi)存訪問(wèn)更慢,所以要盡可能避免應(yīng)用跨節(jié)點(diǎn)訪問(wèn)。

  • 代碼多副本功能解決代碼段跨節(jié)點(diǎn)訪問(wèn)的技術(shù)原理

    代碼多副本的核心作用是當(dāng)發(fā)現(xiàn)應(yīng)用程序或進(jìn)程跨節(jié)點(diǎn)訪問(wèn)代碼段時(shí),在當(dāng)前節(jié)點(diǎn)上創(chuàng)建待訪問(wèn)代碼段的副本,這樣可以在本地節(jié)點(diǎn)上訪問(wèn)代碼段,而無(wú)需進(jìn)行跨節(jié)點(diǎn)訪問(wèn),從而減少跨節(jié)點(diǎn)訪問(wèn)帶來(lái)的延遲和開(kāi)銷(xiāo)。如下圖所示:

    1. node 1上的Process 1進(jìn)程跨節(jié)點(diǎn)訪問(wèn)node 0上的libc.so代碼段,或者node 0上的Process 0進(jìn)程跨節(jié)點(diǎn)訪問(wèn)node 1上的test代碼段。

    2. 此時(shí)通過(guò)代碼多副本功能,會(huì)在node 1上創(chuàng)建libc.so副本,在node 0上創(chuàng)建test副本。

    3. 那么Process 1進(jìn)程實(shí)際訪問(wèn)的是libc.so副本,Process 0進(jìn)程實(shí)際訪問(wèn)的是test副本,從而消除跨節(jié)點(diǎn)訪存。

    說(shuō)明

    內(nèi)核以頁(yè)(4 KB大小)為粒度管理內(nèi)存,一個(gè)程序的代碼段可能放在一個(gè)或多個(gè)內(nèi)存頁(yè)中。一個(gè)程序的代碼段第一次被從硬盤(pán)讀入到內(nèi)存,加入到Page Cache(文件緩存)中,所在的內(nèi)存頁(yè)叫主頁(yè)。如果內(nèi)核發(fā)現(xiàn)某個(gè)程序訪問(wèn)了遠(yuǎn)端節(jié)點(diǎn)上的代碼段,就會(huì)把這些代碼段以頁(yè)為粒度在本地節(jié)點(diǎn)上拷貝一份,那么本地代碼段的頁(yè)就叫副頁(yè)。

    image

使用限制

僅以下實(shí)例規(guī)格和鏡像支持代碼多副本功能。

  • 實(shí)例規(guī)格:彈性裸金屬服務(wù)器規(guī)格族群。更多信息,請(qǐng)參見(jiàn)彈性裸金屬服務(wù)器

  • 鏡像:內(nèi)核版本是5.10.112-11及以上的Alibaba Cloud Linux 3鏡像。

    說(shuō)明

    您可以通過(guò)uname -r命令查詢鏡像的內(nèi)核版本。

配置開(kāi)關(guān)

代碼多副本提供了全局開(kāi)關(guān)和memcg開(kāi)關(guān),只有當(dāng)兩個(gè)開(kāi)關(guān)同時(shí)打開(kāi)時(shí),內(nèi)核系統(tǒng)內(nèi)的進(jìn)程才能使用代碼多副本功能。

配置開(kāi)關(guān)

說(shuō)明

/sys/kernel/mm/duptext/enabled

全局開(kāi)關(guān)用于設(shè)置當(dāng)前內(nèi)核系統(tǒng)是否啟用代碼多副本功能。取值范圍:0~1,默認(rèn)值為0。

  • 取值為1,表示允許啟用代碼多副本功能。

  • 取值為0,表示禁用或關(guān)閉代碼多副本功能。

    說(shuō)明

    關(guān)閉代碼多副本功能時(shí),內(nèi)核會(huì)自動(dòng)清除整機(jī)上的所有副頁(yè)。

/sys/fs/cgroup/memory/<memcg目錄名稱>/memory.allow_duptext

在全局開(kāi)關(guān)打開(kāi)的前提下,memcg開(kāi)關(guān)用于設(shè)置各memcg中的進(jìn)程是否啟用代碼多副本功能。取值范圍:0~1,默認(rèn)值為0。

  • 取值為1,表示當(dāng)前memcg中的進(jìn)程啟用代碼多副本功能。

  • 取值為0,表示當(dāng)前memcg中的進(jìn)程不啟用代碼多副本功能。

說(shuō)明

除了上述特性開(kāi)關(guān)之外,您還可以通過(guò)以下方式查看副頁(yè)的統(tǒng)計(jì)數(shù)據(jù)。

  • 通過(guò)/proc/vmstat中的nr_duptext字段或者/proc/meminfo中的DupText字段查看整機(jī)的副頁(yè)統(tǒng)計(jì)數(shù)據(jù)。

    • nr_duptext表示在內(nèi)核中標(biāo)記為duptext的副頁(yè)數(shù)量。

    • DupText表示使用了多少內(nèi)存來(lái)存儲(chǔ)duptext相關(guān)的數(shù)據(jù),單位為KB。通常1個(gè)內(nèi)存頁(yè)的大小是4 KB。

  • 通過(guò)/proc/pid/smaps文件可以查看對(duì)應(yīng)進(jìn)程的副頁(yè)統(tǒng)計(jì)數(shù)據(jù)。

使用代碼多副本功能

本示例通過(guò)在一臺(tái)具有兩個(gè)NUMA節(jié)點(diǎn)的ECS實(shí)例上編譯并執(zhí)行一個(gè)測(cè)試程序test.c為例,演示代碼多副本功能的用法。

  1. 遠(yuǎn)程登錄ECS實(shí)例。

    具體操作,請(qǐng)參見(jiàn)通過(guò)密碼或密鑰認(rèn)證登錄Linux實(shí)例

  2. (可選)運(yùn)行以下命令,查看ECS實(shí)例的NUMA節(jié)點(diǎn)信息。

    numactl -H
    說(shuō)明

    如果您沒(méi)有安裝numactl,可執(zhí)行sudo yum install numactl命令進(jìn)行安裝。

    如下圖所示,表示該實(shí)例有2個(gè)NUMA節(jié)點(diǎn)(node 0和node 1)。

    image.png
  3. 運(yùn)行以下命令,編譯測(cè)試程序并生成可執(zhí)行文件。

    本示例假設(shè)在node 1上編譯test.c的源代碼文件,并在node 1上生成test文件的Page Cache。

    numactl -N 1 -m 1 gcc test.c -o test
  4. 運(yùn)行以下命令,打開(kāi)代碼多副本功能的全局開(kāi)關(guān)。

    sudo sh -c 'echo 1 > /sys/kernel/mm/duptext/enabled'
  5. 運(yùn)行以下命令,創(chuàng)建一個(gè)memcg目錄并打開(kāi)memcg的多副本功能開(kāi)關(guān)。

    sudo mkdir /sys/fs/cgroup/memory/test
    sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.allow_duptext'
  6. 運(yùn)行以下命令,通過(guò)代碼多副本功能避免跨節(jié)點(diǎn)訪問(wèn)。

    本示例假設(shè)使用cgexec和numactl來(lái)運(yùn)行可執(zhí)行文件test,同時(shí)將進(jìn)程綁定到node 0上。此時(shí)會(huì)在node 0上創(chuàng)建test相關(guān)代碼段的副本,即直接訪問(wèn)的是node 0上的副本,避免了跨節(jié)點(diǎn)訪問(wèn)。

    sudo cgexec -g "memory:test" numactl -N 0 -m 0 ./test
    說(shuō)明

    如果您沒(méi)有安裝cgexec,可執(zhí)行sudo yum install -y libcgroup-tools命令進(jìn)行安裝。

  7. 運(yùn)行以下命令,查看test程序的副頁(yè)統(tǒng)計(jì)數(shù)據(jù)。

    sudo cat /proc/$(pidof test)/smaps

    如下圖所示,展示了test的副頁(yè)統(tǒng)計(jì)信息,表示在node 0上已經(jīng)成功生成了test的副本。

    image.png
    說(shuō)明

    您也可以分別運(yùn)行以下命令,查看整機(jī)的副頁(yè)統(tǒng)計(jì)數(shù)據(jù)。

    cat /proc/vmstat | grep -i duptext
    cat /proc/meminfo | grep -i duptext

關(guān)閉代碼多副本功能

后續(xù)您可以根據(jù)需要關(guān)閉代碼多副本功能。關(guān)閉多副本功能的同時(shí),內(nèi)核會(huì)自動(dòng)清除整機(jī)上的所有副頁(yè)。

  1. 遠(yuǎn)程登錄ECS實(shí)例。

    具體操作,請(qǐng)參見(jiàn)通過(guò)密碼或密鑰認(rèn)證登錄Linux實(shí)例

  2. 運(yùn)行以下命令,關(guān)閉代碼多副本功能。

    sudo sh -c 'echo 0 > /sys/kernel/mm/duptext/enabled'
  3. 運(yùn)行以下命令,驗(yàn)證是否關(guān)閉代碼多副本功能。

    cat /proc/vmstat | grep -i duptext
    cat /proc/meminfo | grep -i duptext

    如下圖所示,整機(jī)上的所有副頁(yè)已經(jīng)被清除,表示已經(jīng)關(guān)閉代碼多副本功能。

    image.png