我正在編程一個由多個進程組成的軟件系統。它在Linux下以C++編程。並使用Linux共享內存在它們之間進行通信。
通常,在軟件開發中,處於性能優化的最後階段。在這裏我遇到了一個大問題。該軟件具有高性能要求,但在具有4個或8個CPU內核(通常具有多個CPU)的機器中,它只能使用3個內核,因此在第一個內核中浪費25%的CPU功率,其次是60%。經過許多研究並拋棄了互斥和鎖爭用後,我發現時間被浪費在shmdt/shmat調用上(分離並附加到共享內存段)。經過一番更多研究後,我發現這些CPU通常是AMD Opteron和Intel Xeon,它們使用稱爲NUMA的內存系統,這基本上意味着每個處理器都有其快速的「本地內存」,並且從其他CPU訪問內存是昂貴。
做了一些測試之後,問題似乎就是軟件設計成基本上任何進程都可以將共享內存段傳遞給任何其他進程以及其中的任何線程。這似乎會導致性能下降,因爲進程不斷從其他進程訪問內存。
問:
現在的問題是,有沒有辦法迫使對流程相同的CPU中執行?我並不是說要迫使他們總是在同一個處理器中執行,因爲我不在乎他們是在哪一個執行的,儘管這樣做會完成這項工作。理想情況下,有一種方法可以告訴內核:如果你在一個處理器中調度這個進程,你還必須在同一個處理器中調度這個「兄弟」進程(它是通過共享內存進行通信的進程),這樣表現不受懲罰。