すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:コードduptext機能

最終更新日:Jul 05, 2024

非均一メモリアクセス (NUMA) アーキテクチャ、特にArmベースのElastic Compute Service (ECS) インスタンスでは、各NUMAノードにローカルメモリがあります。 1つのNUMAノード上のプログラムまたはプロセスが他のNUMAノード上のコードスニペットにアクセスする必要がある場合、クロスノードアクセスは追加のレイテンシおよびパフォーマンスオーバーヘッドを引き起こします。 上記の問題を解決するには、code duptext機能を使用して、リモートノードからオンプレミスノードにコードスニペットをコピーします。

背景情報

  • コードスニペットのクロスノードアクセスとシステムへの影響

    • コードスニペットのクロスノードアクセス

      NUMAは、マルチプロセッサシステムにおけるメモリアクセス待ち時間および帯域幅負荷不均衡などの問題を解決するように設計されたコンピュータアーキテクチャである。 NUMAアーキテクチャでは、ノードはプロセッサコアとメモリサブシステムで構成されます。 各ノードはローカルメモリを有する。 1つのNUMAノードは、コードスニペットが別のNUMAノードに格納されているアプリケーションまたはプロセスを実行することができる。 これは、オペレーティングシステムがメモリを複数のノードに割り当てて、不十分なメモリ問題を解決したり、負荷分散要件を満たしたりするために発生します。 前述のクロスノードアクセスのシナリオでは、アプリケーションまたはプロセスは、別のノードに格納されているコードスニペットから命令を取得する必要があります。

    • システムへの影響

      コードスニペットへのクロスノードアクセスは、アクセスレイテンシの増加、実行効率の低下、メモリ帯域幅使用量の増加など、特定のパフォーマンス問題を引き起こす可能性があります。 前述の問題は、クロスノードアクセスがバスまたは相互接続ネットワークを介したデータ転送およびリモートノードへのメモリアクセスを必要とするために発生します。 これらの操作は、オンプレミスのメモリアクセスに関連する操作よりも低速です。 クロスノードアクセスを必要とする操作は実行しないことを推奨します。

  • コードスニペットへのクロスノードアクセスによって引き起こされる問題を解決するコードduptext機能の原則

    コードスニペットに対してクロスノードアクセスが検出されると、コードデュテキスト機能は、リモートノードからコードスニペットのコピーを作成し、そのコピーをオンプレミスノードに格納します。 このようにして、オンプレミスノード上のアプリケーションまたはプロセスは、クロスノードアクセスなしでコードスニペットのコピーにアクセスすることができ、追加のレイテンシおよびメモリオーバーヘッドを防止する。 次の図は、コードduptext機能のワークフローを示しています。

    1. ノード1上のプロセス1は、ノード0上のlibc.soスニペットにアクセスするか、またはノード0上のプロセス0は、ノード1上のテストスニペットにアクセスする。

    2. コードduptext機能は、ノード1にlibc.soコピーを作成し、ノード0にテストコピーを作成するために使用されます。

    3. プロセス1はlibc.soコピーにアクセスでき、プロセス0はテストコピーにアクセスできます。

    説明

    カーネルは、ページレベルの粒度でメモリを管理する。 各ページのサイズは4 KBです。 プログラムのコードスニペットは、1つ以上のメモリページに格納される。 プログラムのコードスニペットが初めてハードディスクからメモリに読み込まれ、メモリページのページキャッシュに追加されるとき、コードスニペットが格納されるページはメインページと呼ばれる。 カーネルが、オンプレミスノード上のプログラムが他のノード上のコードスニペットにアクセスすることを検出すると、カーネルは、コードデュプテキスト機能を使用して、ページレベルの粒度でオンプレミスノード上のコードスニペットのコピーを作成する。 コードスニペットのコピーを格納するページは、サブページと呼ばれます。

    image

制限事項

コード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

  • 1: コードduptext機能を有効にします。

  • 0: コードduptext機能を有効または無効にしません。

    説明

    コードduptext機能が無効になると、カーネルはインスタンス上のすべてのサブページを自動的にクリアします。

/sys/fs/cgroup/memory/<memcgディレクトリ名>/memory.allow_duptext

グローバルスイッチをオンにすると、memcgスイッチを使用して、各memcgのプロセスに対してコードduptext機能を有効にするかどうかを制御できます。 有効な値: 0と1。 デフォルト値:0

  • 1: 各memcgのプロセスのコードduptext機能を有効にします。

  • 0: 各memcgのプロセスのコードduptext機能を有効にしません。

説明

上記のスイッチの使用に加えて、次の方法を使用してサブページ統計を照会できます。

  • インスタンスのサブページ統計を表示するには、/proc/vmstatファイルのnr_duptextフィールドまたは /proc/meminfoファイルのDupTextフィールドを照会します。

    • nr_duptextは、カーネル内でduptextとしてマークされたサブページの数を示します。

    • DupTextは、duptextデータを格納するメモリ量をKB単位で示します。 典型的なメモリページのサイズは4 KBである。

  • /proc/pid/smapsファイルを照会して、プロセスのサブページ統計を表示します。

コードduptext機能を使用する

この例では、test.cという名前のテストプログラムがコンパイルされ、2つのNUMAノードを持つECSインスタンスで実行されます。

  1. ECS インスタンスに接続します。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. (オプション) 次のコマンドを実行して、ECSインスタンスのNUMAノードに関する情報を表示します。

    numactl -H
    説明

    numactlツールをインストールしない場合は、sudo yum install numactlコマンドを実行してツールをインストールします。

    次の図は、インスタンスにノード0とノード1の2つのNUMAノードがあることを示しています。

    image.png

  3. 次のコマンドを実行して、テストプログラムをコンパイルし、実行可能ファイルを生成します。

    この例では、test.cのソースコードファイルはノード1でコンパイルされ、ノード1はテストファイルのページキャッシュを生成します。

    numactl -N 1 -m 1 gcc test.c -o test
  4. 次のコマンドを実行して、コードduptext機能のグローバルスイッチをオンにします。

    sudo sh -c 'echo 1 > /sys/kernel/mm/duptext/enabled '
  5. 次のコマンドを実行してmemcgディレクトリを作成し、memcgのduptext機能を有効にします。

    sudo mkdir /sys/fs/cgroup/memory/test
    sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.allow_duptext'
  6. 次のコマンドを実行して、コード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コマンドを実行してツールをインストールします。

  7. 次のコマンドを実行して、テストプログラムのサブページに関する統計を表示します。

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

    次のサンプルコマンド出力は、テストプログラムのサブページに関する統計を示しています。 テストプログラムのコードコピーがノード0上で生成される。

    image.png

    説明

    次のコマンドを実行して、インスタンスのサブページ統計を表示することもできます。

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

コードduptext機能の無効化

ビジネス要件に基づいて、コードduptext機能を無効にできます。 コードduptext機能が無効になると、カーネルはインスタンス上のすべてのサブページを自動的にクリアします。

  1. ECS インスタンスに接続します。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、コードduptext機能を無効にします。

    sudo sh -c 'echo 0 > /sys/kernel/mm/duptext/enabled '
  3. 次のコマンドを実行して、コードduptext機能が無効になっていることを確認します。

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

    次のサンプルのコマンド出力は、インスタンス上のすべてのサブページがクリアされていることを示しています。

    image.png