Hiểu kiến ​​trúc NUMA

Understanding Numa Architecture



Thiết kế máy tính luôn là một sự thỏa hiệp. Bốn thành phần cơ bản của máy tính - bộ xử lý trung tâm (CPU) hoặc bộ xử lý, bộ nhớ, bộ lưu trữ và bo mạch để kết nối các thành phần (hệ thống bus I / O) - được kết hợp khéo léo nhất có thể để tạo ra một chiếc máy vừa tiết kiệm chi phí vừa mạnh mẽ. Quá trình thiết kế chủ yếu liên quan đến việc tối ưu hóa bộ xử lý (đồng bộ xử lý, thiết lập đa lõi), loại và dung lượng bộ nhớ, dung lượng lưu trữ (đĩa, hệ thống tệp), cũng như giá cả. để phân phối các hoạt động cho nhiều đơn vị tính toán đơn lẻ trong không gian nhỏ nhất có thể và để thực hiện song song các lệnh tính toán sẵn có và giá cả phải chăng hơn. Về bộ nhớ, đó là một câu hỏi về số lượng hoặc kích thước có thể được giải quyết bởi đơn vị tính toán riêng lẻ và loại bộ nhớ nào hoạt động với độ trễ thấp nhất có thể. Lưu trữ thuộc về bộ nhớ ngoài và hiệu suất của nó phụ thuộc vào loại đĩa, hệ thống tệp đang sử dụng, phân luồng, giao thức truyền, kết cấu giao tiếp và số lượng thiết bị nhớ được gắn.

Thiết kế của các bus I / O đại diện cho các động mạch máy tính và xác định đáng kể mức độ và tốc độ dữ liệu có thể được trao đổi giữa các thành phần đơn lẻ được liệt kê ở trên. Danh mục hàng đầu được dẫn đầu bởi các thành phần được sử dụng trong lĩnh vực Máy tính Hiệu suất Cao (HPC). Tính đến giữa năm 2020, trong số các đại diện đương đại của HPC là Nvidia Tesla và DGX, Radeon Instinct và các sản phẩm máy gia tốc dựa trên GPU Intel Xeon Phi (xem [1,2] để so sánh sản phẩm).







Hiểu NUMA

Truy cập bộ nhớ không thống nhất (NUMA) mô tả kiến ​​trúc bộ nhớ dùng chung được sử dụng trong các hệ thống đa xử lý hiện đại. NUMA là một hệ thống tính toán bao gồm một số nút đơn theo cách mà bộ nhớ tổng hợp được chia sẻ giữa tất cả các nút: mỗi CPU được gán bộ nhớ cục bộ riêng và có thể truy cập bộ nhớ từ các CPU khác trong hệ thống [12,7].



NUMA là một hệ thống thông minh được sử dụng để kết nối nhiều đơn vị xử lý trung tâm (CPU) với bất kỳ dung lượng bộ nhớ máy tính nào có sẵn trên máy tính. Các nút NUMA đơn lẻ được kết nối qua một mạng có thể mở rộng (bus I / O) để CPU có thể truy cập một cách có hệ thống vào bộ nhớ được liên kết với các nút NUMA khác.



Bộ nhớ cục bộ là bộ nhớ mà CPU đang sử dụng trong một nút NUMA cụ thể. Bộ nhớ ngoài hoặc bộ nhớ từ xa là bộ nhớ mà CPU đang lấy từ một nút NUMA khác. Thuật ngữ tỷ lệ NUMA mô tả tỷ lệ giữa chi phí truy cập bộ nhớ ngoài và chi phí truy cập bộ nhớ cục bộ. Tỷ lệ này càng lớn thì chi phí càng lớn và do đó thời gian truy cập bộ nhớ càng lâu.





Tuy nhiên, sẽ mất nhiều thời gian hơn khi CPU đó đang truy cập bộ nhớ cục bộ của chính nó. Truy cập bộ nhớ cục bộ là một lợi thế lớn, vì nó kết hợp độ trễ thấp với băng thông cao. Ngược lại, truy cập bộ nhớ thuộc bất kỳ CPU nào khác có độ trễ cao hơn và hiệu suất băng thông thấp hơn.

Nhìn lại: Sự phát triển của bộ đa xử lý bộ nhớ dùng chung

Frank Dennemann [8] nói rằng kiến ​​trúc hệ thống hiện đại không cho phép truy cập bộ nhớ thống nhất (UMA) thực sự, mặc dù các hệ thống này được thiết kế đặc biệt cho mục đích đó. Nói một cách đơn giản, ý tưởng của tính toán song song là có một nhóm bộ xử lý hợp tác để tính toán một tác vụ nhất định, do đó tăng tốc độ tính toán tuần tự cổ điển khác.



Theo giải thích của Frank Dennemann [8], vào đầu những năm 1970, nhu cầu về các hệ thống có thể phục vụ nhiều hoạt động của người dùng đồng thời và tạo ra quá nhiều dữ liệu đã trở thành xu hướng chủ đạo với sự ra đời của các hệ thống cơ sở dữ liệu quan hệ. Mặc dù có tỷ lệ hiệu suất bộ xử lý ấn tượng, các hệ thống đa bộ xử lý đã được trang bị tốt hơn để xử lý khối lượng công việc này. Để cung cấp một hệ thống hiệu quả về chi phí, không gian địa chỉ bộ nhớ dùng chung đã trở thành trọng tâm của nghiên cứu. Ban đầu, các hệ thống sử dụng công tắc thanh ngang đã được ủng hộ, tuy nhiên với sự phức tạp trong thiết kế này đã được mở rộng cùng với sự gia tăng của các bộ xử lý, điều này làm cho hệ thống dựa trên bus trở nên hấp dẫn hơn. Các bộ xử lý trong hệ thống bus [có thể] truy cập toàn bộ không gian bộ nhớ bằng cách gửi các yêu cầu trên bus, một cách rất hiệu quả về chi phí để sử dụng bộ nhớ khả dụng một cách tối ưu nhất có thể.

Tuy nhiên, các hệ thống máy tính dựa trên bus đi kèm với một nút cổ chai - lượng băng thông hạn chế dẫn đến các vấn đề về khả năng mở rộng. Càng nhiều CPU được thêm vào hệ thống, thì băng thông trên mỗi nút càng ít. Hơn nữa, càng nhiều CPU được thêm vào, bus càng dài và do đó độ trễ càng cao.

Hầu hết các CPU được xây dựng trong một mặt phẳng hai chiều. Các CPU cũng phải có thêm bộ điều khiển bộ nhớ tích hợp. Giải pháp đơn giản là có bốn bus bộ nhớ (trên, dưới, trái, phải) cho mỗi lõi CPU cho phép băng thông đầy đủ khả dụng, nhưng điều đó chỉ đi xa được. CPU bị trì trệ với bốn lõi trong một thời gian đáng kể. Thêm dấu vết ở trên và bên dưới cho phép các xe buýt trực tiếp đi qua các CPU đối lập theo đường chéo khi các chip trở thành 3D. Đặt một CPU bốn mã trên một thẻ, sau đó được kết nối với một bus, là bước hợp lý tiếp theo.

Ngày nay, mỗi bộ xử lý chứa nhiều lõi với bộ nhớ đệm trên chip được chia sẻ và bộ nhớ ngoài chip và có chi phí truy cập bộ nhớ thay đổi trên các phần khác nhau của bộ nhớ trong máy chủ.

Nâng cao hiệu quả truy cập dữ liệu là một trong những mục tiêu chính của thiết kế CPU hiện đại. Mỗi lõi CPU được ưu đãi với một bộ nhớ cache cấp một nhỏ (32 KB) và một bộ nhớ cache cấp 2 lớn hơn (256 KB). Các lõi khác nhau sau đó sẽ chia sẻ bộ nhớ cache cấp 3 có dung lượng vài MB, kích thước của bộ nhớ này đã tăng lên đáng kể theo thời gian.

Để tránh bỏ sót bộ nhớ cache - yêu cầu dữ liệu không có trong bộ nhớ cache - rất nhiều thời gian nghiên cứu được dành cho việc tìm đúng số bộ nhớ đệm CPU, cấu trúc bộ nhớ đệm và các thuật toán tương ứng. Xem [8] để biết giải thích chi tiết hơn về giao thức cho bộ nhớ đệm snoop [4] và đồng tiền trong bộ nhớ cache [3,5], cũng như các ý tưởng thiết kế đằng sau NUMA.

Hỗ trợ phần mềm cho NUMA

Có hai biện pháp tối ưu hóa phần mềm có thể cải thiện hiệu suất của hệ thống hỗ trợ kiến ​​trúc NUMA - mối quan hệ của bộ xử lý và vị trí dữ liệu. Như đã giải thích trong [19], mối quan hệ của bộ xử lý […] cho phép liên kết và hủy liên kết của một quá trình hoặc một luồng với một CPU hoặc một loạt CPU để quá trình hoặc luồng sẽ chỉ thực thi trên CPU hoặc các CPU được chỉ định thay vì bất kỳ CPU nào. Thuật ngữ vị trí dữ liệu đề cập đến các sửa đổi phần mềm trong đó mã và dữ liệu được lưu giữ gần nhất có thể trong bộ nhớ.

Các hệ điều hành liên quan đến UNIX và UNIX khác nhau hỗ trợ NUMA theo những cách sau (danh sách dưới đây được lấy từ [14]):

  • Silicon Graphics IRIX hỗ trợ kiến ​​trúc ccNUMA trên CPU 1240 với dòng máy chủ Origin.
  • Microsoft Windows 7 và Windows Server 2008 R2 đã thêm hỗ trợ cho kiến ​​trúc NUMA trên 64 lõi logic.
  • Phiên bản 2.5 của nhân Linux đã có hỗ trợ NUMA cơ bản, hỗ trợ này được cải thiện hơn nữa trong các bản phát hành nhân tiếp theo. Phiên bản 3.8 của hạt nhân Linux mang lại một nền tảng NUMA mới cho phép phát triển các chính sách NUMA hiệu quả hơn trong các bản phát hành hạt nhân sau này [13]. Phiên bản 3.13 của nhân Linux mang đến nhiều chính sách nhằm đặt một tiến trình gần bộ nhớ của nó, cùng với việc xử lý các trường hợp, chẳng hạn như chia sẻ các trang bộ nhớ giữa các tiến trình hoặc sử dụng các trang khổng lồ trong suốt; cài đặt kiểm soát hệ thống mới cho phép bật hoặc tắt cân bằng NUMA, cũng như cấu hình các tham số cân bằng bộ nhớ NUMA khác nhau [15].
  • Cả Oracle và OpenSolaris đều mô hình kiến ​​trúc NUMA với sự ra đời của các nhóm logic.
  • FreeBSD đã thêm cấu hình chính sách và sở thích NUMA ban đầu trong phiên bản 11.0.

Trong cuốn sách Khoa học và Công nghệ Máy tính, Kỷ yếu Hội nghị Quốc tế (CST2016), Ning Cai gợi ý rằng nghiên cứu về kiến ​​trúc NUMA chủ yếu tập trung vào môi trường máy tính cao cấp và đề xuất Phân vùng Radix nhận biết NUMA (NaRP), nhằm tối ưu hóa hiệu suất trong số các bộ nhớ đệm được chia sẻ trong NUMA nút để tăng tốc các ứng dụng kinh doanh thông minh. Như vậy, NUMA đại diện cho điểm trung gian giữa hệ thống bộ nhớ dùng chung (SMP) với một vài bộ xử lý [6].

NUMA và Linux

Như đã nêu ở trên, hạt nhân Linux đã hỗ trợ NUMA kể từ phiên bản 2.5. Cả Debian GNU / Linux và Ubuntu đều cung cấp hỗ trợ NUMA để tối ưu hóa quy trình với hai gói phần mềm numactl [16] và numad [17]. Với sự trợ giúp của lệnh numactl, bạn có thể liệt kê danh sách hàng tồn kho của NUMA nút có sẵn trong hệ thống của mình [18]:

# numactl - phần cứng
có sẵn:2điểm giao(0-1)
nút0cpus:0 1 2 3 4 5 6 7 16 17 18 19 hai mươi hai mươi mốt 22 2. 3
nút0kích thước:8157MB
nút0miễn phí:88MB
nút1cpus:số 8 9 10 mười một 12 13 14 mười lăm 24 25 26 27 28 29 30 31
nút1kích thước:8191MB
nút1miễn phí:5176MB
khoảng cách nút:
nút0 1
0:10 hai mươi
1:hai mươi 10

NumaTop là một công cụ hữu ích do Intel phát triển để giám sát vị trí bộ nhớ thời gian chạy và phân tích các quy trình trong hệ thống NUMA [10,11]. Công cụ có thể xác định các tắc nghẽn hiệu suất tiềm ẩn liên quan đến NUMA và do đó giúp cân bằng lại việc phân bổ bộ nhớ / CPU để tối đa hóa tiềm năng của hệ thống NUMA. Xem [9] để biết mô tả chi tiết hơn.

Các tình huống sử dụng

Máy tính hỗ trợ công nghệ NUMA cho phép tất cả CPU truy cập trực tiếp vào toàn bộ bộ nhớ - CPU coi đây là một không gian địa chỉ tuyến tính, duy nhất. Điều này dẫn đến việc sử dụng lược đồ địa chỉ 64 bit hiệu quả hơn, dẫn đến chuyển động dữ liệu nhanh hơn, ít sao chép dữ liệu hơn và lập trình dễ dàng hơn.

Hệ thống NUMA khá hấp dẫn đối với các ứng dụng phía máy chủ, chẳng hạn như hệ thống hỗ trợ quyết định và khai thác dữ liệu. Hơn nữa, việc viết ứng dụng để chơi game và phần mềm hiệu suất cao trở nên dễ dàng hơn nhiều với kiến ​​trúc này.

Phần kết luận

Kết luận, kiến ​​trúc NUMA giải quyết khả năng mở rộng, đây là một trong những lợi ích chính của nó. Trong một CPU NUMA, một nút sẽ có băng thông cao hơn hoặc độ trễ thấp hơn để truy cập bộ nhớ trên cùng một nút đó (ví dụ: CPU cục bộ yêu cầu quyền truy cập bộ nhớ cùng lúc với quyền truy cập từ xa; mức độ ưu tiên là trên CPU cục bộ). Điều này sẽ cải thiện đáng kể thông lượng bộ nhớ nếu dữ liệu được bản địa hóa cho các quy trình cụ thể (và do đó là các bộ xử lý). Những bất lợi là chi phí cao hơn khi di chuyển dữ liệu từ bộ xử lý này sang bộ xử lý khác. Miễn là trường hợp này không xảy ra quá thường xuyên, hệ thống NUMA sẽ hoạt động tốt hơn các hệ thống có kiến ​​trúc truyền thống hơn.

Liên kết và tài liệu tham khảo

  1. So sánh NVIDIA Tesla và Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-tesla_vs_radeon-instinct
  2. So sánh NVIDIA DGX-1 với Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-dgx-1_vs_radeon-instinct
  3. Tính liên kết trong bộ nhớ cache, Wikipedia, https://en.wikipedia.org/wiki/Cache_coherence
  4. Rình mò xe buýt, Wikipedia, https://en.wikipedia.org/wiki/Bus_snooping
  5. Giao thức gắn kết bộ nhớ đệm trong hệ thống đa xử lý, Geeks dành cho người yêu thích máy tính, https://www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system /
  6. Khoa học và công nghệ máy tính - Kỷ yếu Hội nghị Quốc tế (CST2016), Ning Cai (Ed.), World Scientific Publishing Co Pte Ltd, ISBN: 9789813146419
  7. Daniel P. Bovet và Marco Cesati: Hiểu kiến ​​trúc NUMA trong Hiểu Nhân Linux, ấn bản thứ 3, O’Reilly, https://www.oreilly.com/library/view/undilities-the-linux/0596005652/
  8. Frank Dennemann: NUMA Deep Dive Phần 1: Từ UMA đến NUMA, https://frankdenneman.nl/2016/07/07/numa-deep-dive-part-1-uma-numa/
  9. Colin Ian King: NumaTop: Một công cụ giám sát hệ thống NUMA, http://smackerelofopinion.blogspot.com/2015/09/numatop-numa-system-monitoring-tool.html
  10. Numatop, https://github.com/intel/numatop
  11. Gói numatop cho Debian GNU / Linux, https://packages.debian.org/buster/numatop
  12. Jonathan Kehayias: Tìm hiểu Kiến trúc / Truy cập Bộ nhớ Không Đồng nhất (NUMA), https://www.sqlskills.com/blogs/jonathan/und hieu-non-uniform-memory-accessarchitectures-numa/
  13. Tin tức về hạt nhân Linux cho Kernel 3.8, https://kernelnewbies.org/Linux_3.8
  14. Truy cập bộ nhớ không đồng nhất (NUMA), Wikipedia, https://en.wikipedia.org/wiki/Non-uniform_memory_access
  15. Tài liệu Quản lý Bộ nhớ Linux, NUMA, https://www.kernel.org/doc/html/latest/vm/numa.html
  16. Gói numactl cho Debian GNU / Linux, https://packages.debian.org/sid/admin/numactl
  17. Số gói dành cho Debian GNU / Linux, https://packages.debian.org/buster/numad
  18. Làm cách nào để biết cấu hình NUMA được bật hay tắt ?, https://www.thegeekdiary.com/centos-rhel-how-to-find-if-numa-configuration-is-enabled-or-disabled/
  19. Mối quan hệ của bộ xử lý, Wikipedia, https://en.wikipedia.org/wiki/Processor_affinity

Cảm ơn

Các tác giả xin chân thành cảm ơn Gerold Rupprecht đã hỗ trợ ông trong quá trình chuẩn bị bài báo này.

Giới thiệu về tác giả

Plaxedes Nehanda là một người đa năng, đa năng, có nhiều kỹ năng, người luôn đội nhiều mũ, trong số họ, một người lập kế hoạch sự kiện, một trợ lý ảo, một người sao chép, cũng như một nhà nghiên cứu nhiệt huyết, có trụ sở tại Johannesburg, Nam Phi.

Hoàng tử K. Nehanda là Kỹ sư đo lường và điều khiển (Đo lường) tại Paeflow Metering ở Harare, Zimbabwe.

Frank Hofmann làm việc trên đường - tốt nhất là từ Berlin (Đức), Geneva (Thụy Sĩ) và Cape Town (Nam Phi) - với tư cách là nhà phát triển, nhà đào tạo và tác giả cho các tạp chí như Linux-User và Linux Magazine. Ông cũng là đồng tác giả của cuốn sách quản lý gói Debian ( http://www.dpmb.org ).