分类 Bugs 下的文章

记一次集群内无可用http服务问题排查

现象是这样的:每天到了某个时间点,就会出现服务不稳定的情况,偶发接口调不通。

线上业务使用了lvs-nginx-tomcat三层结构,首先查看tomcat监控,没有什么特别异常的情况,响应时间和错误码没发现有什么异常,CPU、IO等等指标也都正常。

再查看nginx上的监控,发现在某个时刻这个服务的5xx报错突增,大概7、8秒之后又恢复了。

继续在nginx服务器上找线索,发现Nginx在那个时间点会出现报错:

线上nginx会每秒探测后端所有服务器的某个uri,如果返回的http状态码是200则认为正常,连续3次探测失败则摘除探测失败的服务器,直到探测成功再恢复。

从日志中可以发现nginx在出问题的时间点对于后端所有tomcat的探测请求都出现了问题,导致摘除了所有后端服务器,在这段时间里请求会报502异常。… Read the rest

如何排查服务可用性问题

背景

首先是背景介绍,之前在qcon分享上提过,这里简单介绍一下。

  • 业务背景:微博主要面对的是大数据量、高负载的业务压力,并且会伴随着突发的请求峰值;
  • 技术背景:大规模的基于linux系统的集群;使用java作为主要语言;一些外部的框架比如tomcat、storm、hbase等;一些自研的系统比如rpc框架motan、服务发现config service等。不同企业和行业采用的方案可能有区别,但从问题排查这个角度来说都是类似的。

在这个背景之上,今天要讨论的是一些影响线上服务可用性的问题,关于如何排查,和如何改进系统的一些建议。

排查

问题排查相对于设计系统或者编码来说是一个反向推导的过程,这个过程往往比理解原因或者解决问题复杂。

举个生活中的例子,邻居家的小孩很调皮,有一天拿弹弓玩,把我家玻璃打破了,这是个正向的推导逻辑,很好理解;但是反过来,我到回家,看到玻璃破了,想知道原因,这个过程就要复杂的多。… Read the rest

tomcat7连接数异常导致超时问题的排查

现象和处理

  1. 某天某个跑在tomcat上的java服务的所有接口都突然开始出现偶发超时,响应时间从几十毫秒增长到几秒,甚至几十秒。
  2. 比较灵异的一个现象tomcat处理日志和业务日志中都没有发现超时,日志里打出来的请求的响应时间都在几十毫秒,并且对线程数的监控也没有发现波动。
  3. 怀疑是负载均衡的问题,查看nginx日志,发现nginx访问后端时有很多慢请求。
  4. 查看tomcat的gc情况,比较正常。
  5. 在tomcat本机调用接口,发现同样存在超时问题,排除nginx的嫌疑。
  6. 感觉问题基本出在tomcat上,决定先重启服务,果然重启后响应时间恢复。

原因排查

  1. 重启的时候从集群中摘除了一台节点保留现场,因为服务已经两周没有上过线,所以怀疑跟某种资源堆积有关。
  2. 尝试复现问题:

    1. 直接调用摘除的节点没有发现问题。
    2. 尝试使用ab压测,没有复现。
    3. 尝试使用tcpcopy引流,在引流单台5倍流量的情况下依然没有出现。
Read the rest

图解JDK7的Comparison method violates its general contract异常

背景

先说一下为什么要研究这个异常,前几天线上服务器发现日志里有偶发的异常:

出错部分的代码如下:… Read the rest

关于tomcat的日志框架

背景

  • 应用部署在tomcat中,使用log4j作为日志框架。
  • 监控工具使用javaagent的方式随tomcat启动,同样使用log4j作为日志框架。

现象

  • 在tomcat目录下放置log4j jar包和log4j.properties文件,启动服务后发现监控工具日志正常,原有应用的日志不见了。
  • 只放置jar包,保留应用中的log4j.properties,所有日志都没有了。
  • 只放jar包,agent启动时sleep100秒,两边日志都正常了。

原因

  1. javaagent的premain和java main在同一个jvm中执行,使用的是system classloader。
  2. system classloader的搜索路径是启动命令行里的classpath(-cp)。
  3. tomcat webapps下的应用是由WebappClassLoader加载的,搜索路径是WEB-INF/classes,WEB-INF/lib,找不到则调用父加载器,继承关系如下:

    默认情况下(直接类引用的方式),父加载器是感知不到子加载器的,或者说,java

Read the rest

关于hbase超时的参数设置

参数分析

  • socket建连时间

    默认值:

生效位置:

  • socket建连重试次数,对io错误和socket超时分别计算重试次数
Read the rest

记一次java native memory增长问题的排查

现象

线上机器部署了两个java实例,在运行几天后java开始吃swap空间,java实例的内存占用接近7G,程序响应很慢,重启后又恢复正常。线上配置的堆内存为3600M,栈大小为512k。

排查

首先怀疑是java heap的问题,查看heap占用内存,没有什么特殊。

$ jmap -heap pid

然后又怀疑是directbuffer的问题,jdk1.7之后对directbuffer监控的支持变得简单了一些,使用如下脚本:

java序列化与blockdata

现象

待序列化的对象实现了Externalizable接口:

分类目录