郭曉梅

[摘要]目前,大數據的高性能處理日益重要,本文通過實驗,對非均勻存儲訪問的各種情況進行了詳細深入的研究,對訪問時間差別進行了深入的分析,揭示了在非均勻存儲訪問系統中線程本地存儲訪問和遠程存儲訪問的性能差異。發現了讀寫內存、不同訪問距離等各種情況下線程內存訪問的性能特點。得出了在線程調度中的重要結論,對應用程序在進行大數據處理的線程調度執行提出了重要的建議。
[關鍵詞]大數據;非均勻存儲訪問;線程調度
[中圖分類號]C37 [文獻標識碼]A [文章編號]1672-5158(2013)06-0031-02
引言
在當今時代,互聯網迅猛發展,各行各業數據量猛增。數據種類繁多,數據量巨大,大數據時代來臨。隨著大數據的來臨,大數據處理成為越來越有價值的工作,而大數據的高性能處理則至關重要。
目前大數據處理大都采用多處理器系統,而多處理器系統中的非均勻存儲訪問架構為進行大數據高性能處理的主流體系結構之一。
1 非均勻存儲訪問技術特點
1.1 多處理器系統模式
在多處理器系統中,比較流行的有三種模式,即對稱多處理模式、大規模并行處理模式、非均勻存儲訪問模式。對稱多處理模式是在一個主存上連接著兩個或兩個以上的處理器,這些處理器共享一個主存,也被稱為均勻性存儲訪問系統。大規模并行處理模式是分布式存儲器模式,可擴展性比較好,但是需要并行編程和并行編譯,在軟件系統構建上比較復雜,使用不便。非均勻存儲訪問架構是將若干個單元通過專門的互聯設備聯結在一起組成分布式和共享內存系統。每一個處理器可以訪問自己單元的存儲器,也可以訪問其他單元的存儲器,所有訪存有遠近、時延長短之分,稱為非均勻存儲訪問。
1.2 非均勻存儲訪問架構的性能優勢
非均勻存儲訪問架構的性能優勢主要體現在以下幾個方面:第一,非均勻存儲訪問處理器訪問同一單元上的內存的速度比一般對稱多處理模式超出一倍。第二,非均勻存儲訪問的突破性技術徹底擺脫了傳統的超大總線對多處理結構的束縛,它大大增強單一操作系統可管理的處理器、內存和I/O插槽。最后,非均勻存儲訪問系統提供內存互聯的硬件結構,這種技術可以開發新型動態的分區系統。系統分區可以允許系統管理員根據用戶工作負荷的要求,簡單地管理和使用CPU和內存資源,從而達到最高的資源利用率和最佳的性能。正因為以上的原因,非均勻存儲訪問架構得到越來越廣泛的應用。
2 非均勻存儲訪問技術線程訪問時間研究
非均勻存儲訪問系統的基本特征是具有多個CPU模塊,每個CPU模塊由多個核(如6個)組成,并且具有獨立的本地內存、I/O槽口等。由于其節點之間可以通過互聯模塊進行連接和信息交互,因此每個CPU可以訪問整個系統的內存。但是線程訪問遠近程存儲器的時間是不一樣的。
我們使用的非均勻存儲訪問系統是四個主頻為2.2GHZ的雙核AMD opteron多處理器,每個處理器有2x1GB DDR400 DRAM內存。如(圖1)所示。四個處理器由coherent HyperTransport(相關性超傳輸)總線連接,每個處理器有一條雙向HyperTransport(超傳輸)總線和I/O連接,兩條雙向相關性超傳輸總線分別和另外兩個雙核處理器連接。每個雙向超傳輸總線的數據傳輸帶寬為4 GB/s。系統有4個節點NO,N1,N2,N3。每個節點有自己的內存控制器(MCT),連接著本節點的內存。每個節點有2個核CO,c1,兩個核連接著一個系統需求接口(sRI),系統中間有一個交叉設備XBar,SRI、內存控制器、各種各樣的超傳輸總線都和XBar連接。
在非均勻存儲訪問系統中,內存需要可以來自于本節點的核,也可以通過超傳輸總線來自于其它節點的核。前者叫做本地訪問,對內存的訪問要求從核到SRI,到XBAR,再到MCT;后者叫做遠程訪問,內存訪問要求的路線是從遠程節點的核通過超傳輸總線到達XBAR,從XBAR再到MCT。每個節點的SRI、XBAR、MCT都有緩沖區,緩沖區用來存放需要傳送的數據包。
在非均勻存儲訪問系統里,影響應用程序處理大數據的性能主要有以下幾個方面:
①遠程內存訪問。處理器訪問遠程存儲器的次數多少會直接影響一個應用程序的性能。提高非均勻存儲訪問系統性能的策略之一就是減少遠程訪問的次數。要盡可能地讓進程在本節點執行。
②相互連接的超傳輸總線帶寬的影響。
③內存競爭的影響。當許多處理器在同一時刻訪問一個內存單元的時候就會出現內存競爭,內存競爭會增加內存響應時間,降低程序的執行效率。恰當的數據分配策略會減少內存競爭。
④內存帶寬的影響。
⑤緩沖區影響。在非均勻存儲訪問多處理器系統中,緩沖區在性能上發揮著重要的作用。如果處理器在本地緩沖區中沒有找到需要的數據,就會訪問遠程的存儲器。
⑥系統中各種各樣緩沖區可容納緩沖隊列長度的影響。
2.1 遠近程內存訪問的時間差別
線程本地存儲器訪問和遠程存儲器訪問時間究竟有多大的差別呢?我們先用一個例子來研究遠近程內存訪問的時間差別。
我們得到處理器所記錄的當前時間的方法是使用時鐘周期數TSC的值乘以CPU的時鐘周期cycle來得到。就是在每次處理器啟動的時候把TSC的值清零,然后每個時鐘周期TSC的值都加1,這樣要得到代碼執行的周期數就在一段固定代碼執行前后分別讀取TSC的值即可。用下列公式可以計算代碼執行時間:
T=(TSC1-TSC2)·cycle
當線程運行和訪問內存都在同一個節點時,就叫做本地訪問或0-跳訪問。當線程運行在一個節點,訪問內存卻在其他節點,就叫做遠程訪問。在遠程訪問中,如果線程運行的節點和內存訪問的節點是彼此直接連接的,就叫做1-跳訪問。如果線程運行的節點和內存訪問的節點不是直接連接的,就叫做2-跳訪問。如圖1中,線程在節點0運行,則其對于節點1、2、3的訪問即為遠程存儲器訪問,對節點1、2的內存訪問叫做1-跳訪問,對節點3的內存訪問叫做2-跳訪問。
我們采取了一段串行程序使用一個線程向不同節點存儲區域寫入5M相同大小數據量的方法來測試訪問的時間,并且,每次實驗我們重復了2000次。統計結果表明,本地存儲區域的訪問時間是最短的,平均為2166μs;而對于遠程存儲區域的訪問則需要較長的時間,其中1、2節點的訪問時間平均達2445μs,而節點3,訪問距離最遠,訪問時間也最長,平均達3032μS。
由此實驗可見,在非均勻存儲訪問系統中,訪問遠程內存的速度要慢于訪問本地內存的速度。在本例中,1-跳距離的存儲訪問時間是本地存儲訪問的1.13倍,2-跳距離的存儲訪問時間是本地存儲訪問的1.4倍。訪問遠程數據的距離越遠,付出的時間代價越高。我們在應用程序中,盡量保持數據在節點內部訪問。
2.2 單線程只讀和只寫遠近程存儲器的研究
如果對內存的訪問為只讀或只寫,本地訪問和遠程訪問時間有什么差別呢?我們用下面的例子來研究只讀和只寫訪問遠近程存儲器的影響。
我們采取一段串行程序使用一個線程向不同節點存儲區域分別連續讀出和寫入60M相同大小數據量,讀寫入的大小要遠遠大于緩沖區大小。線程運行在節點O的C0上。并且整個系統只有這一個線程運行。線程的數據訪問分為以下幾種:
*線程本地訪問節點0內存。(0-跳)
*線程遠程訪問節點1內存。(1-跳)
*線程遠程訪問節點2內存。(1-跳)
*線程遠程訪問節點3內存。(2-跳)
訪問時間結果表明,隨著訪問距離的增加,讀寫訪問的訪問時間都增加了。每種情況,寫訪問的時間都大于讀訪問的時間,因為寫操作會生產出更多的內存帶寬負載。但是讀寫訪問的訪問時間都隨著訪問內存距離的增加而增加。
2.3 節點間和節點內線程調度訪問研究
如果是多線程,通過節點調度多線程有以下幾個制約因素:
*系統是否空閑,也就是系統有沒有其它負載;
*多線程是否訪問各自私有的數據。
*多線程是否訪問共享的數據。
我們先來研究系統空閑下線程只訪問本節點私有的數據。
我們使用2個線程進行寫操作,每個線程都寫)260M的數據,都訪問本節點的內存。第一種方法是節點間調度,即一個線程在節點0的核0運行,另一個線程在節點1的核0運行;第二種方法是節點內調度,即2個線程分別在節點0的核0和核1上運行。比較兩個線程運行的總時間。結果表明,節點間調度線程的執行時間比較少。
隨后我們又使用8-CPU非均勻存儲訪問系統工作站(AMDOpteron 6168 1.9GHz processor,64G RAM,48 core,8節點,每個節點6個核)實驗環境,使用6個線程進行寫操作。都訪問本節點內存,分上述兩種情況,即第一種方法是節點間調度,每個線程分別在6個節點的核0運行,第二種方法是節點內調度,6個線程都在節點0的每個核運行。結果為,第一種情況執行時間比較少。
在非均勻存儲訪問系統中,在空閑執行環境下訪問私有的數據,我們應盡量避免使用第二種情況來調度線程。從負載平衡的角度來說,如果某一個節點負載過多,而其他節點空閑,必然會導致一個節點內的資源產生競爭,從而影響應用程序的執行效率。
如果在空閑執行環境下,各線程之間的數據共享,我們使用2個線程和6個線程在2種環境下分別進行了測試。線程都訪問本節點內存,第一種方法是節點間調度,一個線程在節點0的核0運行,另一個線程在節點1的核0運行;第二種方法是節點內調度,2個線程分別在節點0的核0和核1上運行。6個線程寫60M數據的兩種方法,第一種方法是節點間調度,每個線程分別在6個節點的核0運行,第二種方法是節點內調度,6個線程都在節點0的每個核運行。結果表明,在節點內調度線程的執行時間比較少。因為各線程之間數據共享,訪問內存數據的距離越短,時間越少。所以我們在空閑環境下進行線程調度,各線程間數據共享,優先從節點內進行調度,一個節點調度為完畢,再從另一個節點進行調度。
對于上述實驗,我們在系統有少量負載的情況下也做了相應的實驗,取得了類似的結果。
由此可知,在非均勻存儲訪問系統中,在系統空閑的情況下,或者少量負載的情況下,對應用程序進行大數據處理提出如下建議:
*如果線程僅訪問本節點私有的數據,優先從節點間調度線程;
*如果線程間數據共享,優先從節點內調度線程,一個節點飽和后再從另一個節點進行調度;
*如果線程需要訪問的既有獨立數據又有共享數據,但私有數據遠遠大于共享數據,優先從節點間調度線程。
3 結束語
當今,在互聯網及各行各業都存在著大量數據需要高性能處理,本文通過實驗對非均勻存儲訪問技術進行研究,發現了讀寫內存、不同訪問距離等各種情況下線程內存訪問的性能特點。得出了應用程序在線程調度中的重要結論,對大數據的高性能處理有重要的指導意義。
參考文獻
[1]都志輝,高性能計算并行編程技術-MPI并行程序設計,清華大學出版社,2001
[2]郭靜,祝永志,王延玲,基于MPI的動態負載平衡算法的研究[J]計算機技術與發展,2009(05)