草稿 - 网络拖垮应用

我们看到有台服务器不在响应任何请求, 看到该服务器还是正常的报送自身的监控数据. 查看该 Java 应用配置的 Tomcat 服务线程已经用光了, 做 thread dump, 看到有39个线程都在等待同一个锁, 而拥有这个锁的进程停在一个 Socket 读上面. 2分钟内做了5个 thread dump, 都是卡在同一个线程的 Socket read 上面. 同一应用的其它服务器的 Tomcat 服务器线程基本使用都是在5以内, 从这个服务器开始到达40个开始, 已经有半个多少小时. 是什么原因导致这个 Socket 一直 read 在这个上面呢? 它使用的是 Blocking IO. 所以它 block 在这里.
thread_block.png
下一步, 我们想知道它是连接的什么外部服务, 找出它连接的 URL -> Thread dump 里通过线程栈, 没有找出类似的配置. 做一个 heap dump, 通过查看 SocksSocketImpl 找到对应的 URL.
response_in_Heap.png
通过 host 找到远端 IP, 通过 ss 命令找到这个连接, 看到好久未发送, 最近有接收.
client_ss.png
做 tcp dump, 看到不断的远程送过来数据, 有趣的是大概每隔15s 送一个1460字节过来. 为什么这么慢? 中间网络设备?
server 端?
client_tcp.png
如何找到 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_ss.png

server 端 tcp
server_tcp.png

  1. 管理端口
  2. 如何产生 thread dump,
  3. 如何捕获 heap dump;
  4. 如何通过 Linux 网络命令查看网络连接情况;
  5. 如何判断线程死锁;

标签: none

添加新评论