应用程序经过socket系统调用和远程主机进行通信,每个socket都有一个读写缓冲区。读缓冲区保存了远程主机发送过来的数据,若是缓冲区已满,则数据会被丢弃,写缓冲期保存了要发送到远程主机的数据,若是写缓冲区已慢,则系统的应用程序在写入数据时会阻塞。可知,缓冲区是有大小的。
BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。若是缓冲区过小,那么 TCP 窗口就不能彻底打开,这会对性能形成限制。若是缓冲区太大,那么宝贵的内存资源就会形成浪费。若是您设置的缓冲区大小正好合适,那么就能够彻底利用可用的带宽
BDP = 带宽 * 延迟 (单位: 字节)
带宽*延时/8*2^20 = ***B
带宽: Mebibites 延时:s (RTT)
注意:调整tcp前,必须调整core,对于tcp,udp来讲不能超出core的限制
默认值:
net.core.rmem_max = 131071 128K
net.core.rmem_default = 124928
net.core.wmem_max = 131071
net.core.wmem_default = 124928
net.ipv4.tcp_rmem = 4096 87380 2691072
net.ipv4.tcp_wmem = 4096 16384 2691072
示例:
带宽:1.5M 100M
延时:500ms 3000ms
1.5 * 0.5 / 8 * 2^20 ======= net.ipv4.tcp_wmem
100 * 3 / 8 * 2^20 ======= net.ipv4.tcp_wmem