1. Tổng quan.
NUMA (Non-Uniform Memory Access) là một kiến trúc bộ nhớ được sử dụng trên các hệ thống máy chủ, đặc biệt là các siêu máy chủ có nhiều CPU hoặc socket CPU. Hiểu đơn giản, NUMA chia bộ nhớ thành các vùng (nodes) và mỗi vùng có liên kết gần với một CPU cụ thể.
2. NUMA Machine là gì?
Một NUMA Machine là một hệ thống máy tính có kiến trúc NUMA. Đặc điểm chính của kiến trúc này là:
- Bộ nhớ được chia thành các nodes: Mỗi node gắn liền với một CPU hoặc một nhóm CPU.
- Tốc độ truy cập không đồng nhất:
- Cục bộ (Local): CPU truy cập bộ nhớ gắn liền với node của nó, tốc độ nhanh hơn.
- Từ xa (Remote): CPU truy cập bộ nhớ của node khác, tốc độ chậm hơn do phải đi qua liên kết liên node (interconnect).
3. Phân biệt NUMA và UMA.
- UMA (Uniform Memory Access): Tất cả CPU truy cập bộ nhớ với tốc độ như nhau.
- NUMA: Tốc độ truy cập bộ nhớ phụ thuộc vào vị trí bộ nhớ so với CPU thực hiện.
4. Liên quan đến Hugepages trên NUMA Machine.
Trong hệ thống NUMA, để tối ưu hóa hiệu suất khi sử dụng hugepages (các khối nhớ lớn hơn bộ nhớ tiêu chuẩn), cần phân phối chúng đồng đều trên các node bộ nhớ.
Phân tích lệnh.
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
- Gán 1024 hugepages cho node0 và node1.
- Mục tiêu: Sử dụng tốt nhất bộ nhớ cục bộ trên từng node để giảm độ trễ khi CPU truy cập bộ nhớ.
5. Kiểm tra hệ thống có NUMA hay không?
Bạn có thể kiểm tra xem máy của bạn có NUMA hay không bằng cách:
apt install numactl -y
numactl --hardware
Hoặc.
lscpu | grep NUMA
6. Ví dụ một máy ảo hóa không có NUMA.
Ví dụ kết quả của numactl --hardware
.
shell> numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3
node 0 size: 7937 MB
node 0 free: 5242 MB
node distances:
node 0
0: 10
Dựa vào kết quả của lệnh trên, ta có thể kết luận như sau:
- available: 1 nodes (0): Hệ thống của bạn chỉ có 1 NUMA node (node 0).
- node 0 cpus: 0 1 2 3: NUMA node 0 bao gồm 4 CPU (CPU 0, 1, 2, và 3).
- node 0 size: 7937 MB: Tổng dung lượng RAM của node 0 là 7937 MB (~7.75GB).
- node 0 free: 5242 MB: RAM trống của node 0 hiện tại là 5242 MB (~5.12GB).
- node distances:
- 0: 10: Đây là khoảng cách truy cập bộ nhớ cục bộ. Khoảng cách 10 là mặc định, cho thấy tất cả CPU trong node 0 có tốc độ truy cập bộ nhớ như nhau.
Ví dụ kết quả lscpu | grep NUMA
.
- NUMA node(s): 1: Hệ thống chỉ có 1 NUMA node, tức là toàn bộ bộ nhớ và CPU đều thuộc về một node duy nhất.
- NUMA node0 CPU(s): 0-3: Tất cả CPU trên hệ thống (CPU 0, 1, 2, 3) thuộc về node 0.
shell> lscpu | grep NUMA
NUMA node(s): 1
NUMA node0 CPU(s): 0-3
Như vậy hệ thống trên không có nhiều NUMA nodes (chỉ có 1 NUMA node). Điều này nghĩa là kiến trúc bộ nhớ hệ thống này giống như UMA (Uniform Memory Access), vì mọi CPU đều truy cập cùng một bộ nhớ mà không có sự khác biệt về độ trễ.
Áp dụng với Hugepages.
Vì hệ thống của bạn chỉ có 1 NUMA node, bạn chỉ cần gán hugepages vào node 0 bằng lệnh sau:
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
Bạn không cần sử dụng lệnh gán riêng cho từng node như:
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
Vì hệ thống của bạn không có nhiều NUMA nodes, nên bạn không cần quan tâm đến việc tối ưu bộ nhớ giữa các NUMA nodes. Cấu hình hugepages của bạn sẽ áp dụng cho toàn bộ hệ thống mà không gặp vấn đề về hiệu suất do NUMA.
6. Ví dụ một máy vật lý có NUMA.
Ví dụ kết quả của numactl --hardware
.
shell> numactl --hardware
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
node 0 size: 128557 MB
node 0 free: 12851 MB
node 1 cpus: 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
node 1 size: 129004 MB
node 1 free: 56493 MB
node distances:
node 0 1
0: 10 21
1: 21 10
Ví dụ kết quả lscpu | grep NUMA
.
shell> lscpu | grep NUMA
NUMA node(s): 2
NUMA node0 CPU(s): 0-19,40-59
NUMA node1 CPU(s): 20-39,60-79
Kết quả trên cho thấy hệ thống này có 2 NUMA nodes (node 0 và node 1).
Phân tích.
- Số lượng NUMA nodes:
- Kết quả
lscpu
chỉ ra rằng hệ thống có 2 NUMA nodes:- NUMA node0 chứa các CPU:
0-19, 40-59
. - NUMA node1 chứa các CPU:
20-39, 60-79
.
- NUMA node0 chứa các CPU:
- Kết quả
- Phân bổ CPU cores:
- Tổng cộng, hệ thống có 80 CPU logic (hyperthreads), chia đều giữa hai NUMA nodes.
- Mỗi NUMA node có 40 CPU logic.
- Kích thước bộ nhớ:
- NUMA node0 có tổng cộng 128557 MB RAM (khoảng 125 GB), trong đó còn trống 12851 MB.
- NUMA node1 có tổng cộng 129004 MB RAM (khoảng 126 GB), trong đó còn trống 56493 MB.
- Khoảng cách giữa các NUMA nodes:
node distances
:- 0: 10 là độ trễ khi CPU trong NUMA node0 truy cập bộ nhớ trong cùng NUMA node0.
- 1: 21 là độ trễ khi CPU trong NUMA node0 truy cập bộ nhớ trong NUMA node1 (và ngược lại).
- Độ trễ cao hơn (21) khi truy cập bộ nhớ “ngoài node”, điều này là điển hình của kiến trúc NUMA.
Như vậy hệ thống này là một hệ thống đa socket:
- Mỗi NUMA node tương ứng với một socket CPU.
- NUMA node0 và NUMA node1 có các CPU logic và bộ nhớ riêng biệt.
Lợi ích của NUMA:
Khi một ứng dụng được cấu hình chạy trên một NUMA node, nó sẽ tận dụng bộ nhớ cục bộ của node đó, giúp tăng hiệu năng vì giảm độ trễ bộ nhớ.
Hạn chế của NUMA:
Nếu ứng dụng không được tối ưu hóa cho NUMA (ví dụ: truy cập bộ nhớ giữa các NUMA nodes), độ trễ cao hơn có thể làm giảm hiệu năng.
7. Phân biệt NUMA node và Socket.
NUMA node không phải là số socket hay số core, mà là một khái niệm trong kiến trúc phần cứng liên quan đến cách CPU và bộ nhớ được tổ chức trên một hệ thống.
NUMA node là gì?
- NUMA (Non-Uniform Memory Access) là một kiến trúc bộ nhớ được sử dụng trong các hệ thống máy chủ có nhiều socket CPU.
- Mỗi NUMA node bao gồm:
- Một nhóm CPU (core).
- Một bộ nhớ (RAM) trực tiếp gắn với các CPU đó.
Khi CPU truy cập vào bộ nhớ trong cùng NUMA node, độ trễ thấp hơn và tốc độ nhanh hơn so với khi truy cập vào bộ nhớ nằm trên một NUMA node khác.
Phân biệt NUMA node, Socket và Core.
- Socket:
- Là một khe vật lý trên bo mạch chủ để lắp đặt một CPU (chip xử lý).
- Một socket có thể chứa một CPU duy nhất, và CPU này có thể có nhiều cores.
- Ví dụ: Nếu bạn có 2 CPU vật lý, hệ thống sẽ có 2 socket.
- Core:
- Mỗi CPU vật lý (socket) chứa nhiều cores.
- Core là đơn vị xử lý độc lập trong một CPU, có thể chạy nhiều luồng (threads).
- NUMA node:
- Một NUMA node thường đại diện cho một CPU (socket) và bộ nhớ được gắn trực tiếp vào CPU đó.
- Trong các hệ thống đa socket, mỗi socket thường là một NUMA node.
- Tuy nhiên, trong hệ thống nhỏ hoặc đơn giản (như hệ thống của bạn), cả CPU và bộ nhớ thường nằm trong một NUMA node duy nhất.