老男孩讀PCIe之一:從PCIe速度說起

原創內容,轉載請注明:  [http://www.od-music.com]  謝謝!

從今天開始,老男孩要開始講PCIe了。對我來說,這是個很大的挑戰:首先,我自己本身,對PCIe并沒有做到胸有成竹,我的PCIe知識也只是停留在理論階段,我并沒有實際做過任何有關PCIe的東西;其次,我要把PCIe講得深入淺出,讓讀者輕易接受,我覺得很難,根本原因就是我還沒有做到胸有PCIe;最后,我的文章都會通過ssdfans公眾號推出(還沒有關注的同學,趕快關注),很多讀者都是PCIe高手,班門弄斧,我深感壓力。但盡管如此,我還是決定出發,我自己努力學習,盡我最大能力把我學到的東西分享給大家,也希望各位PCIe大拿們,幫忙斧正文章的錯誤,我希望不是我一個人,而是和各位大拿們一起,帶領大家攀上PCIe的高峰。

 

我是從事SSD工作的,為什么要講PCIe,原因很簡單,現在很多SSD都開始使用PCIe接口。那為什么SSD要用PCIe接口?因為它快,比SATA快。它究竟有多快?我們今天首先從PCIe接口的速度開始我們的PCIe之旅。

 

PCIe發展到現在,從PCIe 1.0,PCIe 2.0,到現在的PCIe 3.0,速度一代比一代快。

Link Width這一行,我們看到X1,X2,X4…,這是什么意思?這是指PCIe連接的通道數(Lane)。就像高速一樣,有單根道,有2根道的,有4根道的,不過像8根道或者更多道的公路不常見,但PCIe是可以最多32條道的。

 

兩個設備之間的PCIe連接,叫做一個Link,如下圖所示:

從A到B,之間是個雙向連接,車可以從A駛向B,同時,車也可以從B駛向A,各行其道。兩個PCIe設備之間,有專門的發送和接收通道,數據可以同時往兩個方向傳輸,PCIe spec稱這種工作模式為雙單工模式(dual-simplex),可以理解為全雙工模式。

 

SATA是什么工作模式呢?

和PCIe一樣,SATA也有獨立的發送和接收通道,但與PCIe工作模式不一樣:同一時間,只有一條道可以進行數據傳輸,也就是說,你在一條道上發送數據,另外一條道上不能接收數據,反之亦然。這種工作模式應該是半雙工模式。PCIe猶如我們的手機,雙方可以同時講話,而SATA就是對講機了,一個人在說話,另外一個人就只能聽不能說。

 

回到前面PCIe帶寬那張表,上面的帶寬,比如PCIe3.0x1,帶寬為2GB/s,是指雙向帶寬,即讀寫帶寬。如果單指讀或者寫,該值應該減半,即1GB/s的讀速度或者寫速度。

 

我們來看看表里面的帶寬是怎么算出來的。

 

PCIe是串行總線,PCIe1.0的線上比特傳輸速率為2.5Gb/s,物理層使用8/10編碼,即8比特的數據,實際在物理線路上是需要傳輸10比特的,因此:

PCIe1.0 x 1的帶寬=(2.5Gb/s x 2(雙向通道))/ 10bit = 0.5GB/s

這是單條Lane的帶寬,有幾條Lane,那么整個帶寬就0.5GB/s乘以Lane的數目。

 

PCIe2.0的線上比特傳輸速率在PCIe1.0的基礎上翻了一倍,為5Gb/s,物理層同樣使用8/10編碼,所以:

PCIe2.0 x 1的帶寬=(5Gb/s x 2(雙向通道))/ 10bit = 1GB/s

同樣,有多少條Lane,帶寬就是1GB/s乘以Lane的數目。

 

PCIe3.0的線上比特傳輸速率沒有在PCIe2.0的基礎上翻倍,不是10Gb/s,而是8Gb/s,但物理層使用的是128/130編碼進行數據傳輸,所以:

PCIe3.0 x 1的帶寬=(8Gb/s x 2(雙向通道))/ 8bit = 2GB/s

同樣,有多少條Lane,帶寬就是2GB/s乘以Lane的數目。

 

由于采用了128/130編碼,128比特的數據,只額外增加了2bit的開銷,有效數據傳輸比率增大,雖然線上比特傳輸率沒有翻倍,但有效數據帶寬還是在PCIe2.0的基礎上做到翻倍。

 

這里值得一提的是,上面算出的數據帶寬已經考慮到8/10或者128/130編碼,因此,大家在算帶寬的時候,沒有必要再考慮線上編碼的問題了。

 

和SATA單通道不同,PCIe連接可以通過增加通道數擴展帶寬,彈性十足。通道數越多,速度越快。不過,通道數越多,成本越高,占用更多空間,還有就是更耗電。因此,使用多少通道,應該在性能和其他因素之間進行一個綜合考慮。單考慮性能的話,PCIe最高帶寬可達64GB/s,PCIe 3.0 x 32對應的帶寬,很恐怖的一個數據。不過,現有的PCIe接口SSD,一般最多使用4通道,如PCIe3.0x4,雙向帶寬為8GB/s,讀或者寫帶寬為4GB/s。

幾個GB/s的傳輸速度,讀寫小電影那是杠杠的。

在此,順便來算算PCIe3.0x4理論上最大的4K IOPS。PCIe3.0x4理論最大讀或者寫的速度為4GB/s,不考慮協議開銷,每秒可以傳輸4GB/4K個4K大小的IO,該值為1M,即理論上最大IOPS為1000K。因此,一個SSD,不管你底層用什么介質,flash還是3d xpoint,接口速度就這么塊,最大IOPS是不可能超過這個值的。

 

PCIe是從PCI發展過來的,PCIe的”e”是express的簡稱,快的意思。PCIe怎么就能比PCI(或者PCI-X)快呢?PCIe在物理傳輸上,跟PCI有著本質的區別:PCI使用并口傳輸數據,而PCIe使用的是串口傳輸。我PCI并行總線,單個時鐘周期可以傳輸32bit或者64bit,怎么就比不了你單個時鐘周期傳輸1個bit數據的串行總線呢?

在實際時鐘頻率比較低的情況下,并口因為可以同時傳輸若干比特,速率確實比串口快。隨著技術的發展,數據傳輸速率要求越來越快,要求時鐘頻率也越來越快,但是,并行總線時鐘頻率不是想快就能快的。

 

在發送端,數據在某個時鐘沿傳出去(左邊時鐘第一個上升沿),在接收端,數據在下個時鐘沿(右邊時鐘第二個上升沿)接收。因此,要在接收端能正確采集到數據,要求時鐘的周期必須大于數據傳輸的時間(從發送端到接收端,flight time)。受限于數據傳輸時間(該時間還隨著數據線長度的增加而增加),因此時鐘頻率不能做得太高。另外,時鐘信號在線上傳輸的時候,也會存在相位偏移(clock skew ),影響接收端的數據采集;還有,并行傳輸,接收端必須等最慢的那個bit數據到了以后,才能鎖住整個數據 (signal skew)。

 

PCIe使用串行總線進行數據傳輸就沒有這些問題。它沒有外部時鐘信號,它的時鐘信息通過8/10編碼或者128/130編碼嵌入在數據流,接收端可以從數據流里面恢復時鐘信息,因此,它不受數據在線上傳輸時間的限制,你導線多長都沒有問題,你數據傳輸頻率多快也沒有問題;沒有外部時鐘信號,自然就沒有所謂的clock skew問題;由于是串行傳輸,只有一個bit傳輸,所以不存在signal skew問題。但是,如果使用多條lane傳輸數據(串行中又有并行,哈哈),這個問題又回來了,因為接收端同樣要等最慢的那個lane上的數據到達才能處理整個數據。

分類目錄 存儲, 技術文章.
掃一掃二維碼或者微信搜索公眾號ssdfans關注(添加朋友->點最下面的公眾號->搜索ssdfans),可以經??吹絊SD技術和產業的文章(SSD Fans只推送干貨)。
ssdfans微信群介紹
技術討論群 覆蓋2000多位中國和世界華人圈SSD以及存儲技術精英
固件、軟件、測試群 固件、軟件和測試技術討論
異構計算群 討論人工智能和GPU、FPGA、CPU異構計算
ASIC-FPGA群 芯片和FPGA硬件技術討論群
閃存器件群 NAND、3D XPoint等固態存儲介質技術討論
企業級 企業級SSD、企業級存儲
銷售群 全國SSD供應商都在這里,砍砍價,會比某東便宜20%
工作求職群 存儲行業換工作,發招聘,要關注各大公司招聘信息,趕快來
高管群 各大SSD相關存儲公司高管和創始人、投資人

想加入這些群,請微信掃描下面二維碼,或搜索nanoarchplus,加阿呆為微信好友,介紹你的昵稱-單位-職務,注明群名,拉你進群。SSD業界需要什么幫助,也可以找阿呆聊。