非均一メモリアクセス (NUMA) アーキテクチャ、特にArmベースのElastic Compute Service (ECS) インスタンスでは、各NUMAノードにローカルメモリがあります。 1つのNUMAノード上のプログラムまたはプロセスが他のNUMAノード上のコードスニペットにアクセスする必要がある場合、クロスノードアクセスは追加のレイテンシおよびパフォーマンスオーバーヘッドを引き起こします。 上記の問題を解決するには、code duptext機能を使用して、リモートノードからオンプレミスノードにコードスニペットをコピーします。
背景情報
制限事項
コードduptext機能をサポートしているのは、次のインスタンスタイプとイメージのみです。
インスタンスタイプ: ECS Bare Metalインスタンスファミリー。 詳細については、「概要」をご参照ください。
イメージ: カーネルバージョン
5.10.112-11
以降を実行するAlibaba Cloud Linux 3イメージ。説明カーネルバージョンのイメージを照会するには、
uname -r
コマンドを実行します。
コードduptext機能を有効または無効にする
コードduptext機能は、グローバルに、またはmemcgを使用して制御できます。 カーネルは、グローバルスイッチとmemcgスイッチの両方がオンになってコードduptext機能を有効にする場合にのみ、プロセスにコードduptext機能を使用できます。
スイッチ | 説明 |
/sys/kernel/mm/duptext/enabled | グローバルスイッチは、現在のカーネルシステムでコードduptext機能を有効にするかどうかを制御するために使用されます。 有効な値: 0と1。 デフォルト値:0
|
/sys/fs/cgroup/memory/<memcgディレクトリ名>/memory.allow_duptext | グローバルスイッチをオンにすると、memcgスイッチを使用して、各memcgのプロセスに対してコードduptext機能を有効にするかどうかを制御できます。 有効な値: 0と1。 デフォルト値:0
|
上記のスイッチの使用に加えて、次の方法を使用してサブページ統計を照会できます。
インスタンスのサブページ統計を表示するには、
/proc/vmstat
ファイルのnr_duptext
フィールドまたは/proc/meminfo
ファイルのDupText
フィールドを照会します。nr_duptext
は、カーネル内でduptextとしてマークされたサブページの数を示します。DupText
は、duptextデータを格納するメモリ量をKB単位で示します。 典型的なメモリページのサイズは4 KBである。
/proc/pid/smaps
ファイルを照会して、プロセスのサブページ統計を表示します。
コードduptext機能を使用する
この例では、test.cという名前のテストプログラムがコンパイルされ、2つのNUMAノードを持つECSインスタンスで実行されます。
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
(オプション) 次のコマンドを実行して、ECSインスタンスのNUMAノードに関する情報を表示します。
numactl -H
説明numactl
ツールをインストールしない場合は、sudo yum install numactl
コマンドを実行してツールをインストールします。次の図は、インスタンスにノード0とノード1の2つのNUMAノードがあることを示しています。
次のコマンドを実行して、テストプログラムをコンパイルし、実行可能ファイルを生成します。
この例では、test.cのソースコードファイルはノード1でコンパイルされ、ノード1はテストファイルのページキャッシュを生成します。
numactl -N 1 -m 1 gcc test.c -o test
次のコマンドを実行して、コードduptext機能のグローバルスイッチをオンにします。
sudo sh -c 'echo 1 > /sys/kernel/mm/duptext/enabled '
次のコマンドを実行してmemcgディレクトリを作成し、memcgのduptext機能を有効にします。
sudo mkdir /sys/fs/cgroup/memory/test sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.allow_duptext'
次のコマンドを実行して、コードduptext機能を使用し、クロスノードアクセスを回避します。
この例では、cgexecおよびnumactlツールを使用してtestという名前の実行可能ファイルを実行し、プロセスをノード0にバインドします。 この場合、テスト関連のコードスニペットのコピーがノード0に作成されます。 テストプログラムは、クロスノードアクセスなしで、ノード0のコードスニペットのコピーにアクセスできます。
sudo cgexec -g "memory:test" numactl -N 0 -m 0 ./test
説明cgexec
ツールをインストールしない場合は、sudo yum install -y libcgroup-tools
コマンドを実行してツールをインストールします。次のコマンドを実行して、テストプログラムのサブページに関する統計を表示します。
sudo cat /proc/$(pidof test)/smaps
次のサンプルコマンド出力は、テストプログラムのサブページに関する統計を示しています。 テストプログラムのコードコピーがノード0上で生成される。
説明次のコマンドを実行して、インスタンスのサブページ統計を表示することもできます。
cat /proc/vmstat | grep -i duptext cat /proc/meminfo | grep -i duptext
コードduptext機能の無効化
ビジネス要件に基づいて、コードduptext機能を無効にできます。 コードduptext機能が無効になると、カーネルはインスタンス上のすべてのサブページを自動的にクリアします。
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、コードduptext機能を無効にします。
sudo sh -c 'echo 0 > /sys/kernel/mm/duptext/enabled '
次のコマンドを実行して、コードduptext機能が無効になっていることを確認します。
cat /proc/vmstat | grep -i duptext cat /proc/meminfo | grep -i duptext
次のサンプルのコマンド出力は、インスタンス上のすべてのサブページがクリアされていることを示しています。