簡體   English   中英

通過單個發送呼叫發送合理數量的數據

[英]Reasonable amount of data to be send via single send call

我需要通過TCP套接字將不同大小的文件發送給其他客戶端。 現在,我想知道一次發送函數調用中合理的數據量是多少?

例如,我將不會發送帶有1個發送請求的完整2兆字節的圖片-我要將該文件切成較小的緩沖區,然后一個接一個地發送。 但是這些緩沖區應該小還是大? 我知道發送並不能保證發送我所有的數據-我會檢查一下。

只要您發送的緩沖區大於MTU(通常小於1500字節左右),那都沒有關系。 如果您發送的緩沖區大於MTU,則OS或NIC會將您的數據包分段成MTU大小的數據包,您無需擔心自己進行分段。 發生這種情況時,操作系統將阻止對send()的調用,直到所有數據都已發送或發生錯誤為止–如果需要,您可以在一次調用中發送全部2 MB內存,這不會有問題。

如果僅是由於緩存影響(例如,由於數據不能全部放入L2緩存中,您將有更多的緩存未命中),那么在真正大的調用與剛好大於MTU的調用之間,您可能會得到稍差的性能,但是那不太可能很重要。

但是,對於文件傳輸,如果使用TransmitFile()函數,而不是將文件中的數據手動讀取到緩沖區中然后發送,則實際上會獲得更好的性能。 該功能針對文件傳輸進行了高度優化,因為它可以將文件數據直接從文件系統直接DMA傳輸到NIC,而無需將其從內核空間復制到用戶空間,然后再復制回內核空間。 這稱為零復制操作

正在執行send()的線程的響應能力確定了通過單個send()調用send()的數據大小

  1. 如果您的線程除了send()之外沒有其他事情要做,則無需砍掉數據,您可以一次性發送全部數據,然后讓OS來完成。 在這種情況下,send()調用直到發送完所有數據后才返回,因此您的線程無法響應/執行其他任何操作。

  2. 另一方面,如果希望執行send()的線程能夠響應,則需要將數據分解為較小的緩沖區。 這樣,您的線程將在每個部分緩沖區的send()之后獲得執行時間。 緩沖區的大小應直接取決於您擁有的數據速度,而與預期的響應速度成反比。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM