1、Linux 内核参数修改,减少 TCP 连接中的 TIME-WAIT: Linux系统下, TCP/IP连接断开后,会以 TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的 TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源 (因为关闭后进程才会退出 )。这个时候可以考虑优化 TCP/IP 的内核参数,来及时将 TIME_WAIT状态的端口清理掉。 这里只对拥有大量 TIME_WAIT状态的连接导致系统资 源消耗有效,不是这个原因的情况下,效果可能不明显。 使用 netstat命令 查TIME_WAIT状态的连接。 输入一
2、个复核命令,去查看当前 TCP/IP连接的状态和对应的个数: # netstat -an | awk /tcp/ +s$NF END for(a in s) print a, sa 这个命令会显示出类似下面的结果: TIME_WAIT 63648 FIN_WAIT1 3 FIN_WAIT2 4 ESTABLISHED 184 LISTEN 17 TIME_WAIT 的个数,在这里可以看到,有 6w多个 TIME_WAIT,这样就占用了 6w多个端口。要知道端口的数量只有 65535个,占 用一个少一个,会严重的影响到后继的新连接。这种情况下 要调整下 Linux的 TCP/IP内核参数,让系统
3、更快的释放 TIME_WAIT连接。 用 vim打开配置文件: # vim /etc/sysctl.conf 然后,在这个文件中,加入下面的几行内容: net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 5 最后输入下面的命令,让内核参数生效: # /sbin/sysctl -p 简单的说明下,上面的参数的含义: net.ipv4.tcp_syncookies = 1 表示开启 SYN Cookies。当出现 SYN等待队列溢出时
4、,启用 cookies来处理,可防范少量 SYN攻击,默认为 0,表示关闭; net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP连接,默认为 0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启 TCP连接中 TIME-WAIT sockets 的快速回收,默认为 0,表示关闭; net.ipv4.tcp_fin_timeout 修改系统默认的 TIMEOUT 时间。 在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御一定程度的 DDoS、 CC和 SYN攻击,是个一
5、举两得的做法。 此外,如 果连接数本身就很多, 可以再优化一下 TCP/IP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置: net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 10000 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000 这几个参数,建议只在流量非常大的服务器上开启 ,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。这几个参数的含义如下
6、: net.ipv4.tcp_keepalive_time = 1200 表示当 keepalive 起用的时候, TCP发送 keepalive消息的频度。缺省是 2 小时,改为 20分钟。 net.ipv4.ip_local_port_range = 10000 65000 表示用于向外连接的端口范围。缺省情况下很小: 32768到 61000,改为 10000到 65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口! ) net.ipv4.tcp_max_syn_backlog = 8192 表示 SYN队列的长度,默认为 1024,加大队列长度为 8192,可以容纳
7、更多等待连接的网络连接数。 net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持 TIME_WAIT的最大数量,如果超过这个数字, TIME_WAIT将立刻被清除并打印警告信息。 默认为 180000,改为 5000。上几行的参数可以很好地减少 TIME_WAIT 套接字数量,此项参数可以控制 TIME_WAIT 的最大数量,服务器被大量的 TIME_WAIT拖死。 经过这样的配置之后 服务器的 TCP/IP并发能力又会上一个新台阶。在存在大量短连接的情况下, Linux的 TCP栈一般都会生成大量的 TIME_WAIT 状态的 socket。 # netst
8、at -ant|grep -i time_wait |wc -l 可能会超过三四万。这个时候 需要修改 linux kernel 的 tcp time wait的时间,有个 sysctl 参数貌似可以使用,它是 /proc/sys/net/ipv4/tcp_fin_timeout,缺省值是 60,也就是 60秒,很多网上的资料都说将这个数值设置低一些就可以减少 netstat 里面的 TIME_WAIT 状态,但是这个说法不是很准确的。而内核中真正管用的是一个宏定义,在 内核目录下 /include/net/tcp.h 里面,有下面的行: #define TCP_TIMEWAIT_LEN (6
9、0*HZ) 而这个宏是真正控制 TCP TIME_WAIT 状态的超时时间的。如果减少 TIME_WAIT 状态的数目 (从而节省一点点内核操作时间 ),那么可以把这个数值设置低一些, 可以 设置为 5-10 秒或者根据自己的需求来设置 ,也就是把上面的修改为: #define TCP_TIMEWAIT_LEN (5*HZ) 然后重新编译内核,重启系统即可发现短连接造成的 TIME_WAIT状态 减少: netstat -ant | grep -i time_wait |wc l 内核编辑 和升级 : 1:内核下载地址,这里内核编辑采用的 linux-2.6.39内核 wget https:/
10、www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.xz yum groupinstall “Development Tools“ # 安装编译时所需的一切工具 yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel ncurses-devel gcc gcc-c+ #创建 CentOS-6 内核时需要 2:解压 linux-2.6.39内核到 /usr/src/目录下 tar linux-2.6.39.tar.xz -C /usr/src/ 3:查看现有系
11、统的内核版本 rootbogon # uname -r 2.6.32-358.el6.x86_64 4 开始内核编辑 mrproper #清除环境变量,即清除配置文件 make menuconfig #在菜单模式下选择需要编译的内核模块 General setup -features - 选项 * Enable loadable module support -选项 -*- Enable the block layer -选项 IO Schedulers -选项 Processor type and features -选项 Processor family (Generic-x86-64)
12、-选项 Power management and ACPI options -选项 * ACPI (Advanced Configuration and Power Interface) Support -选项 CPU Frequency scaling -选项 Bus options (PCI etc.) -选项 Executable file formats / Emulations -选项 -*- Networking support -选项 Networking options -m support -选项配置如下: Data Center Bridging support 把这项取消,其他选项保留 Device Drivers -这个选项暂时可以默认,如果有需可以根据需要编辑 后面的选项选择默认即可 或者根据自己需求编辑更改 ,最后保存 make clean #确保所有东西均保持最新状态 make bzImage #生成内核文件 make modules #编译模块 make modules_install #安装模块 make install #安装 修改内核启动项 vim /etc/grub.conf default=1 修改 default=0 重启游戏服 reboot