本博文为老男孩linu培训机构早期的培训教案,特分享以供大家学习参考。
全部系列分为五篇文章,本博文为第五篇:
5.1高并发linux生产服务器内核参数优化案例
高并发linux生产服务器内核参数优化案例
说明:本优化适合apache,nginx,squid多种等web应用,特殊的业务也可能需要略作调整。
所谓内核优化,主要是在Linux系统中针对业务服务应用而进行的系统内核参数优化,优化并无特殊的标准,下面以常见生产环境linux的内核优化为例讲解,仅供大家参考:
cat <<EOF>>/etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 400065000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
EOF
#以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max=25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
将上面的内核参数值加入/etc/sysctl.conf文件中,然后执行如下命令使之生效:sysctl -p
参数解释找谷歌吧,大把大把。呵呵。
六、TCP 连接状态
6.1三次握手建立连接
TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。
1.连接的建立
在建立连接的时候,客户端首先向服务器申请打开某一个端口(用SYN段等于1的TCP报文),然后服务器端发回一个ACK报文通知客户端请求报文收到,客户端收到确认报文以后再次发出确认报文确认刚才服务器端发出的确认报文(绕口么),至此,连接的建立完成。这就叫做三次握手。如果打算让双方都做好准备的话,一定要发送三次报文,而且只需要三次报文就可以了。如果再加上TCP的超时重传机制,那么TCP就完全可以保证一个数据包被送到目的地。
1)客户端发送 SYN 消息,其中包含服务器的端口和客户端的初始序列号(ISN)到服务器(活动打开)。
2)服务器会发送回SYN和ACK(其中包括的客户端的 ISN + 1)。
3)客户端发送一个 ACK,(其中包括的服务器的 ISN + 1)。
6.2四次挥手关闭连接
结束连接
TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN为1的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。
1)客户端发送一个FIN(活动收盘)。这是一个现在半关闭连接。客户端不能再将数据发送,但仍然能够从服务器接收数据。收到此 FIN 服务器进入被动关闭状态。
2)服务器发送一个ACK(这时客户端 FIN 序列 + 1)
3)服务器发送其自身FIN。
4)客户端发送一个ACK(这是服务器的 FIN 序列 + 1)。收到此 ACK 服务器关闭连接。
6.3 win32 Netstat 输出说明
状态说明,Netstat 中所示:
状态说明
------------ --------------------------------------------------------
SYN_SEND 指示活动打开。
SYN_RECEIVED 服务器只接收来自客户端的 SYN。
建立的客户端接收到服务器的 SYN 和建立会话。
侦听服务器已准备好接受连接。
注: 请参阅文档 listen() 套接字调用。TCP 套接字侦听状态中的不会显示-这是 NETSTAT 的限制。有关其他信息,请参阅 Microsoft 知识库中相应的文章:
134404NETSTAT。EXE 不显示 TCP 侦听套接字
FIN_WAIT_1 指示活动结束标记。
TIMED_WAIT 客户端活动关闭后将进入此状态。
CLOSE_WAIT 指示被动关闭。服务器只是从客户端接收到第一个 FIN。
FIN_WAIT_2 客户端只是从服务器接收其第一个 FIN 的确认。
当它发送自己 FIN LAST_ACK 服务器处于此状态。
已关闭的服务器从客户端收到 ACK 并关闭连接。
例如,请考虑以下情形:
套接字应用程序已终止,但 Netstat 报告套接字处于 CLOSE_WAIT 状态。这可能表明客户端正确关闭 (已发送 FIN) 的连接,但服务器仍有打开的套接字。这可能是一个实例(在所有线程或进程) 未关闭套接字的结果。
注: 很正常很长的一段时间内处于 TIME_WAIT 状态有一个套接字。指定的时间是在 RFC793 中作为两次最大段生存期 (MSL)。MSL 被指定为 2 分钟。因此,套接字可能处于 TIME_WAIT 状态长 4 分钟。某些系统为 MSL 实施不同的值 (不超过 2 分钟)。
来自http://support.microsoft.com/kb/137984/zh-cn