交换机故障导致线程阻塞

文章目录

本来使用工具或者服务

  • Jconsole
  • Jstack
  • prometheus

架构图

architect

架构说明

  • This is an internal application (Not cloud) architect,we have big network traffic and lots of application ,we deploy in our own server

  • we have a RabbitMQ server (which our data provider will send HKEX data to this server)

  • we have an Application will consume the messages from MQ

  • Our application will process the data and sending to Kafka and Elastic search

  • Our Flink (Data process Framework) will process the data (Calculate) TO generate quantitative data to anthoer Kafka topic

  • We have a transaction appliction to consume the KAfka Topic data to trade equities or derivatives

Issue

  • 我们看到我们交易程序没有下任何单,我们认为我们程序出现了信号,但是交易程序并没有下单记录,也就是说信号没有出现,我们flink并没有计算出信号

Diagnose

  • 由于我已经在各个服务安装了nodeexporter,把数据集中发送到prometheus上,所以我们用prometheus来监控各个主机内存网络硬盘cpu等状态,没有发现任何问题

    Prometheus

  • rabbitmq每秒接受到45M的数据,经过计算后传输出去的数据大概是40M/s。

  • 我排查了数据供应商发送的rabbitmq的消息,新创建了一个测试queue,绑定了trade和quote的数据,检查timestamp发现并没有出现数据延迟

  • 排查我们的kafka的MQ,发现我们加工完数据后,生在kafka里面后延迟了几十秒,多的长达几十分钟!!!

  • 所以必须是我们 application处理数据的时候出了问题,检查app server ,系统负载,disc io ,内存,cpu,文件句柄数,都在正常范围内

  • 检查JVM,用jstack dump出堆栈数据,发现一堆线程处于waiting状态,32核cpu总体利用率很低,跟踪类,发现kafka很多org.springframework.kafka.kafkalistenerendpointcontainer blocked 这肯定写入kafka出现了问题,然后各种优化调试都不起作用!

  • 绝望的时候检查了网络,突然发现从application ping到kafka需要100ms!从其他服务器ping到application都需要100ms,也就是延迟由于网络的原因导致线程池暴涨!

  • 经过检查发现application这台服务器所在交换机出现了故障,换了交换机之后,一切恢复正常,单次kafka的发送1ms以下

Summary

  • 在应用中缺乏网络可靠性的检测工具
  • 如果不是使用云平台的话,很多硬件的监控完全需要团队自己搭建,这样的成本会提高很多,如果在云平台的话,他们的硬件的availability都是很高的,这样的问题不会发生