Linux環境下的UIO(Userspace I/O)
UIO 使用者空間下驅動程式的支援機制。DPDK使用UIO機制使網卡驅動程式運作在使用者态,并采用輪詢和零拷貝方式從網卡收取封包,提高收發封包的性能。
Linux系統中一般的驅動裝置都是運作在核心空間,而在使用者空間用應用程式調用即可,而UIO則是将驅動的很少一部分運作在核心空間,而在使用者空間實作驅動的絕大多數功能。使用UIO可以避免裝置的驅動程式需要随着核心的更新而更新的問題。
編譯UIO
sudo /sbin/modprobe uio
CPU的實體核,邏輯核概念
一個實體封裝的CPU(通過physical id區分判斷)可以有多個核(通過core id區分判斷)。而每個核可以有多個邏輯cpu(通過processor區分判斷)。一個核通過多個邏輯cpu實作這個核自己的超線程技術。
- 可以通過以下的指令來檢視:
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
- 檢視CPU型号:
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
處理器核心數
processor cores,即俗稱的“CPU核心數”,也就是每個實體CPU中core的個數
例如“Intel Core i3-2310M”是雙核處理器,它有2個“處理器核心數”。
cat /proc/cpuinfo| grep "cpu cores"| uniq
- 具有相同core id的CPU是同一個core的超線程
邏輯處理器數
邏輯處理器數英文名是logical processors,即俗稱的“邏輯CPU數”,
- 邏輯核心處理器,就是虛拟實體核心處理器的一個超線程技術
- 例如“Intel Core i3-2310M”支援超線程,一個實體核心能模拟為兩個邏輯處理器,即一塊“Intel Core i3-2310M”有4個“邏輯處理器數”。
cat /proc/cpuinfo| grep "processor"| wc -l
- SIBLING:SIBLING是核心認為的單個實體處理器所有的超線程個數,也就是一個實體封裝中的邏輯核的個數。如果SIBLING等于實際實體核數的話,就說明沒有啟動超線程,反之啟用超線程。
超線程
采用超線程即是可在同一時間裡,應用程式可以使用晶片的不同部分。雖然單線程晶片每秒鐘能夠處理成千上萬條指令,但是在任一時刻隻能夠對一條指令進行操作。而超線程技術可以使晶片同時進行多線程處理,使晶片性能得到提升。
雖然采用超線程技術能同時執行兩個線程,但它并不象兩個真正的CPU那樣,每個CPU都具有獨立的資源。當兩個線程都同時需要某一個資源時,其中一個要暫時停止,并讓出資源,直到這些資源閑置後才能繼續。是以超線程的性能并不等于兩顆CPU的性能。
如果有兩個邏輯CPU具有相同的”core id”,那麼超線程是打開的。
CPU親和性
CPU的親和性也就是cpu affinity機制,指的是程序要在指定的 CPU 上盡量長時間地運作而不被遷移到其他處理器, 通過處理器關聯可以将虛拟處理器映射到一個實體處理器上 ,也就是說把一個程式綁定到一個實體CPU上。
而且在多核運作的機器上,每個CPU本身自己會有緩存,緩存着程序使用的資訊,而程序可能會被OS排程到其他CPU上,如此,CPU cache命中率就低了。當一個程序或線程綁定CPU後,程式就會一直在指定的cpu跑,不會由作業系統排程到其他CPU上,減少了cache miss,提高性能和效率。
NUMA機制
檢視系統是否支援NUMA機制:
grep -i numa /var/log/dmesg
檢視輸出結果:
-
如果輸出結果為:
No NUMA configuration found
說明numa為disable
- 如果不是上面的内容說明numa為enable
檢視系統NUMA詳細資訊:
numactl --hardware

一個實體cpu對應一個node,系統還會為每個node配置設定一定的大小的記憶體。也就是說如果伺服器隻有一個實體cpu,那麼就隻有一個node0,領取系統全部的記憶體和cpu。個人的PC好像也隻有一個CPU,是以隻有node0。但是在大型的伺服器上會有多個node,這時每個node都會被配置設定到一定的記憶體。
NUMA的基本原理
CPU通路自身直接attach記憶體(就是系統給每個node配置設定的記憶體)對應的實體位址時,才會有較短的響應時間,俗稱Local Access,如圖示識的”fast”,如果需要通路其他cpu attach的記憶體的資料時,就需要通過inter-connect通道來通路,相比之前的通路速度要慢一些,俗稱Remote Access ,如圖示識的”slow”,那麼在dpdk的使用過程中,配置NUMA模式和NoNUMA模式是加快通路速度的方法而已。