Full GC 的时间和次数是管理java的应用服务不得不考虑的问题,高吞吐量和低停顿是追求高质量服务重要目标,从而会有根据业务的特点衍生出各种垃圾回收器。在实战中如何根据如何使用ParNew ,CMS等回收器和配置各种参数,要在理论结合实践中不断优化。
一、问题的发现
看到线上的服务机器一些节点时不时地有TCP报警 ,所以我们断定是TCP的连接出现了问题。
让我们来回顾一下TCP的三次握手和四次挥手,借网上的一个图:
当第一次握手,建立半连接状态:
client 通过 connect 向 server 发出 SYN 包时,client 会维护一个 socket 队列,如果 socket 等待队列满了,而 client 也会由此返回 connection time out,只要是 client 没有收到 第二次握手SYN+ACK,3s 之后,client 会再次发送,如果依然没有收到,9s 之后会继续发送。
此时server 会维护一个 SYN 队列,半连接 syn 队列的长度为 max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog) ,在机器的tcp_max_syn_backlog值在/proc/sys/net/ipv4/tcp_max_syn_backlog下配置,当 server 收到 client 的 SYN 包后,会进行第二次握手发送SYN+ACK 的包加以确认,client 的 TCP 协议栈会唤醒 socket 等待队列,发出 connect 调用。