我有一个小型的 Web 服务器群(HP Proliant 和 IBM x,配有 Broadcom Corporation NetXtreme II BCM5 NIC),在 CentOS 6 上运行 Apache 2.2.15,位于 Cisco ACE 负载平衡器后面,为基于 PHP/JS 的 Web 门户提供服务。这个服务器群每天都会收到大量请求(它为整个小国提供服务),试图访问启动页面(从那里转到索引页)
我一直在努力解决以下问题:
我注意到,有时 Web 请求需要等待相当长一段时间才能得到答复(从客户端角度来看),有时甚至根本没有得到答复(Web 客户端超时)。在后一种情况下,我甚至在 Apache 日志中都看不到该请求。
我还注意到 netstat 报告发送的 TCP 重置数量不断增加(
netstat -st | grep 'resets sent'
)另外,
dropwatch -l kas
显示有很多数据包被丢弃:
初始化 kallsyms db dropwatch> start 启用监控... 内核监控已激活。按下 Ctrl-C 停止监控 tcp_v4_md5_hash_skb+248 (0xffffffff8149fa08) 处有 53 次丢弃 tcp_rcv_established+926 (0xffffffff814981b6) 处有 26 次丢弃 tcp_v4_reqsk_destructor+fa (0xffffffff814a104a) 处有 3 次丢弃 netlink_unicast+251 (0xffffffff81471b11) 处有 1 次丢弃 tcp_v4_md5_hash_skb+248 (0xffffffff8149fa08) 处有 56 次丢弃 tcp_rcv_established+926 (0xffffffff814981b6) 处有 29 次丢弃 tcp_v4_reqsk_destructor+fa 处有 4 次丢弃(0xffffffff814a104a) 在 tcp_v4_md5_hash_skb+248 处丢弃 51 次 (0xffffffff8149fa08) 在 tcp_rcv_established+926 处丢弃 32 次 (0xffffffff814981b6) 在 tcp_v4_reqsk_destructor+fa 处丢弃 2 次 (0xffffffff814a104a) 在 ip_rcv_finish+199 处丢弃 1 次 (0xffffffff8147ea49) 在 tcp_v4_destroy_sock+115 处丢弃 1 次 (0xffffffff814a0cf5) 在 tcp_v4_reqsk_destructor+fa 处丢弃 1 次 (0xffffffff814a104a) 在 tcp_rcv_established+926 处丢弃 22 次(0xffffffff814981b6) 在 tcp_v4_md5_hash_skb+248 处发生 36 次丢弃 (0xffffffff8149fa08) 在 tcp_v4_reqsk_destructor+fa 处发生 2 次丢弃 (0xffffffff814a104a) 在 tcp_v4_md5_hash_skb+248 处发生 49 次丢弃 (0xffffffff8149fa08) 在 tcp_rcv_established+926 处发生 29 次丢弃 (0xffffffff814981b6) 在 tcp_rcv_established+926 处发生 26 次丢弃 (0xffffffff814981b6)
我一直在遵循 RH 的建议(Red Hat Enterprise Linux 网络性能调整指南),尽管我在我的服务器中没有看到那里描述的某些症状。简而言之:
- 我已将 NIC 环形缓冲区增加到最大值。
- 我摆弄了(增加或更改)几个内核参数(tcp_syncookies、netdev_budget、tcp_timestamps、tcp_window_scaling、tcp_rmem、dev_weight、tcp_tw_reuse……)
- 我根据从网上摘录的几个“Apache 优化指南”修改了 Apache 配置(尽管 Apache 统计信息中过去和现在都有空闲工作者)
- 我已经停止/禁用了任何不需要的系统服务/守护进程(基本上剩下的只有 sshd、httpd 和 snmpd)
以上所有情况都没有成功。
所有 NIC 的工作速度为:1000Mb/s,CPU 和磁盘使用率较低,且未netstat
显示任何ethtool
错误。
还有什么想法可以做吗?
答案1
TCP 重置是指立即关闭 TCP 连接。这样可以释放分配给前一个连接的资源并将其提供给系统。
RST产生的原因
确认,重置
发送以响应 Syn。发送以响应 Syn 帧的 Ack Reset 是为了确认收到该帧,但随后让客户端知道服务器无法允许该端口上的连接。发送 Ack, Reset 的原因包括:
a. 所连接的节点没有监听客户端节点尝试连接的端口。
b. 由于某种原因,服务器节点无法完成该端口上的连接。例如,服务器资源不足,因此无法分配所需的资源来允许连接。
恢复时间
如果连接处于任何非同步状态(LISTEN、SYN-SENT、SYN-RECEIVED),并且传入段确认尚未发送的内容(该段携带不可接受的 ACK),则会发送重置。
下一个重置是 TCP 重置,当网络帧发送六次(即原始帧加上五次重发)而没有响应时发生。因此,发送节点会重置连接。
当你尝试使用各种内核调整参数时,尝试使用内核的 tcp cookies 选项
启用 TCP SYN cookie 保护
Edit the file /etc/sysctl.conf, run:
# vi /etc/sysctl.conf
Append the following entry:
net.ipv4.tcp_syncookies = 1
Save and close the file. To reload the change, type:
# sysctl -p
解决方案只能通过分析你的日志来给出,IPtables 也可以提供帮助