使用apache httpclient 默认连接池导致的系统瓶颈问题
现今的 Java 开发基本都会使用开源的开发框架, 它们都经过很多人的验证, 包含了很多成熟的最佳实践. 另外这些框架中经常包含一些可调的参数, 如果不读官方文档, 调节参数, 默认的参数可能由于不太适应真正的业务需求, 导致应用出现某些瓶颈问题.
症状
有告警显示某些 web 服务器的 Tomcat busy threads 横躺在了最大值上, 成了一条直线段. 如下图:
现今的 Java 开发基本都会使用开源的开发框架, 它们都经过很多人的验证, 包含了很多成熟的最佳实践. 另外这些框架中经常包含一些可调的参数, 如果不读官方文档, 调节参数, 默认的参数可能由于不太适应真正的业务需求, 导致应用出现某些瓶颈问题.
有告警显示某些 web 服务器的 Tomcat busy threads 横躺在了最大值上, 成了一条直线段. 如下图:
内部推荐 联系(base64 encoding): eGlhdGlhbkBlYmF5LmNvbQ==
以下是最新(2020/02/18)的职位列表: 具体 JD 见 https://www.ajinga.com/company-detail-new/5790/

我们经常用 wireshark 去分析 tcp dump, 有时候, 我们会看到有些不符合我们直觉的事情, 比如下面的截图中, 你看到这个 tcp 包竟然有 36200 字节. 
tcp 包的长度是由这个 tcp 连接在建立的时候, 2 端协商(通知更合适)而来的, 取其中小的值. 通常情况下我们接触到的都是以太网, 所以这个长度(MSS:maximum segment size)基本是 MTU(maximum transmission unit) 1500 - 20 -20 = 1460 字节. 如下图所示:
内部推荐 联系: eGlhdGlhbkBlYmF5LmNvbQ==
以下是最新(2019/11/18)的职位列表: 具体 JD 见 https://www.ajinga.com/company-detail-new/5790/

围绕这个图, 做几点解说(左边的虚线框表示 Tomcat):
SYN backlog 长度由 /proc/sys/net/ipv4/tcp_max_syn_backlog 设置, 还有文章说最终值有几个因素共同决定, 不过在 Linux Kernel 4.3 之后,这个 syn backlog 不在由 net.ipv4.tcp_max_syn_backlog 决定, 而是由 net.core.somaxconn 决定
eric@host:~$ sysctl net.core.somaxconn
net.core.somaxconn = 4096
eric@host:~$ sysctl net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 4096如何查看一个监听端口的 SYN backlog 当前的队列长度?
没有直接看当前长度的命令, 不过可以自己手工计算:
# 查看连到当前 host 8080 端口上并且处于 sync-recv 状态的连接
eric@host:~$ ss -n state syn-recv sport = :8080
参考: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/