`
csbison
  • 浏览: 154872 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

TCP优化指导

阅读更多

TCP优化指导

翻译了一段优化TCP得文档,英文原文见:
http://dsd.lbl.gov/TCP-tuning/background.html
http://dsd.lbl.gov/TCP-tuning/linux.html

以下是如何最大化TCP WAN吞吐量的技术摘要。

TCP
使用一种称为拥塞窗口的机制来决定在同一时间能够传送多少数据包,拥塞窗口越大,吞吐量越。TCP使用“slow start”“congestion avoidance”算法来决定拥塞窗口的大小。最大的拥塞窗口大小与内核分配给每个socket的缓冲空间数量有关。对于每个socket都有一个默认的缓冲大小,这个大小可以改变,在打开这个socket之前,应用程序可以使用系统库调用更改这个大小。另外,内核还会强制指定一个最大的缓冲数值。The buffer size can be adjusted for both the send and receive ends of the socket.

获得最大的吞吐量的关键是针对你所使用的连接类型最佳化TCP接收和发送的socket缓冲区的大小。如果缓冲太小,那么TCP拥塞窗口永远不会全部打开。如果接收缓冲过大,TCP的流量控制会失效,发送方的流量会造成接收方的溢出,从而导致TCP窗口关闭,这种问题通常发生在发送方主机比接收方主机快的情况下。如果有足够的内存,那么很大的窗口在发送一方不会产生太大的问题。

最佳的缓冲大小应该是 链路带宽*延时乘积的两倍

   buffer size = 2 * bandwidth * delay

使用ping 可以获得延时的大小,使用类似pathrate的工具可以获得端到端的容量(链路中最慢的一跳的带宽)。因为ping可以给出round trip
time (RTT)
,通常可以使用下面的公式替代上边的那个:

   buffer size = bandwidth * RTT

举例来说,如果ping值是50ms,端到端的网络全部由100M以太网组成,那么TCP缓冲的大小应该是:

   0.05 sec * (100 Mbits / 8 bits) = 625 KBytes

你需要了解的TCP设置有两个,一个是 default TCP发送和接收的缓冲大小,另一个是maximum TCP发送和接收的缓冲大小。当前的类unix系统的maximum TCP缓冲大小只有256KB!关于如何调整maximum TCP缓冲的大小,请参考不同的操作系统设置方法。注意,不要将default 缓冲值设置大于128KB,因为这可能会降低LAN的性能。因此你需要在发送者和接收者两边都使用Unix setsockopt调用来设置缓冲区的大小。

====================================================================
Linux
系统的调节

因为2.42.6内核有很大的不同,因此我们首先调整两者相同的部分:
将下边的内容加入/etc/sysctl.conf,然后运行 "sysctl -p"

 # increase TCP max buffer size
 net.core.rmem_max = 16777216
 net.core.wmem_max = 16777216
 # increase Linux autotuning TCP buffer limits
 # min, default, and max number of bytes to use
 net.ipv4.tcp_rmem = 4096 87380 16777216
 net.ipv4.tcp_wmem = 4096 65536 16777216

: 请保持tcp_mem不动,默认值可以很好的工作。

另外一个可以增加TCP吞吐量的参数是增加网卡的队列大小,参考以下命令:

    ifconfig eth0 txqueuelen 1000

我曾经在一条很长而且很快的线路上做了上边的修改,结果带宽增加了近8倍!!当然这仅仅对于那些使用GigaEthernet连接的主机来说是个好主意,而且可能会有副作用,例如uneven sharing between multiple streams

Linux 2.4

Starting with Linux 2.4, Linux has implemented a sender-side autotuning mechanism, so that setting the opitimal buffer size on the sender is not needed. This assumes you have set large buffers on the recieve side, as the sending buffer will not grow beyond the size of the recieve buffer.
However, Linux 2.4 has some other strange behavior that one needs to be aware of. For example: The value for ssthresh for a given path is cached in the routing table. This means that if a connection has has a retransmition and reduces its window, then all connections to that host for the next 10 minutes will use a reduced window size, and not even try to increase its window. The only way to disable this behavior is to do the following before all new connections (you must be root):

      sysctl -w net.ipv4.route.flush=1

More information on various tuning parameters for Linux 2.4 are available in the Ipsysctl tutorial .


Linux 2.6

Starting in Linux 2.6.7 (and back-ported to 2.4.27), BIC TCP is part of the kernel, and enabled by default. BIC TCP helps
recover quickly from packet loss on high-speed WANs, and appears to work quite well. A BIC implementation bug was discovered, but this was fixed in Linux 2.6.11, so you should upgrade to this version or higher.

Linux 2.6 also includes and both send and receiver-side automatic buffer tuning (up to the maximum sizes specified above).

There is also a setting to fix the ssthresh caching weirdness described above.

There are a couple additional sysctl settings for 2.6:

  # don't cache ssthresh from previous connection
  net.ipv4.tcp_no_metrics_save = 1
  # recommended to increase this for 1000 BT or higher
  net.core.netdev_max_backlog = 2500
  # for 10 GigE, use this
  # net.core.netdev_max_backlog = 30000   

Starting with version 2.6.13, Linux supports pluggable congestion control algorithms . The congestion control algorithm used is set using the sysctl variable net.ipv4.tcp_congestion_control, which is set to Reno by default. (Apparently they decided that BIC was not quite ready for prime time.) The current set of congestion control options are:

   * reno: Traditional TCP used by almost all other OSes. (default)
   * bic: BIC-TCP
   * highspeed: HighSpeed TCP: Sally Floyd's suggested algorithm
   * htcp: Hamilton TCP
   * hybla: For satellite links
   * scalable: Scalable TCP
   * vegas: TCP Vegas
   * westwood: optimized for lossy networks

For very long fast paths, I suggest trying HTCP or BIC-TCP if Reno is not is not performing as desired. To set this, do the following:

   sysctl -w net.ipv4.tcp_congestion_control=htcp

More information on each of these algorithms and some results can be found here .

Note: Linux 2.6.11 and under has a serious problem with certain Gigabit and 10 Gig ethernet drivers and NICs that support "tcp segmentation offload", such as the Intel e1000 and ixgb drivers, the Broadcom tg3, and the s2io 10 GigE drivers. This problem was fixed in version 2.6.12. A workaround for this problem is to use ethtool to disable segmentation offload:
    ethtool -K eth0 tso off
This will reduce your overall performance, but will make TCP over LFNs far more stable.

More information on tuning parameters and defaults for Linux 2.6 are available in the file ip-sysctl.txt, which is part of
the 2.6 source distribution.

And finally a warning for both 2.4 and 2.6: for very large BDP paths where the TCP window is > 20 MB, you are likely to hit the Linux SACK implementation problem. If Linux has too many packets in flight when it gets a SACK event, it takes too long to located the SACKed packet, and you get a TCP timeout and CWND goes back to 1 packet. Restricting the TCP buffer size to about 12 MB seems to avoid this problem, but clearly limits your total throughput. Another solution is to disable SACK.


Linux 2.2

If you are still running Linux 2.2, upgrade! If this is not possible, add the following to /etc/rc.d/rc.local

  echo 8388608 > /proc/sys/net/core/wmem_max  
  echo 8388608 > /proc/sys/net/core/rmem_max
  echo 65536 > /proc/sys/net/core/rmem_default
  echo 65536 > /proc/sys/net/core/wmem_default

====================================================================
Windows
系统的调节

使用注册表编辑器修改下边的键值

# turn on window scale and timestamp option
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Tcp1323=3
# set default TCP window size (default = 16KB)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpWindowSize=131400
# and maybe set this too: (default = not set )
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\GlobalMaxTcpWindowSize=16777216

进一步信息请参考:
http://support.microsoft.com/default.aspx?scid=kb;en-us;314053
http://www.microsoft.com/technet/itsolutions/network/deploy/depovg/tcpip2k.mspx
http://www.speedguide.net/read_articles.php?id=157
====================================================================
FreeBSD
系统的调节

将下面的内容添加到/etc/sysctl.conf中,然后重启。

   kern.ipc.maxsockbuf=16777216
   net.inet.tcp.rfc1323=1
   net.inet.tcp.sendspace=1048576
   net.inet.tcp.recvspace=1048576

进一步信息请参考FreeBSD Network Tuning Performance Tuning Guide

http://www.wormulon.net/files/pub/FreeBSD_Network_Tuning_-_slides.pdf

 

 

分享到:
评论

相关推荐

    VOLTE丢包率优化指导书.pdf

    【VoLTE丢包率优化指导书】着重于提高VoLTE(Voice over LTE)服务的通话质量,通过深入理解和解决丢包问题。VoLTE是4G网络中的语音通信技术,为用户提供高质量、低延迟的语音通话体验。丢包率是衡量VoLTE服务质量的...

    安川机器人与PLC进行UDP通信与TCP通信指导手册.zip

    本指导手册重点讲述了如何利用UDP和TCP这两种网络协议进行两者之间的数据交互。以下是对这两个通信方式的详细介绍: 1. **UDP通信** (用户数据报协议) UDP是一种无连接的、不可靠的传输层协议,它不保证数据包的...

    Quectel_EC600S系列_TCP(IP)_应用指导_V1.2.rar

    《Quectel EC600S系列:TCP/IP应用指南》 ...《Quectel EC600S系列_TCP(IP)_应用指导_V1.2.pdf》文档将提供更详尽的技术细节和实际操作指导,对于EC600S-CN模块的使用者来说是一份宝贵的参考资料。

    Quectel_EC200T_TCP(IP)_应用指导_V1.1.pdf

    【Quectel EC200T TCP/IP应用指导】是针对移远通信的EC20和EC200系列4G模块的一份详细的技术指南,旨在帮助用户理解和使用TCP/IP协议栈的功能。这份文档适用于那些需要在EC200T模块上实现网络连接和数据传输的开发者...

    一种基于无线TCP时延的互联网业务问题定界和优化方法.pdf

    为提升用户互联网业务感知,本文提出了基于TCP(传输控制协议)建立时延的跨层优化方法。该方法将TCP建立时延拆解为无线TCP时延与核心TCP时延两个独立的过程。通过对某省的TCP业务样本进行分析,并采用多项式回归...

    KQI指标优化指导书.docx

    "KQI 指标优化指导书" KQI 指标优化指导书旨在帮助网络运营商和服务提供商更好地理解和优化网络质量,从而提高用户的使用体验。本指南书将从 TCP 指标优化的角度出发,讨论如何通过 TCP 指标来衡量网络对数据传输...

    优化Linux的TCP_IP协议栈性能.pdf

    优化 Linux 的 TCP/IP 协议栈性能 Linux 操作系统作为开源的操作系统,广泛应用于各种领域,包括服务器、嵌入式系统、移动设备等。TCP/IP 协议栈是 Linux 操作系统中最重要的网络协议栈,负责管理网络通信。为了...

    tcp/ip协议之 Nagle算法 TCP_NODELAY和TCP_CORK.zip

    理解这些TCP传输优化策略的工作原理和适用场景,对于提高网络通信质量、优化网络应用性能具有重要的指导意义。在进行网络编程或网络配置时,根据应用场景的具体需求,合理配置TCP_NODELAY和TCP_CORK选项,可以有效...

    NS2-TCP.rar_TCP NS2_ns tcp_ns-2 tcp_ns2 tcp

    4. **TCP模拟案例**:提供实际的模拟场景,比如不同网络条件下的TCP性能比较,或者特定网络环境下的TCP优化策略。 5. **分析工具和技巧**:介绍如何利用NS-2的内置工具或外部工具(如Tcpdump、Wireshark等)分析...

    TCP长短连接简单Demo

    在实际应用中,开发者需要根据业务需求来选择使用长连接还是短连接,并且需要考虑连接管理、错误处理、性能优化等方面的问题。例如,长连接可能会遇到连接超时、半开连接等问题,需要设置合理的超时机制和重连策略。...

    RedHat 5.5优化指导.doc

    在Red Hat Enterprise Linux AS 5.5环境下,为了提升系统的性能和效率,我们可以采用一系列的优化策略。这些策略主要集中在关闭不必要的服务、精简用户界面、调整内核参数、优化处理器和内存使用、改善文件系统性能...

    Quectel_BC260Y-CN_TCP(IP)_应用指导_V1.11

    这份文档涵盖了AT命令的使用、TCP/IP协议栈的应用以及相关的操作示例,帮助用户在产品设计中集成和优化通信功能。 ### AT命令语句 **定义**: AT命令是通用的串行通信指令,用于控制和配置各种通信设备,包括...

    tcp-ip三卷合集

    整体而言,《TCP/IP 三卷合集》不仅仅是学术上的探讨,它更为实践提供了指导。对于网络工程师、系统管理员以及那些对网络技术有深入研究需求的人来说,这套合集是不可或缺的参考资料。同时,这些内容对于理解互联网...

    USR-TCP232-Test 串口转网络调试工具

    USR-TCP232-Test 提供了一些优化策略,例如重传机制、心跳包机制,以确保在网络不稳定时仍能保持可靠的数据传输。 在提供的压缩包文件“usr-tcp232-test-v1.3.exe”中,包含的是USR-TCP232-Test 的版本1.3的可执行...

    纯Java版本的TCP Trace

    而用户手册则会指导用户如何配置和使用TCP Trace,解决具体的问题。 总之,TCP Trace是一款强大的网络诊断工具,尤其对于Java开发者和网络管理员来说,它是理解和优化网络应用不可或缺的辅助手段。通过深入学习和...

    TCP的那些事

    总之,"TCP的那些事"涵盖了TCP的基本原理和实际应用,对于学习和理解网络通信有着重要的指导意义。通过深入研究TCP,我们可以更好地理解互联网是如何工作的,以及如何优化网络性能,解决网络问题。

    嵌入式Linux 3G无线路由器TCP_IP性能优化.pdf

    该文深入探讨了在嵌入式Linux环境下,针对3G无线路由器的TCP/IP协议性能优化策略,通过对比不同拥塞控制算法并调整TCP参数,实现了数据传输性能的显著提升,对于嵌入式设备的网络优化具有重要的实践指导意义。

    tcp源码分析.pdf

    在TCP协议的发展过程中,RFC(Request For Comments)文档起到了规范和指导作用。其中: 1. RFC793定义了TCP的基本原理和工作流程,包括三次握手、滑动窗口、重传机制等。 2. RFC1323引入了TCP性能增强扩展,如TCP...

    C#使用TCPIP与ModBus进行通讯,c语言实现tcp通信,C#

    在IT行业中,网络通信是软件开发的一个重要领域,特别是在工业自动化和远程监控系统中,ModBus协议被广泛应用。本文将详细讲解如何使用C#通过...在实际应用中,你还需要考虑错误处理、性能优化和安全性等方面的问题。

    tcp/ip详解第三卷

    同时,书中还会涉及网络安全问题,如加密和认证机制,对于网络安全的理解和实践具有指导意义。 在实际应用中,读者将学习到如何使用各种网络工具进行网络诊断,如ping、traceroute、telnet等,以及如何使用TCPdump...

Global site tag (gtag.js) - Google Analytics