EC2インスタンスのインスタンスタイプを変更する場合はアプリケーションがNUMAをサポートしているかも気をつけよう

EC2インスタンスのインスタンスタイプを変更する場合はアプリケーションがNUMAをサポートしているかも気をつけよう

インスタンスサイズを増強しても、そのリソースを効率的に使用できるかはアプリケーション次第
Clock Icon2025.04.04

EC2インスタンスのインスタンスサイズを変更してスケールアップさせたのにある程度のCPUまでしか使用できていない

こんにちは、のんピ(@non____97)です。

皆さんは「EC2インスタンスのインスタンスサイズを変更してスケールアップさせたのにある程度のCPUまでしか使用できていない」となったことはありますか? 私はあります。

例えば、以下のように特定のCPUに負荷が偏っている場合があります。

3.htopでPROCESSER追加後.png

場合によってはOSやアプリケーションがNUMA対応していないことが原因かもしれません。

NUMAとはNon-Uniform Memory Accessの略でCPUをいくつかのグループに分割し、そのグループにメインとなるメモリを割り当てアクセスする方式です。複数のメモリバスを使用できるようになるためCPUからメモリへのアクセス速度の向上が見込まれます。

bz639780-multicore3.png

抜粋 : 第4章 CPU | Red Hat Product Documentation

OSやアプリケーションによってはNUMAをサポートしていない場合もあり得ます。

64 を超える論理プロセッサを搭載したシステムでの NUMA のサポート

論理プロセッサが 64 を超えるシステムでは、ノードの容量に応じてノードが プロセッサ グループ に割り当てられます。 ノードの容量は、システムの実行中に追加できる追加の論理プロセッサと共にシステムが起動したときに存在するプロセッサの数です。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: プロセッサ グループはサポートされていません。

各ノードは、グループ内に完全に含まれている必要があります。 ノードの容量が比較的小さい場合、システムは複数のノードを同じグループに割り当て、パフォーマンスを向上させるために物理的に近いノードを選択します。 ノードの容量がグループ内のプロセッサの最大数を超える場合、システムはノードを複数の小さなノードに分割し、それぞれがグループに収まるほど小さくなります。

プロセスの作成時に、 PROC_THREAD_ATTRIBUTE_PREFERRED_NODE 拡張属性を使用して、新しいプロセスに最適な NUMA ノードを要求できます。 スレッド理想的なプロセッサと同様に、理想的なノードはスケジューラへのヒントであり、可能であれば要求されたノードを含むグループに新しいプロセスを割り当てます。

NUMA サポート - Win32 apps | Microsoft Learn

そのような場合はインスタンスサイズを増強しても全てのvCPUを効果的に使用することはできません。

ということで、NUMAのノードグループが複数ある場合の状態について紹介します。

いきなりまとめ

  • 確認した限り、c6iは16xlagreまでは非NUMAで、24xlargeからはNUMA
  • 確認した限り、c7i.24xlargeも非NUMA
  • インスタンスサイズを増強しても、そのリソースを効率的に使用できるかはアプリケーション次第

確認してみる

c6i.16xlarge × Amazon Linux 2023

実際に確認してみましょう。

まずはc6i.16xlargeのAmazon Linux 2023のインスタンスです。

CPUの情報を確認します。

$ lscpu
Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          46 bits physical, 48 bits virtual
  Byte Order:             Little Endian
CPU(s):                   64
  On-line CPU(s) list:    0-63
Vendor ID:                GenuineIntel
  Model name:             Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
    CPU family:           6
    Model:                106
    Thread(s) per core:   2
    Core(s) per socket:   32
    Socket(s):            1
    Stepping:             6
    BogoMIPS:             5800.00
    Flags:                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_ts
                          c arch_perfmon rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq monitor ssse3 fma cx16 pcid sse4_1 sse4_2 x2api
                          c movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanc
                          ed fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx
                          512vl xsaveopt xsavec xgetbv1 xsaves wbnoinvd ida arat avx512vbmi pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx5
                          12_vpopcntdq rdpid md_clear flush_l1d arch_capabilities
Virtualization features:
  Hypervisor vendor:      KVM
  Virtualization type:    full
Caches (sum of all):
  L1d:                    1.5 MiB (32 instances)
  L1i:                    1 MiB (32 instances)
  L2:                     40 MiB (32 instances)
  L3:                     54 MiB (1 instance)
NUMA:
  NUMA node(s):           1
  NUMA node0 CPU(s):      0-63
Vulnerabilities:
  Gather data sampling:   Unknown: Dependent on hypervisor status
  Itlb multihit:          Not affected
  L1tf:                   Not affected
  Mds:                    Not affected
  Meltdown:               Not affected
  Mmio stale data:        Mitigation; Clear CPU buffers; SMT Host state unknown
  Reg file data sampling: Not affected
  Retbleed:               Not affected
  Spec rstack overflow:   Not affected
  Spec store bypass:      Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:             Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIBRS SW sequence; BHI SW loop, KVM SW loop
  Srbds:                  Not affected
  Tsx async abort:        Not affected

$ lscpu | grep -i numa
NUMA node(s):                         1
NUMA node0 CPU(s):                    0-63

NUMAノードは一つで、NUMAノードに0-63と全てのvCPUが含まれていることがわかります。

各vCPUのCPUコアやソケット、ノードも確認します。

$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
.
.
(中略)
.
.
60,28,0,0,,28,28,28,0
61,29,0,0,,29,29,29,0
62,30,0,0,,30,30,30,0
63,31,0,0,,31,31,31,0

数が多すぎて省略しましたが、NUMAノードを示す4列目が全て0になっていました。

NUMAの管理をする際に使用するnumactlをインストールして、もう少し情報を確認してみます。

$ sudo dnf install numactl
Last metadata expiration check: 0:03:19 ago on Thu Mar 6 01:13:35 2025.
Dependencies resolved.
=============================================================
 Package    Architecture    Version                Repository    Size
=============================================================
Installing:
 numactl    x86_64         2.0.14-3.amzn2023.0.3  amazonlinux   67 k

Transaction Summary
=============================================================
Install  1 Package

Total download size: 67 k
Installed size: 164 k
Is this ok [y/N]: y
Downloading Packages:
numactl-2.0.14-3.amzn2023.0.3.x86_64.rpm    1.7 MB/s |  67 kB     00:00
-------------------------------------------------------------
Total                                        903 kB/s |  67 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                 1/1
  Installing       : numactl-2.0.14-3.amzn2023.0.3.x86_64            1/1
  Running scriptlet: numactl-2.0.14-3.amzn2023.0.3.x86_64            1/1
  Verifying        : numactl-2.0.14-3.amzn2023.0.3.x86_64            1/1
=============================================================
WARNING:
  A newer release of "Amazon Linux" is available.

  Available Versions:

  Version 2023.6.20250303:
    Run the following command to upgrade to 2023.6.20250303:

      dnf upgrade --releasever=2023.6.20250303

    Release notes:
     https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.6.20250303.html

=============================================================

Installed:
  numactl-2.0.14-3.amzn2023.0.3.x86_64

Complete!

numactl -Hnumactl --showでNUMA構成やノード数を表示しましょう。

$ sudo numactl
usage: numactl [--all | -a] [--interleave= | -i <nodes>] [--preferred= | -p <node>]
               [--physcpubind= | -C <cpus>] [--cpunodebind= | -N <nodes>]
               [--membind= | -m <nodes>] [--localalloc | -l] command args ...
       numactl [--show | -s]
       numactl [--hardware | -H]
       numactl [--length | -l <length>] [--offset | -o <offset>] [--shmmode | -M <shmmode>]
               [--strict | -t]
               [--shmid | -I <id>] --shm | -S <shmkeyfile>
               [--shmid | -I <id>] --file | -f <tmpfsfile>
               [--huge | -u] [--touch | -T]
               memory policy | --dump | -d | --dump-nodes | -D

memory policy is --interleave | -i, --preferred | -p, --membind | -m, --localalloc | -l
<nodes> is a comma delimited list of node numbers or A-B ranges or all.
Instead of a number a node can also be:
  netdev:DEV the node connected to network device DEV
  file:PATH  the node the block device of path is connected to
  ip:HOST    the node of the network device host routes through
  block:PATH the node of block device path
  pci:[seg:]bus:dev[:func] The node of a PCI device
<cpus> is a comma delimited list of cpu numbers or A-B ranges or all
all ranges can be inverted with !
all numbers and ranges can be made cpuset-relative with +
the old --cpubind argument is deprecated.
use --cpunodebind or --physcpubind instead
<length> can have g (GB), m (MB) or k (KB) suffixes

$ sudo numactl -H
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
node 0 size: 126743 MB
node 0 free: 125941 MB
node distances:
node   0
  0:  10

$ sudo numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
cpubind: 0
nodebind: 0
membind: 0

1つのNUMAノードで構成されていることが分かります。

NUMAノードの状態もnumastatで確認しておきます。

$ sudo numastat
                           node0
numa_hit                 1890200
numa_miss                      0
numa_foreign                   0
interleave_hit              1613
local_node               1890200
other_node                     0

c6i.24xlarge × Amazon Linux 2023

続いて、c6i.24xlargeでAmazon Linux 2023を起動した場合です。

EC2インスタンスは同じものを利用し、c6i.16xlargeからc6i.24xlargeへインスタンスサイズを変更しました。

$ lscpu
Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          46 bits physical, 48 bits virtual
  Byte Order:             Little Endian
CPU(s):                   96
  On-line CPU(s) list:    0-95
Vendor ID:                GenuineIntel
  Model name:             Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
    CPU family:           6
    Model:                106
    Thread(s) per core:   2
    Core(s) per socket:   24
    Socket(s):            2
    Stepping:             6
    BogoMIPS:             5799.95
    Flags:                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_ts
                          c rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_de
                          adline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjus
                          t bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec
                           xgetbv1 xsaves wbnoinvd ida arat avx512vbmi pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md
                          _clear flush_l1d arch_capabilities
Virtualization features:
  Hypervisor vendor:      KVM
  Virtualization type:    full
Caches (sum of all):
  L1d:                    2.3 MiB (48 instances)
  L1i:                    1.5 MiB (48 instances)
  L2:                     60 MiB (48 instances)
  L3:                     108 MiB (2 instances)
NUMA:
  NUMA node(s):           2
  NUMA node0 CPU(s):      0-23,48-71
  NUMA node1 CPU(s):      24-47,72-95
Vulnerabilities:
  Gather data sampling:   Unknown: Dependent on hypervisor status
  Itlb multihit:          Not affected
  L1tf:                   Not affected
  Mds:                    Not affected
  Meltdown:               Not affected
  Mmio stale data:        Mitigation; Clear CPU buffers; SMT Host state unknown
  Reg file data sampling: Not affected
  Retbleed:               Not affected
  Spec rstack overflow:   Not affected
  Spec store bypass:      Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:             Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIBRS SW sequence; BHI SW loop, KVM SW loop
  Srbds:                  Not affected
  Tsx async abort:        Not affected

CPUソケットおよびNUMAノードが2つになり、それぞれ48個のvCPUが割り当てられていることが分かります。

m6iやc6iがリリースされたタイミングでNUMAについては以下のように紹介されていました。

NUMA – Non-Uniform Memory Access の略で、この重要なアーキテクチャ機能により、ワークロードを最適化できます。このアーキテクチャでは、メモリの特定ブロックに対するほとんどのリクエストは 1 つのプロセッサからアクセスされ、ブロックはプロセッサにより近くなるように設計されています。24xlarge および 32xlarge インスタンスでは、プロセッサアフィニティの制御 (および NUMA の利用) が可能です 。

より高いパケット処理パフォーマンスを備えた、Amazon EC2 の汎用、コンピューティング最適化、およびメモリ最適化インスタンスが新たに登場 | Amazon Web Services ブログ

おそらく32xlargeについてもNUMAが有効なのでしょう。

各vCPUごとに割り当てられているNUMAノードは以下のように確認できます。

$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
5,5,0,0,,5,5,5,0
6,6,0,0,,6,6,6,0
7,7,0,0,,7,7,7,0
8,8,0,0,,8,8,8,0
9,9,0,0,,9,9,9,0
10,10,0,0,,10,10,10,0
11,11,0,0,,11,11,11,0
12,12,0,0,,12,12,12,0
13,13,0,0,,13,13,13,0
14,14,0,0,,14,14,14,0
15,15,0,0,,15,15,15,0
16,16,0,0,,16,16,16,0
17,17,0,0,,17,17,17,0
18,18,0,0,,18,18,18,0
19,19,0,0,,19,19,19,0
20,20,0,0,,20,20,20,0
21,21,0,0,,21,21,21,0
22,22,0,0,,22,22,22,0
23,23,0,0,,23,23,23,0
24,24,1,1,,32,32,32,1
25,25,1,1,,33,33,33,1
26,26,1,1,,34,34,34,1
27,27,1,1,,35,35,35,1
28,28,1,1,,36,36,36,1
29,29,1,1,,37,37,37,1
30,30,1,1,,38,38,38,1
31,31,1,1,,39,39,39,1
32,32,1,1,,40,40,40,1
33,33,1,1,,41,41,41,1
34,34,1,1,,42,42,42,1
35,35,1,1,,43,43,43,1
36,36,1,1,,44,44,44,1
37,37,1,1,,45,45,45,1
38,38,1,1,,46,46,46,1
39,39,1,1,,47,47,47,1
40,40,1,1,,48,48,48,1
41,41,1,1,,49,49,49,1
42,42,1,1,,50,50,50,1
43,43,1,1,,51,51,51,1
44,44,1,1,,52,52,52,1
45,45,1,1,,53,53,53,1
46,46,1,1,,54,54,54,1
47,47,1,1,,55,55,55,1
48,0,0,0,,0,0,0,0
49,1,0,0,,1,1,1,0
50,2,0,0,,2,2,2,0
51,3,0,0,,3,3,3,0
52,4,0,0,,4,4,4,0
53,5,0,0,,5,5,5,0
54,6,0,0,,6,6,6,0
55,7,0,0,,7,7,7,0
56,8,0,0,,8,8,8,0
57,9,0,0,,9,9,9,0
58,10,0,0,,10,10,10,0
59,11,0,0,,11,11,11,0
60,12,0,0,,12,12,12,0
61,13,0,0,,13,13,13,0
62,14,0,0,,14,14,14,0
63,15,0,0,,15,15,15,0
64,16,0,0,,16,16,16,0
65,17,0,0,,17,17,17,0
66,18,0,0,,18,18,18,0
67,19,0,0,,19,19,19,0
68,20,0,0,,20,20,20,0
69,21,0,0,,21,21,21,0
70,22,0,0,,22,22,22,0
71,23,0,0,,23,23,23,0
72,24,1,1,,32,32,32,1
73,25,1,1,,33,33,33,1
74,26,1,1,,34,34,34,1
75,27,1,1,,35,35,35,1
76,28,1,1,,36,36,36,1
77,29,1,1,,37,37,37,1
78,30,1,1,,38,38,38,1
79,31,1,1,,39,39,39,1
80,32,1,1,,40,40,40,1
81,33,1,1,,41,41,41,1
82,34,1,1,,42,42,42,1
83,35,1,1,,43,43,43,1
84,36,1,1,,44,44,44,1
85,37,1,1,,45,45,45,1
86,38,1,1,,46,46,46,1
87,39,1,1,,47,47,47,1
88,40,1,1,,48,48,48,1
89,41,1,1,,49,49,49,1
90,42,1,1,,50,50,50,1
91,43,1,1,,51,51,51,1
92,44,1,1,,52,52,52,1
93,45,1,1,,53,53,53,1
94,46,1,1,,54,54,54,1
95,47,1,1,,55,55,55,1

各種NUMA関連の情報は以下のとおりです。

$ sudo numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
node 0 size: 95143 MB
node 0 free: 94652 MB
node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
node 1 size: 95159 MB
node 1 free: 94535 MB
node distances:
node   0   1
  0:  10  20
  1:  20  10

$ sudo numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
cpubind: 0 1
nodebind: 0 1
membind: 0 1

$ sudo numastat
                           node0           node1
numa_hit                  220669          249973
numa_miss                      0               0
numa_foreign                   0               0
interleave_hit              1082            1307
local_node                218390          235339
other_node                  2279           14634

起動時にNUMAが有効であることのログも出力されていました。

$ sudo dmesg | grep -i numa
[    0.009237] NUMA: Initialized distance table, cnt=2
[    0.009240] NUMA: Node 0 [mem 0x00000000-0xbfffffff] + [mem 0x100000000-0x183fffffff] -> [mem 0x00000000-0x183fffffff]
[    0.098525] mempolicy: Disabling automatic NUMA balancing. Configure with numa_balancing= or the kernel.numa_balancing sysctl
[    0.281418] pci_bus 0000:00: Unknown NUMA node; performance will be reduced

NUMAの無効化

c6i.24xlargeで起動したEC2インスタンスでNUMAを無効化します。

NUMAの無効化は以下re:Postで紹介されています。

https://repost.aws/ja/knowledge-center/ec2-review-numa-statistics

grubで指定するようですね。

現在のgrubの状態を確認します。

$ cat /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet"
GRUB_TIMEOUT=0
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="ec2-console"
GRUB_ENABLE_BLSCFG="true"
GRUB_X86_USE_32BIT="true"
GRUB_DEFAULT=saved
GRUB_UPDATE_DEFAULT_KERNEL=true

$ cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64 root=UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9 ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet

$ cat /proc/cmdline | grep numa=off

grubの設定にnuma=offを追加します。

$ sudo grubby --args="numa=off" --update-kernel=DEFAULT

$ cat /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet"
GRUB_TIMEOUT=0
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="ec2-console"
GRUB_ENABLE_BLSCFG="true"
GRUB_X86_USE_32BIT="true"
GRUB_DEFAULT=saved
GRUB_UPDATE_DEFAULT_KERNEL=true

$ cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64 root=UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9 ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet

$ sudo grubby --info=DEFAULT
index=0
kernel="/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64"
args="ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet numa=off"
root="UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9"
initrd="/boot/initramfs-6.1.128-136.201.amzn2023.x86_64.img"
title="Amazon Linux (6.1.128-136.201.amzn2023.x86_64) 2023"
id="5df2cc92cf714456bc81cf4bf0058d34-6.1.128-136.201.amzn2023.x86_64"

このタイミングではまだNUMAのグループは2つで反映されません。

$ sudo numastat
                           node0           node1
numa_hit                  252076          348754
numa_miss                      0               0
numa_foreign                   0               0
interleave_hit              1082            1307
local_node                248881          334099
other_node                  3195           14655

EC2インスタンスの再起動をします。

再起動後の様子は以下のとおりです。

$ lscpu
Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          46 bits physical, 48 bits virtual
  Byte Order:             Little Endian
CPU(s):                   96
  On-line CPU(s) list:    0-95
Vendor ID:                GenuineIntel
  Model name:             Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
    CPU family:           6
    Model:                106
    Thread(s) per core:   2
    Core(s) per socket:   24
    Socket(s):            2
    Stepping:             6
    BogoMIPS:             5799.95
    Flags:                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_ts
                          c rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_de
                          adline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjus
                          t bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec
                           xgetbv1 xsaves wbnoinvd ida arat avx512vbmi pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md
                          _clear flush_l1d arch_capabilities
Virtualization features:
  Hypervisor vendor:      KVM
  Virtualization type:    full
Caches (sum of all):
  L1d:                    2.3 MiB (48 instances)
  L1i:                    1.5 MiB (48 instances)
  L2:                     60 MiB (48 instances)
  L3:                     108 MiB (2 instances)
NUMA:
  NUMA node(s):           1
  NUMA node0 CPU(s):      0-95
Vulnerabilities:
  Gather data sampling:   Unknown: Dependent on hypervisor status
  Itlb multihit:          Not affected
  L1tf:                   Not affected
  Mds:                    Not affected
  Meltdown:               Not affected
  Mmio stale data:        Mitigation; Clear CPU buffers; SMT Host state unknown
  Reg file data sampling: Not affected
  Retbleed:               Not affected
  Spec rstack overflow:   Not affected
  Spec store bypass:      Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:             Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIBRS SW sequence; BHI SW loop, KVM SW loop
  Srbds:                  Not affected
  Tsx async abort:        Not affected

$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
.
.
(中略)
.
.
93,45,1,0,,53,53,53,1
94,46,1,0,,54,54,54,1
95,47,1,0,,55,55,55,1

$ sudo numactl -H
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
node 0 size: 190111 MB
node 0 free: 189307 MB
node distances:
node   0
  0:  10

$ sudo numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
cpubind: 0
nodebind: 0
membind: 0

$ sudo numastat
                           node0
numa_hit                  463620
numa_miss                      0
numa_foreign                   0
interleave_hit              2302
local_node                463620
other_node                     0

NUMAノードが1つのみになっていることが分かります。

起動ログにも先ほどgrubで指定したNUMA無効の設定がロードされ、NUMAが無効になっていることが確認できました。

$ sudo dmesg | grep -i numa
[    0.000000] Command line: BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64 root=UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9 ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet numa=off
[    0.009192] NUMA turned off
[    0.026937] Kernel command line: BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64 root=UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9 ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet numa=off

再起動のタイミングで/proc/cmdlineにも反映されていますね。

$ cat /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet"
GRUB_TIMEOUT=0
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="ec2-console"
GRUB_ENABLE_BLSCFG="true"
GRUB_X86_USE_32BIT="true"
GRUB_DEFAULT=saved
GRUB_UPDATE_DEFAULT_KERNEL=true

$ cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64 root=UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9 ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet numa=off

$ sudo grubby --info=DEFAULT
index=0
kernel="/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64"
args="ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet numa=off"
root="UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9"
initrd="/boot/initramfs-6.1.128-136.201.amzn2023.x86_64.img"
title="Amazon Linux (6.1.128-136.201.amzn2023.x86_64) 2023"
id="5df2cc92cf714456bc81cf4bf0058d34-6.1.128-136.201.amzn2023.x86_64"

ということで、NUMAの無効化は簡単に行えます。

ただしNUMAを無効化するということはCPUからメモリアクセスをする際のバスが詰まりやすくなってしまうでしょう。

個人的には奥の手という具合です。

c7i.24xlarge × Amazon Linux 2023

別のインスタンスファミリーだとどうでしょう。

c7i.24xlargeのAmazon Linux 2023のEC2インスタンスを新規で立ち上げて確認します。

$ lscpu
Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          46 bits physical, 48 bits virtual
  Byte Order:             Little Endian
CPU(s):                   96
  On-line CPU(s) list:    0-95
Vendor ID:                GenuineIntel
  Model name:             Intel(R) Xeon(R) Platinum 8488C
    CPU family:           6
    Model:                143
    Thread(s) per core:   2
    Core(s) per socket:   48
    Socket(s):            1
    Stepping:             8
    BogoMIPS:             4800.00
    Flags:                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_ts
                          c arch_perfmon rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq monitor ssse3 fma cx16 pdcm pcid sse4_1 sse4_2
                          x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_e
                          nhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512b
                          w avx512vl xsaveopt xsavec xgetbv1 xsaves avx_vnni avx512_bf16 wbnoinvd ida arat avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmu
                          lqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid cldemote movdiri movdir64b md_clear serialize amx_bf16 avx512_fp16 amx_tile amx_int8 f
                          lush_l1d arch_capabilities
Virtualization features:
  Hypervisor vendor:      KVM
  Virtualization type:    full
Caches (sum of all):
  L1d:                    2.3 MiB (48 instances)
  L1i:                    1.5 MiB (48 instances)
  L2:                     96 MiB (48 instances)
  L3:                     105 MiB (1 instance)
NUMA:
  NUMA node(s):           1
  NUMA node0 CPU(s):      0-95
Vulnerabilities:
  Gather data sampling:   Not affected
  Itlb multihit:          Not affected
  L1tf:                   Not affected
  Mds:                    Not affected
  Meltdown:               Not affected
  Mmio stale data:        Not affected
  Reg file data sampling: Not affected
  Retbleed:               Not affected
  Spec rstack overflow:   Not affected
  Spec store bypass:      Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:             Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIBRS SW sequence; BHI BHI_DIS_S
  Srbds:                  Not affected
  Tsx async abort:        Not affected

$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
5,5,0,0,,5,5,5,0
6,6,0,0,,6,6,6,0
.
.
(中略)
.
.
90,42,0,0,,42,42,42,0
91,43,0,0,,43,43,43,0
92,44,0,0,,44,44,44,0
93,45,0,0,,45,45,45,0
94,46,0,0,,46,46,46,0
95,47,0,0,,47,47,47,0

$ sudo dmesg | grep -i numa
[    0.006349] NUMA: Initialized distance table, cnt=1
[    0.006351] NUMA: Node 0 [mem 0x00000000-0xbfffffff] + [mem 0x100000000-0x2f7dffffff] -> [mem 0x00000000-0x2f7dffffff]
[    0.392738] pci_bus 0000:00: on NUMA node 0
[    0.474647] pci_bus 0000:01: on NUMA node 0
[    0.498110] pci_bus 0000:44: on NUMA node 0

$ cat /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet"
GRUB_TIMEOUT=0
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="ec2-console"
GRUB_ENABLE_BLSCFG="true"
GRUB_X86_USE_32BIT="true"
GRUB_DEFAULT=saved
GRUB_UPDATE_DEFAULT_KERNEL=true

$ cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64 root=UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9 ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet

$ sudo grubby --info=DEFAULT
index=0
kernel="/boot/vmlinuz-6.1.128-136.201.amzn2023.x86_64"
args="ro console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet"
root="UUID=ca79e95f-2e31-4237-a0e2-470f52eeb8c9"
initrd="/boot/initramfs-6.1.128-136.201.amzn2023.x86_64.img"
title="Amazon Linux (6.1.128-136.201.amzn2023.x86_64) 2023"
id="5df2cc92cf714456bc81cf4bf0058d34-6.1.128-136.201.amzn2023.x86_64"

$ sudo numactl -H
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
node 0 size: 190143 MB
node 0 free: 189213 MB
node distances:
node   0
  0:  10

$ sudo numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
cpubind: 0
nodebind: 0
membind: 0

$ sudo numastat
                           node0
numa_hit                 1981777
numa_miss                      0
numa_foreign                   0
interleave_hit              2447
local_node               1981777
other_node                     0

はい、c6i.24xlargeと同じvCPU数にも関わらず、こちらはCPUソケット数およびNUMAノードが1つです。

c6iでアプリケーションがNUMA対応できない場合はc7iにインスタンスファミリーを変更するのが選択肢になりそうですね。

また、マルチスレッド性能を上げたいのであれば、c7aなどAMDのCPUを積んでいるインスタンスを選択するのも良いでしょう。

https://dev.classmethod.jp/articles/ec2-cpu-performance-secrets/

c7i.24xlarge × Windows Server 2022

Windows Server 2022の場合もc7i.24xlargeではNUMAが無効なのか確認してみましょう。

このWindows Server 2022のEC2インスタンスのインスタンスタイプは元々t3.mediumでした。c7i.24xlargeに変更して起動します。

CPU周りの情報を確認します。

PS C:\Users\Administrator> wmic cpu list /format:list

AddressWidth=64
Architecture=9
Availability=3
Caption=Intel64 Family 6 Model 143 Stepping 8
ConfigManagerErrorCode=
ConfigManagerUserConfig=
CpuStatus=0
CreationClassName=Win32_Processor
CurrentClockSpeed=2400
CurrentVoltage=
DataWidth=64
Description=Intel64 Family 6 Model 143 Stepping 8
DeviceID=CPU0
ErrorCleared=
ErrorDescription=
ExtClock=
Family=0
InstallDate=
L2CacheSize=98304
L2CacheSpeed=
LastErrorCode=
Level=6
LoadPercentage=3
Manufacturer=GenuineIntel
MaxClockSpeed=2400
Name=Intel(R) Xeon(R) Platinum 8488C
OtherFamilyDescription=
PNPDeviceID=
PowerManagementCapabilities=
PowerManagementSupported=FALSE
ProcessorId=0000000000000000
ProcessorType=3
Revision=
Role=CPU
SocketDesignation=CPU 0
Status=OK
StatusInfo=3
Stepping=
SystemCreationClassName=Win32_ComputerSystem
SystemName=EC2AMAZ-NG985Q8
UniqueId=
UpgradeMethod=63
Version=
VoltageCaps=0

タスクマネージャーを見たところ、NUMA nodesは選択できなかったのでNUMAノードは1つのみのようですね。

5.Windows 2022 c7i.24xlarge.png

コマンドで確認するためにCoreinfoをダウンロードしてきて、任意のディレクトリに配置し、実行します。

 .\Coreinfo64.exe -n

Coreinfo v3.6 - Dump information on system CPU and memory topology
Copyright (C) 2008-2022 Mark Russinovich
Sysinternals - www.sysinternals.com

Logical Processor to NUMA Node Map:
NUMA Node 0:
****************************************************************
********************************

はい、NUMAノードは1つのみですね。

参考までにCPU情報のダンプ結果は以下のとおりです。

> .\Coreinfo64.exe

Coreinfo v3.6 - Dump information on system CPU and memory topology
Copyright (C) 2008-2022 Mark Russinovich
Sysinternals - www.sysinternals.com

Intel(R) Xeon(R) Platinum 8488C
Intel64 Family 6 Model 143 Stepping 8, GenuineIntel
Microcode signature: 2B000620
HTT             *       Hyperthreading enabled
CET             -       Supports Control Flow Enforcement Technology
Kernel CET      -       Kernel-mode CET Enabled
User CET        -       User-mode CET Allowed
HYPERVISOR      *       Hypervisor is present
VMX             -       Supports Intel hardware-assisted virtualization
SVM             -       Supports AMD hardware-assisted virtualization
X64             *       Supports 64-bit mode

SMX             -       Supports Intel trusted execution
SKINIT          -       Supports AMD SKINIT
SGX             -       Supports Intel SGX

NX              *       Supports no-execute page protection
SMEP            *       Supports Supervisor Mode Execution Prevention
SMAP            *       Supports Supervisor Mode Access Prevention
PAGE1GB         *       Supports 1 GB large pages
PAE             *       Supports > 32-bit physical addresses
PAT             *       Supports Page Attribute Table
PSE             *       Supports 4 MB pages
PSE36           *       Supports > 32-bit address 4 MB pages
PGE             *       Supports global bit in page tables
SS              *       Supports bus snooping for cache operations
VME             *       Supports Virtual-8086 mode
RDWRFSGSBASE    *       Supports direct GS/FS base access

FPU             *       Implements i387 floating point instructions
MMX             *       Supports MMX instruction set
MMXEXT          -       Implements AMD MMX extensions
3DNOW           -       Supports 3DNow! instructions
3DNOWEXT        -       Supports 3DNow! extension instructions
SSE             *       Supports Streaming SIMD Extensions
SSE2            *       Supports Streaming SIMD Extensions 2
SSE3            *       Supports Streaming SIMD Extensions 3
SSSE3           *       Supports Supplemental SIMD Extensions 3
SSE4a           -       Supports Streaming SIMDR Extensions 4a
SSE4.1          *       Supports Streaming SIMD Extensions 4.1
SSE4.2          *       Supports Streaming SIMD Extensions 4.2

AES             *       Supports AES extensions
AVX             *       Supports AVX instruction extensions
AVX2            *       Supports AVX2 instruction extensions
AVX-512-F       *       Supports AVX-512 Foundation instructions
AVX-512-DQ      *       Supports AVX-512 double and quadword instructions
AVX-512-IFAMA   *       Supports AVX-512 integer Fused multiply-add instructions
AVX-512-PF      -       Supports AVX-512 prefetch instructions
AVX-512-ER      -       Supports AVX-512 exponential and reciprocal instructions
AVX-512-CD      *       Supports AVX-512 conflict detection instructions
AVX-512-BW      *       Supports AVX-512 byte and word instructions
AVX-512-VL      *       Supports AVX-512 vector length instructions
FMA             *       Supports FMA extensions using YMM state
MSR             *       Implements RDMSR/WRMSR instructions
MTRR            *       Supports Memory Type Range Registers
XSAVE           *       Supports XSAVE/XRSTOR instructions
OSXSAVE         *       Supports XSETBV/XGETBV instructions
RDRAND          *       Supports RDRAND instruction
RDSEED          *       Supports RDSEED instruction

CMOV            *       Supports CMOVcc instruction
CLFSH           *       Supports CLFLUSH instruction
CX8             *       Supports compare and exchange 8-byte instructions
CX16            *       Supports CMPXCHG16B instruction
BMI1            *       Supports bit manipulation extensions 1
BMI2            *       Supports bit manipulation extensions 2
ADX             *       Supports ADCX/ADOX instructions
DCA             -       Supports prefetch from memory-mapped device
F16C            *       Supports half-precision instruction
FXSR            *       Supports FXSAVE/FXSTOR instructions
FFXSR           -       Supports optimized FXSAVE/FSRSTOR instruction
MONITOR         *       Supports MONITOR and MWAIT instructions
MOVBE           *       Supports MOVBE instruction
ERMSB           *       Supports Enhanced REP MOVSB/STOSB
PCLMULDQ        *       Supports PCLMULDQ instruction
POPCNT          *       Supports POPCNT instruction
LZCNT           *       Supports LZCNT instruction
SEP             *       Supports fast system call instructions
LAHF-SAHF       *       Supports LAHF/SAHF instructions in 64-bit mode
HLE             -       Supports Hardware Lock Elision instructions
RTM             -       Supports Restricted Transactional Memory instructions

DE              *       Supports I/O breakpoints including CR4.DE
DTES64          -       Can write history of 64-bit branch addresses
DS              -       Implements memory-resident debug buffer
DS-CPL          -       Supports Debug Store feature with CPL
PCID            *       Supports PCIDs and settable CR4.PCIDE
INVPCID         *       Supports INVPCID instruction
PDCM            *       Supports Performance Capabilities MSR
RDTSCP          *       Supports RDTSCP instruction
TSC             *       Supports RDTSC instruction
TSC-DEADLINE    *       Local APIC supports one-shot deadline timer
TSC-INVARIANT   *       TSC runs at constant rate
xTPR            -       Supports disabling task priority messages

EIST            -       Supports Enhanced Intel Speedstep
ACPI            -       Implements MSR for power management
TM              -       Implements thermal monitor circuitry
TM2             -       Implements Thermal Monitor 2 control
APIC            *       Implements software-accessible local APIC
x2APIC          *       Supports x2APIC

CNXT-ID         -       L1 data cache mode adaptive or BIOS

MCE             *       Supports Machine Check, INT18 and CR4.MCE
MCA             *       Implements Machine Check Architecture
PBE             -       Supports use of FERR#/PBE# pin

PSN             -       Implements 96-bit processor serial number

PREFETCHW       *       Supports PREFETCHW instruction

Maximum implemented CPUID leaves: 0000001F (Basic), 80000008 (Extended).
Maximum implemented address width: 48 bits (virtual), 46 bits (physical).

Processor signature: 000806F8

Logical to Physical Processor Map:
Physical Processor 0 (Hyperthreaded):
**--------------------------------------------------------------
--------------------------------
Physical Processor 1 (Hyperthreaded):
--**------------------------------------------------------------
--------------------------------
Physical Processor 2 (Hyperthreaded):
----**----------------------------------------------------------
--------------------------------
Physical Processor 3 (Hyperthreaded):
------**--------------------------------------------------------
.
.
(中略)
.
.
----------------------------------------------------------------
------------------------**------
Physical Processor 45 (Hyperthreaded):
----------------------------------------------------------------
--------------------------**----
Physical Processor 46 (Hyperthreaded):
----------------------------------------------------------------
----------------------------**--
Physical Processor 47 (Hyperthreaded):
----------------------------------------------------------------
------------------------------**

Logical Processor to Socket Map:
Socket 0:
****************************************************************
********************************

Logical Processor to NUMA Node Map:
NUMA Node 0:
****************************************************************
********************************

No NUMA nodes.

Logical Processor to Cache Map:
Data Cache          0, Level 1,   48 KB, Assoc  12, LineSize  64
**--------------------------------------------------------------
--------------------------------
Instruction Cache   0, Level 1,   32 KB, Assoc   8, LineSize  64
**--------------------------------------------------------------
--------------------------------
Unified Cache       0, Level 2,    2 MB, Assoc  16, LineSize  64
**--------------------------------------------------------------
--------------------------------
Unified Cache       1, Level 3,  105 MB, Assoc  15, LineSize  64
****************************************************************
--------------------------------
Data Cache          1, Level 1,   48 KB, Assoc  12, LineSize  64
--**------------------------------------------------------------
--------------------------------
Instruction Cache   1, Level 1,   32 KB, Assoc   8, LineSize  64
--**------------------------------------------------------------
--------------------------------
Unified Cache       2, Level 2,    2 MB, Assoc  16, LineSize  64
--**------------------------------------------------------------
--------------------------------
Data Cache          2, Level 1,   48 KB, Assoc  12, LineSize  64
----**----------------------------------------------------------
--------------------------------
Instruction Cache   2, Level 1,   32 KB, Assoc   8, LineSize  64
----**----------------------------------------------------------
.
.
(中略)
.
.
----------------------------------------------------------------
--------------------------**----
Unified Cache      46, Level 2,    2 MB, Assoc  16, LineSize  64
----------------------------------------------------------------
--------------------------**----
Data Cache         46, Level 1,   48 KB, Assoc  12, LineSize  64
----------------------------------------------------------------
----------------------------**--
Instruction Cache  46, Level 1,   32 KB, Assoc   8, LineSize  64
----------------------------------------------------------------
----------------------------**--
Unified Cache      47, Level 2,    2 MB, Assoc  16, LineSize  64
----------------------------------------------------------------
----------------------------**--
Data Cache         47, Level 1,   48 KB, Assoc  12, LineSize  64
----------------------------------------------------------------
------------------------------**
Instruction Cache  47, Level 1,   32 KB, Assoc   8, LineSize  64
----------------------------------------------------------------
------------------------------**
Unified Cache      48, Level 2,    2 MB, Assoc  16, LineSize  64
----------------------------------------------------------------
------------------------------**

Logical Processor to Group Map:
Group 0:
****************************************************************
--------------------------------
Group 1:
----------------------------------------------------------------
********************************

c6i.24xlarge × Windows Server 2022

c7i.24xrlageからc6i.24xlargeに変更した際も確認します。

タスクマネージャーを見たところ、NUMA nodesは選択でき、NUMAノードごとのCPU使用率を確認できるようになりました。

6.Windows 2022 c6i.24xlarge.png

CoreinfoからもNUMAノードが2つあることが確認できました。

> .\Coreinfo64.exe -n

Coreinfo v3.6 - Dump information on system CPU and memory topology
Copyright (C) 2008-2022 Mark Russinovich
Sysinternals - www.sysinternals.com

Logical Processor to NUMA Node Map:
NUMA Node 0:
************************************************
------------------------------------------------
NUMA Node 1:
------------------------------------------------
************************************************

ちなみに、その後c7i.24xlargeに変更しましたが、NUMAノードは1つのみになっていました。

つまり、c7i.24xlarge → c6i.24xlarge → c7i.24xlarge とインスタンスタイプを変更しましたが、NUMA構成は選択したインスタンスタイプによって動的に変更されたものをOS側でも正しく認識されていることが分かります。

インスタンスサイズを増強しても、そのリソースを効率的に使用できるかはアプリケーション次第

EC2インスタンスのインスタンスタイプごとのNUMA/非NUMAの違いがあることを紹介しました。

これはNUMAに限った話ではないのですが、インスタンスサイズを増強しても、そのリソースを効率的に使用できるかはアプリケーション次第です。ボトルネックになっている箇所についてきちんと調査をした上で変更作業を行いましょう。

NUMAのチューニングについては以下記事が参考になります。

https://rheb.hatenablog.com/entry/2023/05/03/170800

この記事が誰かの助けになれば幸いです。

以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.