當前位置:首頁 » 硬碟大全 » dpdk怎樣查看緩存溢出
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

dpdk怎樣查看緩存溢出

發布時間: 2023-05-29 17:59:27

A. 我的電腦已啟用dhcp,但網路診斷卻顯示 乙太網未啟用dhcp.所以連不上網,怎麼辦

DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是一個雹余區域網的網源殲滾絡協議,使用UDP協議工作改團, 主要有兩個用途:給內部網路或網路服務供應商自動分配IP地址;給用戶或者內部網路管理員作為對所有計算機作中央管理的手段。

解決方法如下:

1、按win+r,輸入Services.msc;

B. 伺服器DPDK l3fwd性能測試

由於項目中需要用到dpdk,當時在伺服器平台選型上有如下2種不同配置旅氏可供選擇,為了理解老的Xeon處理器和Xeon金牌處理器對DPDK轉發性能的影響,需要在兩台伺服器上分別進行DPDK l3fwd性能轉發測試。

採用如下拓撲進行測試,測試儀的4個10GE埠連接X710-DA4的4個介面,測試時測試儀的4個埠同時打流,經過伺服器DPDK轉發後分別從X710-DA4網卡的不同介面送出,在測試儀的4個埠查看是否有丟包。在無丟包的情況下測試儀埠打流的最大速率即為伺服器端DPDK能夠提供的最大轉發能力,以MPPS為單位。

(1) 在伺服器上運行dpdk
./examples/l3fwd/x86_64-native-linux-gcc/l3fwd -l 4,6,8,10 -n 4 -w 0000:04:00.0 -w 0000:04:00.1 -w 0000:04:00.2 -w 0000:04:00.3 -- -p 0xf --config="(0,0,2),(1,0,4),(2,0,6),(3,0,8)"
運行l3fwd前有一些准備工作:

上述是DPDK官方的性能測試報告中建議的BIOS配置,在實際測試用我沒有修改CPU C-state和P-state,並關閉了超線程州告的功能。

也可以通過 cat /sys/class/net/p6p1/device/numa_node 查看

在上述操作完成後便可以知道dpdk運行時應該設置參數。
(2)測試儀打流
在l3fwd運行起來後,會添加192.18.0.0/24、192.18.1.0/24、192.18.2.0/24、192.18.3.0/24四個網段的路由,因此在測試拆跡散儀端4個埠設置流的時候需要將流的目的IP地址分別設置為上述4個網段的地址,流的目的MAC地址設置為對應介面的MAC地址。

上述的DUT2對應Server01,DUT3對應Server02,DUT1的性能數據和配置是從DPDK的性能測試報告中拿到的。DUT1、DUT2和DUT3的配置對比如下。

從測試結果可以看出,DUT3上運行DPDK就能夠實現64位元組數據包的線速轉發。對比DUT2和DUT3的轉發性能可以看出,基於 Xeon Gold 5118處理器的平台相比老的Xeon處理器平台,轉發性能是有一定提升的。
當然,從我個人的理解來看,現在的轉發測試只是測4條路由表的情況,路由表均能夠存放到處理器的一級cache中,沒有大規模內存訪問的壓力。如果有大規模的路由表或者伺服器上多個網卡同時收發數據,並且涉及到跨網卡之間的數據包轉發,當前的伺服器能否實現性能的線性擴展還需要後面進一步測試。

C. 配置了dpdk,怎麼查看

需要自己dpdk介面,自己開發

D. Hugepagesize相關配置(Linux | DPDK)

使用 cat /proc/meminfo | grep Huge 查看當前配置的Hugepagesize大小與數目

以下為臨肆棗數時配置2M*1024大頁內存的方式:

配置完成之後可以使用 cat /proc/meminfo 查看是否成功。

然後將hugepages中的內存給DPDK使用:

修改裂首/etc/default/grub 中的 GRUB_CMDLINE_LINUX,然後運行 grub 更新並重啟系統:

在GRUB_CMDLINE_LINUX配置中添加以下內容

更新grub

重啟系統

查看

注意:重啟之後需要再重新載入UIO驅動以及綁定網卡岩畢

E. 計算機網路之DPDK(四)skeleton程序

姓名:周肇星;學號:22011110028;學院:通信工程學院

【嵌牛導讀】DPDK是INTEL公司開發的一款高性能的網路驅動組件,旨在為數據面數行應用程序提供一個簡單方便的,完整的,快速的數據包處理解決方案,主要技術有用戶態、輪詢取代中斷、零拷貝、網卡RSS、訪存DirectIO等

【嵌牛鼻子】計算機網路,高性能網路,DPDK

【嵌牛提問】讀完本文,對DPDK技術的skeleton程序有所認識了嗎?

【嵌牛正文】

在rte_mempool_create創建內存池時,還會創建一個ring,這個ring隊列用來管理內存池中的每個對象元素的:記錄內存池中哪些對象使用了,哪些對象沒有被使用

當初始化好一個對象元素後,會將這個對象元素放到這個ring隊列中,在所有元素都初始化完成後,此時ring隊列存放了內存池上所有的對象元素

需要注意的是ring隊列存放的是對薯察嘩象元素的指針而已,而不是對象元素本身的拷貝

本地緩存策略:mempool的對象存放在rte_ring中,當mempool所在NUMA節點上的多個lcore都需要通過這個ring來訪問內存對象時,CAS(compare-and-set)操作會影響效率。為了解決這個問題,mempool為每個lcore維護了一個本地緩存(local cache),lcore需要取出對象時,優先在這個cache取,如果不夠,再從ring上拿

DPDK為多核設計,但skeleton為單核實例,設計初衷是實現一個最簡單的報文收發示例,程序可用於平台的單核報文出入性能測試。對收入報文不做任何處理直接發送,是基礎的二層轉發工具:將偶數個網口進行配對,從0接收到的包轉發到1口中,從1接收到的包轉發到0口中,以此類推

入口main函數調用rte_eal_init初始化運行環境,檢查網路介面數,據此調用rte_pktmbuf_pool_create分配內存池,隨後調用沒爛port_init初始化網卡並配置,最後調用lcore_main進行主處理流程

對指定埠設置隊列數,在本程序示例中,只指定單隊列。隨後,在收發兩個方向上,基於埠與隊列進行配置設置,緩沖區進行關聯設置

F. DPDK PKTGEN使用

PKTGEN有兩種形式,一種是直接由linux系統自帶的內核模塊進行發包(也就是略過協議棧,直接控制發包),另一種是依賴於dpdk的pktgen也就是本文主要講的,需要進行稍微復雜的編譯

modprobe pktgen
在/proc/net/pktgen看到以下文件:
kpktgend_0 kpktgend_1 kpktgend_2 kpktgend_3 pgctrl
其中kpktgen_*的多少是根據你的CPU的個數決定的,如我的機子的CPU數目為4,則有四個此文件皮宴。
通卜跡過命令cat /proc/net/pktgen/pgctrl可以型握並查看pktgen的版本等信息:

註:也有使用insmod的,和modprobe的區別是:比如需要安裝b模塊,但是b依賴於a模塊,因此使用insmod安裝就需要先安裝a模塊再安裝b模塊;如果使用modprobe的話,就可以直接安裝b模塊,默認將安裝a模塊
基本上設置完成後就可以進行測試,要查看是否有流量,可以使用ifstat,tcpmp工具查看,使用應用層的抓包工具是無法看到的

關鍵參數介紹

參數中,最復雜的是 -m <string>
-m <string> 配置埠到邏輯核的映射關系,使用類似BNF類語法.映射的邏輯核要與 [EAL options]中的邏輯核要一致。

運行命令 ./app/x86_64-native-linuxapp-gcc/pktgen -l 0-2 -n 3 -- -P -m "[1].0, [2].1"

官方的default.cfg內容如下:

需要修改的地方有三處:

修改完後即可執行。

圖中port1和port2已經有明顯區別,收包數相差100個包
用pkggen再發1000個包

G. 如何查看pktgen-dpdk發送的包

dpdk就是運行於通用linux+x86系統上的,具有intel核心的網卡即可。dpdk的特點有:Dpdk驅動拿數據,繞過內核,跑在用戶態,避免核心態帶大到用戶態的拷貝巧敗,即UIO利用cpu親和性,線蠢寬豎程綁定核,避免線程核間切換開銷使用大頁緩存提高內存訪問效率

H. DPDK QoS 框架 - 3. 分級調度模塊的實現

下圖展示了內部數據結構的細節。

在不同的CPU核上處理同一個發送埠的入隊/出隊操作可能會對調度器的性能造成重大影響,因此不建議這樣做。
埠入隊/出隊操作需要共享對以下數據結構的訪問:

以下操作山虛正會造成預期的性能下降:

因此,調度程序的入隊和出隊操作必須在同一個線程中運行,從而允許隊列和Bitmap操作可以是非線程安全的,並保持調度程序的數據結構在同一個CPU核內部。 盡量將數據結構局部化,避免跨線程共享。

增加NIC埠的數量僅僅需要按比例增加用於流量調度的CPU核的數量。

包處理步驟如下:

需要注意的是,這些步驟之間有很強的依賴關系,在步驟1和步驟2的結果可用之前,步驟2和步驟3不能啟動,因此沒法利用處理器亂序執行引擎提供的任何性能優化。

當有大量的數據包和隊列需要處理時,很有可能處理當前包所需要的數據結構不在L1和L2緩存中,因此上述3個步驟對內存的訪問結果會造成L1/L2 cache miss。考慮到性能因素,每個數據包都造成3次L1/L2 cache miss是不可接受的。

解決方案是提前預取需要的數據結構。預取操作有執行延遲,在此期間處理器不應該嘗試訪問當前正在預取的數據結構,因此處理器應該執行其他工作。唯一可做的其他工作是對其他輸入包執行入隊操作流程的不同步驟,從而以流水線的方式處理入隊操作。

圖逗悔2演示了入隊操作的流水線實現,其中有4個流水線階段,每個階段處理2個不同的輸入包。在給定的時間內,任何輸入包都不能成為多個流水線階段的一部分。

上面描述了非常基本的入隊流水線擁塞管理方案:將數據包塞入隊列,當隊列被填滿時,所有到達同一隊列的數據包將被丟棄,直到有數據包通過出隊操作被消費掉,才可以在隊列中塞入新的數據包。如果用RED/WRED改進入隊流水線,就可以通過查看隊列佔用率和包的優先順序,為特定的包做出入隊/丟棄決策(而不是不加選擇地將所有包入隊或者丟棄)。

在當前管道調度處理下一個包的步驟為:

以上操作涉及到的數據結構(pipe, queue, queue array, mbufs)可以在被訪問之前預取進緩存,從而避免cache miss。在對當前管道(管道A)的數據發出預取操作後,可以立即切換到另一個管道(管道B)進行處理,等到管道A的預取操作完成,再切換回去,從而利用預取本身的時延同步處理多個管道的數據。

出隊狀態機利用處理器緩存機制,盡可能同時處理多個活躍管道,從而發送更多的數據包。

輸出埠就是一個被調度器不斷的用待傳輸數據填充的隊列。對於10 GbE,每秒有12.5億個位元組需要被埠調度器填充。如果調度器的速度不夠快,不能填滿隊列(假設有足夠的待傳輸數據包和credit),那麼必然有一些帶寬會被閑置,從而產生浪費。

原則上,分層調度器出隊操作應該由網卡發送器觸發。通常情況下,一旦網卡發送隊列的輸入流量低於一個預定義的閾值,埠調度程序將被喚醒(基於中斷或輪詢的方式,通過持續監控隊列佔用決定是否被喚醒),填充更多的數據包進入隊列。

調度器需要跟蹤隨著時間推移而變化的credit信息,這需要基於時間進行credit的更新(例如,子埠和管道流量整形、流量組上限的強制執行,等等)。

每次調度器決定向網卡發送器傳遞數據包時,調度器將相應地調整其內部時間信息。因為在物理介面上每發送一個位元組所需的時間是固定的,所以可以以位元組為單位作為內部時間的參考值,這樣處理起來也會比較方便。當一個包準備傳輸時,時間以(n + h)的形式遞增,其中n是以位元組為單位的包長度,h是每個包的幀數據位元組數(包括幀頭、CRC等)。

調度器需要將其內部時間參考值與埠速率對齊,從而確保調度器不會填充超過網卡發送速率的數據,從而防止由於網卡發生隊列已滿而發譽橋生的丟包。

調度器需要讀取每次出隊調用的當前時間。CPU時間戳可以通過讀取TSC寄存器(Time Stamp Counter)或HPET寄存器(High Precision Event Timer)來獲得。當前CPU時間戳需要通過以下公式將CPU時鍾轉換為位元組數:time_bytes = time_cycles / cycles_per_byte, cycles_per_byte是傳輸一個位元組所消耗的CPU周期(例如,10GbE的埠以2GHz的CPU頻率傳輸數據,cycles_per_byte = 2G/(10G/8) = 1.6)。

調度器會維護針對網卡時間的內部時間引用,網卡時間將隨著被調度的數據包的長度(包含幀開銷)的增加而增加。在每次出隊調用時,調度程序會根據當前時間檢查其對網卡時間的內部引用:

調度器往返延遲(SRTD,Scheler Round Trip Delay)是調度器連續兩次檢查同一管道之間的時間(以CPU周期為單位)。

為了跟上發送埠的速率(即避免網卡帶寬的浪費),調度器應該能夠比網卡發送器實際傳輸速度更快地調度數據包。

假設沒有發生埠帶寬超賣,調度器需要根據配置的令牌桶,跟蹤每個管道的速率。這意味著管道的令牌桶的大小應該設置得足夠高,以防止它因較大的SRTD而溢出,從而導致管道的可用帶寬損失。

當以下所有條件都滿足時,調度器可以為(子埠S、管道P、流量組TC、隊列Q)做出發送下一個包的合理調度決策:

如果以上條件都滿足,則可以選擇一個數據包進行傳輸,並從子埠S、子埠S的流量組TC、管道P、管道P的流量組TC中減去必要的credit。

由於所有數據包長度的最大公約數是一個位元組,因此以位元組作為credit的計量單位。傳輸n位元組的數據包所需的credit數等於(n+h),其中h等於每個數據包的幀開銷(以位元組為單位)。

子埠和管道的流量整形是通過令牌桶來實現的,每個令牌桶使用一個飽和計數器(saturated counter)來實現,通過這個計數器跟蹤credit的數值。

令牌桶泛型參數和操作如下表所示:

為了實現上面描述的令牌桶通用操作,當前設計使用下表中給出的持久數據結構:

可以用以下公式計算桶速率(單位為位元組/秒):

式中,r = 埠線速(單位為位元組/秒)。

令牌桶操作的實現如下表所示:

同一管道內TC的優先順序是嚴格定義的,其調度是由管道出隊狀態機實現的,該狀態機按照優先順序升序排列選擇隊列。因此,隊列0(與TC 0相關,優先順序最高的TC)在隊列1(優先順序低於TC 0的TC 1)之前被處理,隊列1在隊列2(優先順序低於TC 1的TC 2)之前被處理,並繼續下去,直到除最低優先順序TC以外的所有TC隊列都被處理。最後,隊列12-15(盡力而為TC, 最低優先順序TC)被處理。

管道和子埠級別的TC不支持流量整形(traffic shaping),所以在這兩個級別的上下文里沒有維護令牌桶。管道和子埠級別的TC上限被強制限定為周期性回填的credit,每次在管道/子埠級別處理包的時候,credit就會被消費掉,如下兩表所示。

子埠/管道TC強制上限的持久化數據結構:

最低優先順序TC(盡力而為TC,best effort TC)的WRR設計方案從簡單到復雜的演變如下表所示。

子埠流量組X的超售是一個配置問題,當子埠的成員管道為流量組X分配的帶寬大於在上層子埠級別為同一流量組分配的帶寬時發生。

特定子埠和流量組的超售完全是管道和子埠級配置的結果,而不是由於運行時流量負載的動態演化(如擁塞)造成的。

如果當前子埠對流量組X的總體需求較低,超售的存在並不代表問題,因為所有成員管道對流量組X的需求已經完全可以滿足。然而,當所有子埠的成員管道的流量組X的需求合在一起超過了在子埠級別配置的限制時,這將不再能夠實現。

下表總結了處理這個問題的一些可能的方案,當前實現是基於第三種方案。

通常,子埠TC超售只對最低優先順序的流量組啟用,這通常用於盡力而為(best effort)的流量,管理平面需要防止其他(更高優先順序)的TC發生這種情況。

為了便於實現,還假設子埠的最低優先順序TC的上限設置為子埠速率的100%,並且對於所有子埠的成員管道,管道最低優先順序TC的上限設置為管道速率的100%。

該演算法會先計算一個容量(watermark),容量會根據子埠的成員管道當前的需求定期更新,其目的是限制每個管道允許發送的最低優先順序(best effort)TC的流量。在每個TC上限計算周期開始時,在子埠級別上計算該容量,並在當前實施周期內在所有子埠的成員管道上使用相同的容量值。下面說明在每個周期開始時作為子埠級別計算的容量如何傳播到所有子埠的成員管道的。

當前計算周期開始(和上一個計算周期結束的時間相同)時,容量值需要基於上一周期開始時分配給盡力而為TC但沒有被子埠的成員管道消費掉的帶寬值做出調整。

如果子埠有盡力而為TC帶寬沒用掉,就增加當前時段的容量值,以鼓勵子埠的成員管道消耗更多帶寬。否則,降低容量值,以強制子埠成員管道的盡力而為TC帶寬的消耗相等。

容量值的增加或減少會以很小的增量進行,因此可能需要幾個執行周期才能達到平衡狀態。由於子埠成員管道對盡力而為TC的需求的變化,這種狀態可以在任何時候發生改變,例如,由於需求增加(當需要降低容量值時)或需求減少(當可以增加容量值時)。

在需求較低時,為防止子埠成員管道佔用太多帶寬,需要設置高容量值。容量的最高值被選為子埠成員管道配置的最高速率。下表說明了容量操作。

每個TC流量限制執行周期開始時,從子埠級別到成員管道的容量傳遞:

容量值計算:

為了調度一個報文,調度器必須在多個隊列里查看報文和credit,當調度器需要查看的隊列越多,其性能就越低。

調度器維護了活躍隊列的Bitmap,從而可以直接跳過非活躍隊列,但是為了檢測特定的管道是否有足夠的credit,必須使用管道發送狀態機進行探測,無論最終調度結果如何(沒有報文或者至少產生一個報文),總會消耗CPU時間。

這個場景強調了策略對調度器性能的重要性:如果管道沒有足夠的credit,其數據包應該盡快丟棄(在觸發分層調度器之前),從而可以將管道隊列標識為不活躍,發送端就可以跳過這個管道而不用消耗資源去查看管道credit。

埠調度器的性能針對大量隊列進行了優化。但如果隊列的數量很少,那麼對於相同級別的活動流量,埠調度器的性能預期會比一小組消息傳遞隊列的性能更差。

I. 吃雞是一個吃內存還是cpu的

CPU是怎樣訪問內存的?簡單的答案是,CPU執行一條訪存指令,把讀寫請求發往內存管理單元。內存管理單元進行虛實轉換,把命令發往匯流排。匯流排把命令傳遞給內存控制器,內存控制器再次翻譯地址,對相應內存顆粒進行存取。之後,讀取的數據寫入確認按照原路返回。再復雜些,當中插入多級緩存,在每一層緩存都未命中的情況下,訪問才會最終達到內存顆粒。

知道了完整的路徑,開始研究每一步中的硬體到底是怎麼樣的,讀寫指令到底是怎樣在其中傳輸的。要了解硬體,首先要說下處理器。處理器的基本結構並不復雜,一般分為取指令、解碼、發射、執行、寫回五個步驟。而我們說的訪存,指的是訪問數據,不是指令抓取。訪問數據的指令在前三步沒有什麼特殊,在第四步,它會被發送到存取單元,等待完成。當指令在存取單元里的時候,產生了一些有趣的問題。

第一個問題,對於讀指令,當處理器在等待數據從緩存或者內存返回的時候,它到底是什麼狀態?是等在那不動呢,還是繼續執行別的指令?

一般來說,如果是亂序執行的處理器,那麼可以執行後面的指令,如果是順序執行,那麼會進入停頓狀態,直到讀取的數據返回。當然,這也不是絕對的。在舉反例之前,我們先要弄清什麼是亂序執行。亂序執行是說,對於一串給定的指令,為了提高效率,處理器會找出非真正數據依賴的指令,讓他們並行執行。但是,指令執行結果在寫回到寄存器的時候,必須是順序的。也就是說,哪怕是先被執行的指令,它的運算結果也是按照指令次序寫回到最終的寄存器的。這個和很多程序員理解的亂序執行是有區別的。我發現有些人在調試軟體問題的時候,會覺得使用了一個亂序的處理器,那麼可能會使得後面的代碼先被執行,從而讓調試無法進行。

他們搞混了兩個概念,就是訪存次序和指令完成次序。對於普通的運算指令,他們僅僅在處理器內部執行,所以你看到的是寫回次序。而對於訪存指令,指令會產生讀請求,並發送到處理器外部,你看到的次序是訪存次序。對於亂序處理器,可能同時存在多個請求,而其次序,是打亂的,不按原指令順序的。但是此時,這些被發送到外部的讀請求,並沒有拿到返回結果,指令也沒有完成。所以,這並不違反亂序執行順序完成的原則。如果有前後兩條讀指令,沒有數據相關性,哪怕是後面那條讀的數據先被返回,它的結果也不能先寫回到最終的寄存器,而是必須等到前一條完成後才可以。

對於順序執行的處理器,同樣是兩條讀指令,一般必須等到前一條指令完成,才能執行第二條,所以在處理器外部看到的是按次序的訪問。不過也有例外,比如讀寫同時存在的時候,由於讀和寫指令實際上走的是兩條路徑,所以可能會看到同時存在。

還有,順序處理器上,哪怕是兩條讀指令,也有可能同時存在兩個外部請求。比如Cortex-A7,對於連續的讀指令,在前一條讀未命中一級緩存,到下一級緩存或者內存抓取數據的時候,第二條讀指令可以被執行。所以說,亂序和順序並不直接影響指令執行次序。他們的區別在於,亂序需要額外的緩沖和邏輯塊(稱為重排序緩沖, re-order buffer)來計算和存儲指令間的相關性以及執行狀態,而順序處理器沒有重排序緩沖,或者非常簡單。這些額外的面積可不小,據我所看到的,可以佔到處理器核心的40%。它們所帶來的更高的並行度,性能提升卻未必有40%。因為我們寫的單線程程序,由於存在很多數據相關,造成指令的並行是有限的,再大的重排序緩沖也解決不了真正的數據相關。所以對於功耗敏感的處理器還是使用順序執行。

還有一點需要注意,順序執行的處理器,在指令抓取,解碼和發射階段,兩條或者多條指令,是可以同時進行的。比如,無依賴關系的讀指令和運算指令,可以被同時發射到不同的執行單元,同時開始執行。但是完成還是按順序的。

但是,在有些ARM處理器上,比如Cortex-A53,向量或者加解密指令是可以亂序完成的,這類運算的結果之間並沒有數據依賴性。這點請千萬注意。

再來看看寫指令。寫和讀有個很大的不同,就是寫指令不必等待數據寫到緩存或者內存,就可以完成了。寫出去的數據會到一個叫做store buffer的緩沖,它位於一級緩存之前,只要它沒滿,處理器就可以直接往下走,不必停止並等待。所以,對於連續的寫指令,無論順序還是亂序執行處理器,都可能看到多個寫請求同時掛在處理器匯流排上。同時,由於處理器不必像讀指令那樣等待結果,就可以在單位時間內送出更多寫請求,所以我們可以看到寫帶寬通常是大於讀帶寬的。

以上所說的讀寫訪問都是在開啟緩存的情況。

對於同時存在的多個請求,有一個名詞來定義它,叫做outstanding transaction,簡稱OT。它和延遲一起,構成了我們對訪存性能的描述。延遲這個概念,在不同領域有不同的定義。在網路上,網路延遲表示單個數據包從本地出發,經過交換和路由,到達對端,然後返回,當中所花的總時間。在處理器上,我們也可以說讀寫的延遲是指令發出,經過緩存,匯流排,內存控制器,內存顆粒,然後原路返回所花費的時間。但是,更多的時候,我們說的訪存延遲是大量讀寫指令被執行後,統計出來的平均訪問時間。這裡面的區別是,當OT=1的時候,總延時是簡單累加。當OT>1,由於同時存在兩個訪存並行,總時間通常少於累加時間,並且可以少很多。這時候得到的平均延遲,也被稱作訪存延遲,並且用得更普遍。再精確一些,由於多級流水線的存在,假設流水線每一個階段都是一個時鍾周期,那訪問一級緩存的平均延遲其實就是一個周期.而對於後面的二級,三級緩存和內存,就讀指令來說,延遲就是從指令被發射(注意,不是從取指)到最終數據返回的時間,因為處理器在執行階段等待,流水線起不了作用。如果OT=2,那麼時間可能縮短將近一半。OT>1的好處在這里就體現出來了。當然,這也是有代價的,存儲未完成的讀請求的狀態需要額外的緩沖,而處理器可能也需要支持亂序執行,造成面積和功耗進一步上升。對於寫指令,只要store buffer沒滿,還是一個時鍾周期。當然,如果流水線上某個節拍大於一個時鍾周期,那平均的延時就會取決於這個最慢的時間。在讀取二級,三級緩存和內存的時候,我們可以把等待返回看作一個節拍,那麼就能很自然的理解此時的延遲了。由此,我們可以得到每一級緩存的延遲和訪存延遲。

上圖的配置中,DDR4跑在3.2Gbps,匯流排800Mhz,內存控制器800Mhz,處理器2.25Ghz。關掉緩存,用讀指令測試。延遲包括出和進兩個方向,69.8納秒,這是在總是命中一個內存物理頁的情況下的最優結果,隨機的地址訪問需要把17.5納秒再乘以2到3。關於物理頁的解釋請參看內存一章。

在內存上花的時間是控制器+物理層+介面,總共38.9納秒。百分比55%。如果是訪問隨機地址,那麼會超過70納秒,佔70%。在匯流排和非同步橋上花的時間是20納秒,8個匯流排時鍾周期,28%。處理器11.1納秒,佔16%,20個處理器時鍾周期。

所以,即使是在3.2Gbps的DDR4上,大部分時間還都是在內存,顯然優化可以從它上面入手。在處理器中的時間只有一小部分。但從另外一個方面,處理器控制著linefill,eviction的次數,地址的連續性,以及預取的效率,雖然它自己所佔時間最少,但也是優化的重點。

在ARM的路線圖上,還出現了一項並不算新的技術,稱作stashing。它來自於網路處理器,原理是外設控制器(PCIe,網卡)向處理器發送請求,把某個數據放到緩存,過程和監聽snooping很類似。在某些領域,這項技術能夠引起質的變化。舉個例子,intel至強處理器,配合它的網路轉發庫DPDK,可以做到平均80個處理器周期接受從PCIe網卡來的包,解析包頭後送還回去。80周期是個什麼概念?看過了上面的訪存延遲圖後你應該有所了解,處理器訪問下內存都需要200-300周期。而這個數據從PCIe口DMA到內存,然後處理器抓取它進行處理後,又經過DMA從PCIe口出去,整個過程肯定大於訪存時間。80周期的平均時間說明它肯定被提前送到了緩存。但傳進來的數據很多,只有PCIe或者網卡控制器才知道哪個是包頭,才能精確的推送數據,不然緩存會被無用的數據淹沒。這個過程做好了,可以讓軟體處理乙太網或者存儲單元的速度超過硬體加速器。事實上,在freescale的網路處理器上,有了硬體加速器的幫助,處理包的平均延遲需要200處理器周期,已經慢於至強了。

還有,在ARM新的面向網路和伺服器的核心上,會出現一核兩線程的設計。處理包的任務天然適合多線程,而一核兩線程可以更有效的利用硬體資源,再加上stashing,如虎添翼。(轉自玩轉單片機)

1.電子刊,不妨來一份兒!

2.35歲,工程師永遠的話題!

3.千萬不要得罪程序員,復仇方式非常狠,11行代碼讓你懷疑人生!

4.軟體工程師PK硬體工程師,未來你會服哪一個?

5.嵌入式 IoT 協議概述

6.嵌入式領域的職業發展方向是什麼?

免責聲明:本文系網路轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯系,我們將根據您提供的版權證明材料確認版權並支付稿酬或者刪除內容。

J. dpdk 技術 可否 應用於linux

DPDK主要使用了UIO、HUGEPAGE和CPU Affinity機制三個薯薯技術點來提高高速網路數據的處理性能。
UIO是實現用戶空間下驅動程序的支撐機制,DPDK使用UIO機制使網卡驅動程序(主要是intel自身的千兆igb與萬兆ixgbe驅動程序)運行在用戶態,並採用輪詢和零拷貝方式從網卡收取報文,提高收發報文的數槐者性能。
HUGEPAGE的主要好處是通過利用大內存頁提高內存的使用效率,DPDK在HUGEPAGE機制上構建內存管理系統,提高應用程序處理報文的性能。

CPU Affinity機制主要是讓各個CPU各自干自己的事情,DPDK使用CPU Affinity機制將控制面線程以及各個數據面線程綁定到不同的CPU核,節省反復調度的性能消耗。其工作模式類似於一明碰個CPU核綁定一個死循環線程,專心處理各自的業務。比如兩個網卡eth0和eth1都收包,可以讓cpu0專心處理eth0,cpu1專心處理eth1,沒必要cpu0一下處理eth0,一下又處理eth1,這樣就提高了多核CPU的使用效率。
所以,這樣看來,DPDK並不高深,用到的東西也都是Linux本身提供的特性,還有額外的內存池、環形緩存等,雖然封裝得很好,但都是比較常用經常接觸的技術。