簡體   English   中英

為什么 Linux 在 NUMA 節點之間幾乎平均分配線程?

[英]Why Linux distributes threads among NUMA nodes almost equally?

我正在運行一個具有多個線程的應用程序,似乎 Linux 在 NUMA 節點之間分配線程幾乎相等。 假設我的應用程序產生 4 個線程,而我的機器有 4 個 sockets。 我觀察到每個線程都分配給一個 NUMA 節點,幾乎相等地在所有節點之間分配線程。

這有什么原因嗎? 為什么不在一個插槽上分配所有內容,然后填充下一個?

應用程序的最佳綁定取決於應用程序的功能。 將線程分布在不同的 NUMA 節點上通常是一個好主意,以便最大化 memory 吞吐量,因為理論上可以在這種情況下使用所有 NUMA 節點(假設應用程序編寫得很好並且支持 NUMA)。 如果所有線程都綁定到同一個NUMA節點,那么只有該節點的memory可以高效訪問(訪問其他NUMA節點的memory是可以的,但是速度較慢,頁面不會自動高效Z1D78DC8ED51214E51AEFEB5114是第一個touch策略通常是大多數機器上的默認設置)。 當某些線程進行大量通信時,通常最好將它們放在同一個 NUMA 節點上,以免支付延遲開銷。 在某些情況下,將它們放在同一個核心(但不同的硬件線程)上甚至更好,這樣可以加快鎖和原子等同步操作。

如果您希望調度和綁定高效,則需要向操作系統提供更多信息或自己進行。 我強烈建議您將線程綁定到特定的內核。 使用 OpenMP 之類的 HPC 運行時/工具,這很容易(但如果您的應用程序使用低級線程,除非您不關心平台可移植性,否則會很痛苦)。 至於 NUMA,您可以使用numactl指定策略。 此答案中提供了更多信息。

在實踐中,HPC 應用程序通常使用手動綁定來提高性能。 操作系統調度程序通常不能很好地自動有效地綁定線程。 幾年前,調度程序中甚至存在導致低效行為的錯誤:請參閱Linux 調度程序:浪費核心的十年 據我所知,這樣的問題在這個領域並不少見,並且不僅限於 Linux。 高效的 NUMA 感知操作系統調度絕非易事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM