草稿 - 网络拖垮应用
我们看到有台服务器不在响应任何请求, 看到该服务器还是正常的报送自身的监控数据. 查看该 Java 应用配置的 Tomcat 服务线程已经用光了, 做 thread dump, 看到有39个线程都在等待同一个锁, 而拥有这个锁的进程停在一个 Socket 读上面. 2分钟内做了5个 thread dump, 都是卡在同一个线程的 Socket read 上面. 同一应用的其它服务器的 Tomcat 服务器线程基本使用都是在5以内, 从这个服务器开始到达40个开始, 已经有半个多少小时. 是什么原因导致这个 Socket 一直 read 在这个上面呢? 它使用的是 Blocking IO. 所以它 block 在这里.
下一步, 我们想知道它是连接的什么外部服务, 找出它连接的 URL -> Thread dump 里通过线程栈, 没有找出类似的配置. 做一个 heap dump, 通过查看 SocksSocketImpl 找到对应的 URL.
通过 host 找到远端 IP, 通过 ss 命令找到这个连接, 看到好久未发送, 最近有接收.
做 tcp dump, 看到不断的远程送过来数据, 有趣的是大概每隔15s 送一个1460字节过来. 为什么这么慢? 中间网络设备?
server 端?
如何找到 server? 从客户端看到的是 LB VIP 的IP, LB hold 2端连接, 要通过 LB 的命令或者 tcp dump 才能找出 server 端 IP. 难.
一般在返回的 Http response 的 header 里面会有真正的服务器 IP或主机名, 在 heap dump 里面找到这个 response 的 header, 找到 server 的 IP.
找到 server, 通过 ss 命令, 看到 server 端的 rtt 非常长, 发送的速率只有 bps
server 端 tcp
- 管理端口
- 如何产生 thread dump,
- 如何捕获 heap dump;
- 如何通过 Linux 网络命令查看网络连接情况;
- 如何判断线程死锁;