导读

『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测、故障演练、JVM、应用容器、服务框架、流量调度、监控、诊断等多个技术领域,以更结构化的方式来打造稳定性领域的知识库,欢迎您的加入。

@GitHub :https://github.com/StabilityMan/StabilityGuide

问题描述

最近偶尔有用户反馈某些 HTTP 接口出现超时问题,而 web 服务端的 Trace 监控没有出现 http 返回值为 503 等异常情况。出现这种情况一般是web容器出现问题,客户端连接不上来。本文将主要介绍如何去监控这类问题。

我们是用典型的 Web 服务架构,应用通过域名访问到我们的 LVS(Linux Virtual Server)机器,LVS 后面对应了多台 Web 服务器。

考虑到无法对 LVS 进行跟踪,而 Web 服务器(Tomcat 上出现堆积,无法评估影响范围)。考虑再三后,我们准备在Tomcat 和 LVS 上加一个 Nginx,用于追踪用户访问的真实情况。Nginx 是一款自由、开源的高性能 HTTP 服务器。通过 Nginx 代码,我们可以掌握第一手的用户访问的真实情况,本来是打算通过 Nginx 的 Access 日志来做统计, 后来参考 阿里云链路追踪的文档,用链路追踪可以把 HTTP 的埋点和 Tomcat 连起来看,可以更详情地发现问题。

环境准备和问题复现
编译安装 Nginx 和 Jaeger Agent,具体的安装过程可以参考 阿里云链路追踪文档。
测试环境:需要重现超时问题,写了一个小程序,开启 200 个线程,每个线程连续向服务发送 500 个请求。总共提交 100000 个请求。

排查过程

排查的主题思路, 对比 Web 服务端数据和 Nginx 服务端的链路统计数据,如果两种的请求数不一致,那可以确定有请求丢失。再根据链路上的详情数据来确定丢失请求的原因。

1、Web 服务端数据统计

发送请求后,发现 web 服务端一共处理 98717 个请求,比客户端少了 1283 个请求。

2、Nginx 服务端统计

查看 Nginx 的请求,一共有 100000 个请求,说明 Nginx 收到了全部请求,但是进入到 Web 服务上处理的只有 98717 个请求(通过 javax.servlet.Filter 埋点来监控)。

3、问题分析

检查 Nginx 服务,发现 Nginx 的有些请求的 HTTP 的返回码 499。如下图所示:

对比正常的 HTTP 链路,发现 Nginx 的请求的 HTTP 的返回码 499,只有一个 Span 就返回了,而 HTTP 返回码为 200 的,可以看到完整的调用链路(链路上除了 Nginx 的 Span,还有 Web服务的 Span),如下图展示:

我们可以这样来解释这个问题,客户端流量进入 Web 服务器,如果 Web 服务器处理不过来(超出可承受的最大流量或者 Web 服务器本身可能出现 FullGC,OOM,死锁,线程池慢问题), 那客户端设置超时的请求将会出现 499,未进入 javax.servlet.Filter 处理,Web 服务端看不到任何访问记录。

那是不是可以认为出现 HTTP 返回值为 499 的请求都是服务端处理失败的请求?

4、进一步排查

我们捞取下 Nginx 上返回 499 的请求,总共 2719条,大于 Web 服务丢失的 1283 个请求。这个数据对不上,是什么原因呢?我们在仔细查看了下数据,有 Nginx 返回 499 的请求,但是 Web 服务返回了 200。这些请求进入 Web 服务处理程序,但是 Web 服务还没返回就超时了。如果没有 Tracing 把上下文链接起来,我们很难通过 Nginx 日志或者 Web 服务日志来解释这个问题(一个请求,Nginx 返回 499,而 Web 服务返回 200),如下图所示:

把 Nginx 和 Web 容器服务(Tomcat)的链路打通,我们可以查看 HTTP 请求每个环节的状态,很方便地定位问题。

总结

针对这种 Web 服务无响应的问题,可以通过加一层代理(Nginx代码),很好的排查问题。同时也很好统计 Web 服务器造成多少请求失败,影响多少用户。对故障定级,影响面可以进行准确的评估。

推荐产品 Tracing Analysis

  • 登录链路追踪控制台,在概览页面上打开 查看 Token 开关。
  • 单击需要使用的链路数据采集客户端(Jaeger 或 Zipkin)按钮。
  • 在下方表格中相应地域的 相关信息 Trace 列中,单击接入点信息末尾的复制按钮。

提示:如果应用部署于阿里云生产环境,则选择内网接入点,否则选择公网接入点。对于 Zipkin,一般情况下请使用 v2 版接入点,v1 版接入点仅限对 Zipkin 十分了解的高阶用户使用。

本文作者:徐建伟,花名竹影,阿里云技术专家,多年系统架构,性能调优经验, 目前主要从事链路跟踪,应用监控相关工作。

原文链接

本文为云栖社区原创内容,未经允许不得转载。

如何检测 Web 服务请求丢失问题的更多相关文章

  1. WCF 扩展一:格式化Web服务请求XML

    扩展原因 有一WebService,在工程中添加Web Service引用后调用不成功,但是用SoapUI测试正常 分析 用tctTrace跟踪报文后发现wcf生成的报文命名空间与SoapUI的不一样 ...

  2. Web服务器之Nginx详解(理论部分)

    大纲 一.前言 二.Web服务器提供服务的方式 三.多进程.多线程.异步模式的对比 四.Web 服务请求过程 五.Linux I/O 模型 六.Linux I/O 模型具体说明 七.Linux I/O ...

  3. 【转】Web服务器之Nginx详解(理论部分)

    大纲 一.前言 二.Web服务器提供服务的方式 三.多进程.多线程.异步模式的对比 四.Web 服务请求过程 五.Linux I/O 模型 六.Linux I/O 模型具体说明 七.Linux I/O ...

  4. 使用 ServiceStack 构建跨平台 Web 服务

    本文主要来自MSDN杂志<Building Cross-Platform Web Services with ServiceStack>,Windows Communication Fou ...

  5. windows环境下解决web服务假死的问题

    最近在windows系统在部署web服务器,发现很不稳定.web服务有容易假死,改过配置换过各种web软件,如apache.nginx都不管用. 所以干脆做个简易的定时检测Web服务状态的软件.一旦w ...

  6. Azure机器学习入门(四)模型发布为Web服务

    接Azure机器学习(三)创建Azure机器学习实验,下一步便是真正地将Azure机器学习的预测模型发布为Web服务.要启用Web服务发布任务,首先点击底端导航栏的运行即"Run" ...

  7. Linux中web服务运行情况的方法

    监控一般通过脚本实现,使用定时任务定期执行检测. 1.端口 本地:ss,netstat,lsof 远程:telnet,namp,nc 2.本地进程数 例如: lsof -i:80|wc -l ps - ...

  8. WEB服务重要基础

    1.1用户访问房展基本流程 我们每天都会使用Web客户端上网浏览网页.最常见Web客户端就是Web浏览器,如通过的微软InternetExplorer(IE)以及技术人员偏爱的火狐浏览器.谷歌浏览器等 ...

  9. 使用 ServiceStack 构建跨平台 Web 服务(转)

    出处:http://www.cnblogs.com/shanyou/p/3348347.html 本文主要来自MSDN杂志<Building Cross-Platform Web Service ...

随机推荐

  1. 2018-2-13-win10-uwp-让焦点在点击在页面空白处时回到textbox中

    title author date CreateTime categories win10 uwp 让焦点在点击在页面空白处时回到textbox中 lindexi 2018-2-13 17:23:3 ...

  2. Mongodb安装遇到的问题

    今天我第一次接触MongoDB,在安装过程中,因为对这个东西不了解,报错了我也不知道是哪里的错,还在网上查了半天资料,后来我懂了,感觉上午就是在浪费时间,是我没睡醒,没睡醒.. 在安装上MongoDB ...

  3. android是32-bit系统还是64-bit系统

    转自:http://www.cnblogs.com/pengwang/archive/2013/03/11/2954496.html 电脑CPU分32位和64位,这个我们都知道.用了这么长时间的and ...

  4. Eclipse导入Maven项目解决Build Path不能配置问题

    Eclipse Mars Release (4.5.0)导入Maven项目时,发现项目Build Path不能配置,如下图所示: 解决办法: 1修改Project Facets 项目右键---> ...

  5. 使用js 判断当前运行环境实在浏览器还是在手机

    转: 在跨平台,各种浏览器,移动设备兼容的时候,经常要根据设备.浏览器做特定调整,所以判断设备和浏览器的工作,经常会用到,这里做一下总结. 有关浏览器类型的信息都藏在USER-AGENT里面,首先读取 ...

  6. 自然数幂和&伯努利数(Bernoulli)

    二项式定理求自然数幂和 由二项式定理展开得 \[ (n+1)^{k+1}-n^{k+1}=\binom {k+1}1n^k+\binom {k+1}2n^{k-1}+\cdots+\binom {k+ ...

  7. Redis探索之路(二):Redis在linux下的安装

    目前最新稳定版本为:2.4.17.tar.gz .redis-2.6.10.tar.gz wget http://redis.googlecode.com/files/redis-2.4.17.tar ...

  8. 官网下载 Linux 上需要的 MySQL的步骤

    1.输入MySQL 官网地址  https://dev.mysql.com/  选择 download ->Community->MySQL Community Server 点击 MyS ...

  9. PDO基础

    //PDO:数据访问抽象层 $dsn = "mysql:dbname=mydb;host=localhost";//造PDO对象 $pdo = new PDO($dsn," ...

  10. C++ string的大小写转换【转载】

    转载自https://www.cnblogs.com/balingybj/p/4678850.html 将一个string转换成大写或者小写,是项目中经常需要做的事情,但string类里并 没有提供这 ...