測試伺服器最大記憶體頻寬的實驗

2021-08-31 22:41:57 字數 4227 閱讀 6948

intel nehalem架構處理器內建了記憶體控制器,處理器之間通過qpi互聯,是典型的numa系統。numa系統的特點是每乙個節點都有自己的記憶體控制器,儘管每個節點都能訪問所有節點上的記憶體,但是代價不一樣,訪問本地記憶體的速度比訪問遠端節點的速度要快。使用intel nehalem架構的處理器時,如果乙個節點需要訪問另乙個節點的記憶體,那麼資料需要通過cpu的qpi通道訪問,因此會有一些延時。下面通過實驗來測試記憶體頻寬、qpi頻寬以及訪問遠端節點和本地節點記憶體的效能差異。

硬體:雙intel® xeon® processor e5606(8m cache, 2.13 ghz, 4.80 gt/s intel® qpi)處理器,每乙個處理器有4個物理核心,並且帶有3個記憶體通道。分別在兩個處理器的乙個通道上插一根4gb ddr3 1066記憶體,記憶體總計8gb。

軟體:最簡64bit gentoo系統,kernel 3.0.6,開啟numa支援,系統中除了系統守護程序之外只執行了nfsd和sshd。

要測頻寬就要跑滿記憶體,但是真正要把記憶體頻寬跑滿還是需要一點技巧的。為了單純地將讀方向的頻寬跑滿,可以寫乙個迴圈讀陣列。這樣有幾個問題:

為了解決上面的問題以及問題引發的問題,這個實驗採取的方法是開闢乙個很大的緩衝區(256mb),然後通過迴圈將緩衝區的內容讀入乙個暫存器。迴圈步進為64位元組,但是每一次只執行一次mov指令。實際上只複製了256m/64=4m次資料。這樣可以保證每一次迴圈都從記憶體載入了資料,但是不能遍歷整個緩衝區,不過也沒有必要遍歷緩衝區的所有位元組,因為實驗目的是把記憶體頻寬跑滿,而不是為了最快複製資料或正確複製資料。

實驗中通過intel提供的效能調優工具ptu檢視當前qpi使用量和記憶體流量。

實驗**如下所示:

#define _gnu_source

#include #include #include #include #include #include #define size_in_mb 256

#define num_byte (size_in_mb*1024*1024)

#define num_long (num_byte/sizeof(long))

#define cacheline_size 64

/* wall time */

struct timeval start_time, stop_time, elapse_time;

/* process time */

struct tms start_process, stop_process, elapse_process;

typedef struct

reader_args_t;

typedef struct

gen_args_t;

void* read_data(void *arg)

}return ((void *)0);

}void* gen_data(void *arg)

int main(int argc, char *argv)

pthread_t gen_tid;

void *tret;

gen_args_t *gen_args = (gen_args_t *)malloc(sizeof(gen_args_t));

gen_args->reader_times = (size_t)atoi(argv[1]);

cpu_set_t from_binding, to_binding;

cpu_zero(&from_binding);

cpu_zero(&to_binding);

cpu_set(atoi(argv[2]), &from_binding);

cpu_set(atoi(argv[3]), &to_binding);

gen_args->binding = from_binding;

gen_args->reader_binding = to_binding;

pthread_create(&gen_tid, null, gen_data, (void *)gen_args);

pthread_join(gen_tid, &tret);

gettimeofday(&stop_time, null);

times(&stop_process);

timersub(&stop_time, &start_time, &elapse_time);

printf("time cost %ld.%06ld secs.\n",

elapse_time.tv_sec,

elapse_time.tv_usec);

return 0;

}

read_data()是讀取資料的執行緒呼叫的執行緒函式。這個函式裡面通過內嵌彙編確保真的將資料讀入了rcx暫存器。將資料讀入暫存器可以盡可能地避免寫資料的干擾。

這個程式可以在引數中選擇要複製的次數,以及兩個執行緒分別綁在哪個cpu核心上。在這個實驗平台中,第乙個cpu的4個核心對應的id是0,1,2,3;第二個cpu的4個核心對應的id是4,5,6,7。

因此,執行

zsy-gentoo thread_read # ./thread_read 500 0 0

the address of source data is 0x7f1aeda5a010

time cost 16.759935 secs.

表示程式執行500次,兩個執行緒都在cpu核心0上,因此這是節點內讀取。這一次的讀取時間是16.8秒。

執行這條命令的時候,ptu顯示如下圖所示:

可以看出,記憶體通道2上讀資料的流量為8140mb/s。這是1066的通道,所以理論頻寬為1066*8 = 8528,因此實測頻寬為理論頻寬的95%以上。

下面執行

zsy-gentoo thread_read # ./thread_read 500 3 4

the address of source data is 0x7f29a8bd7010

time cost 19.825897 secs.

這一次,緩衝區在第乙個節點上,而資料讀取在第二個節點上,所以會產生跨節點通訊。ptu顯示如下圖所示:

這一次,雖然讀取資料發生在第二個節點,但是實際的資料在第乙個節點上,所以記憶體流量全部都發生在第乙個節點上,qpi負責從第乙個節點上訪問資料。由於跨節點訪問,所以讀取資料的時間從16.8秒降為19.8秒。這一次很明顯節點1的記憶體頻寬受制於qpi所以沒有跑滿。

那麼這是不是說明qpi的頻寬就是6.8gb/s呢?根據intel的qpi***文件,4.80 gt/s的qpi相當於19.2gb/s的理論頻寬,單向頻寬就是19.2/2 = 9.6gb/s。

下面做另乙個實驗。把第二塊cpu的記憶體取出,放在第一塊cpu的乙個空閒通道上,這樣第一塊cpu就有2個通道,理論記憶體頻寬倍增,第二塊cpu沒有記憶體,因此第二塊cpu上的任何資料訪問都要通過qpi。

首先執行以下命令:

zsy-gentoo thread_read # ./thread_read 500 4 4

the address of source data is 0x7f5228a02010

time cost 20.358352 secs.

在第二塊cpu上通過qpi訪問資料,這是ptu顯示如下:

可以看出qpi使用率達到了前乙個實驗中的使用率。在第一塊cpu上的兩個記憶體通道都有流量,而且因為作業系統的排程,這兩個記憶體通道流量均衡,共同承擔了資料訪問,但是這兩個記憶體通道的使用率明顯偏低。

下面在第二塊cpu上再啟乙個訪問資料的程式,看一看qpi使用率是否會增加。

zsy-gentoo thread_read # ./thread_read 500 4 4 &

zsy-gentoo thread_read # ./thread_read 500 6 6 &

這時ptu顯示如下:

這時可以看到qpi使用率提公升到了8.3gb/s,說明併發訪問能夠提公升qpi的使用率。可是此時記憶體通道的使用率仍然不高,兩個記憶體通道都達到一半左右。因此,再增加第二塊cpu上的記憶體訪問負載,執行第三個訪問記憶體程式。

zsy-gentoo thread_read # ./thread_read 500 4 4 &

zsy-gentoo thread_read # ./thread_read 500 6 6 &

zsy-gentoo thread_read # ./thread_read 500 5 5 &

這時ptu顯示如下圖所示:

可以看出,qpi使用率並沒有明顯增加。因此可以看出在這個實驗平台上qpi的單向頻寬大約為8.3gb/s,是理論頻寬的86%。

linux伺服器頻寬測試

wget chmod a rx speedtest cli.py sudo mv speedtest cli.py usr local bin speedtest cli sudo chown root root usr local bin speedtest cli 使用speedtest cli...

測試linux伺服器頻寬

tcp上傳資料頻寬 udp上傳頻寬 多併發支援 穩定性tcp通訊網路延遲 小包 32 中包1k 大包1m udp通訊網路延遲 小包 32 中包1k 大包1m 協議可用性 iperf 可完成考量引數1 6 pstools 可完成考量引數7 8 其餘軟體 完成考量引數9 10 1.1.安裝軟體 伺服器端...

Linux伺服器的最大記憶體和CPU數

從網上查了很多資料。總算把linux下的記憶體和cpu個數搞清楚了.個人覺得使用linux系統的朋友都應該了解下。先公布如下,如有錯誤,請反饋給我。謝謝!linux系統 伺服器能夠支援的最大記憶體和cpu數.intel x86 最大cpu數 32 包括邏輯cpu 最大記憶體 64gb 最大檔案大小 ...