• Note: Max_Payload_Size applies only to TLPs with data payloads; Memory Read Requests are not restricted in length by Max_Payload_Size. The size of the Memory Read Request is controlled by the Length field • Completions must not include more data than permitted by Max_Payload_Size. • Receivers must check for violations of this rule. Refer to Section 2.2. • Memory Read Requests may be completed with one, or in some cases, multiple Completions • Software must set Max_Read_Request_Size of an isochronous-configured device with a value that does not exceed the Max_Payload_Size set for the device.
maximum read request size參數,避免系統帶寬被某些個SSD霸占。
想要和SSD攻城獅還有全世界的大牛討論SSD及存儲相關技術?加nanoarch為微信好友,拉你進ssdfans微信群。
最近PCIe在SSDFans上鏡率挺高,那我們來聊兩句MAX_READ_REQUEST_SIZE 和MAX_PAYLOAD_SIZE。
這兩個東西都在PCIe Capability Structure 08h (Device Control Register)里
Maximum Payload Size (簡稱MPS)
控制一個TLP可以傳輸的最大數據長度。作為接收方,必須能處理跟MPS設定大小相同的TLP數據包,作為傳輸方,不允許創建超過MPS設定的TLP數據包。
PCIe協議允許最大一個Payload可以到4K,但是規定了在整個傳輸路徑上的所有Device,都必須使用相同的MPS設置,同時不能超過該路徑上一個設備的MPS能力值。也就是說,MPS capability高的設備要遷就低的設備。以PCIe SSD來說,插到一塊老掉牙的主板上(MPS只有128 Byte),你的Payload size再大,也是沒有用的。
系統的MPS值設置是在上電以后的設備枚舉配置階段完成的, 以主板上的PCIe RC和PCIe SSD為例,他們都在Device Capability Register里聲明自己能支持的各種MPS,OS的PCIe驅動偵測到他們各自的能力值,然后挑低的那個設置到兩者的Device Control register中。
PCIe SSD自身的MPS capability則是在其PCIe core初始化階段設置的。
Maximum Read Request Size
在配置階段,OS的PCIe驅動也會配置另外一個參數maximum read request size,用於控制一個Memory read的最大size,最大4K(以128 Byte為單位)
Read request size是可以大於MPS滴,比如給一個MPS=128 Byte的PCIe SSD發一個512 Byte的read request,PCIe SSD可以通過返回多個4個128 Byte的 Cpld,或者8個64 Byte的Cpld,完成這個request的響應。OS 層面可以通過控制PCIe SSD的maximum read request size參數,平衡多個PCIe SSD之間的吞吐量,避免系統帶寬(總共40個lane)被某些個SSD霸占。
同時,Read request size也對PCIe SSD的Performance有影響,這個size太小,意味着同樣的data,需要發送更多的request去獲取,而read request的TLP是不帶任何data payload的。
舉例來說,要傳64K的數據,如果read request=128 byte, 需要512個read TLP,512個TLP的浪費那是不小滴。
為了提高特別是大Block Size data的傳輸效率,盡量把read