随着携程的应用大规模在生产上用容器部署,各种上规模的问题都慢慢浮现,其中比较难定位和解决的就是偶发性超时问题,下面将分析目前为止我们遇到的几种偶发性超时问题以及排查定位过程和解决方法,希望能给遇到同样问题的小伙伴们以启发。问题描述
某一天接到用户报障说,Redis集群有超时现象发生,比较频繁,而访问的QPS也比较低。紧接着,陆续有其他用户也报障Redis访问超时。在这些报障容器所在的宿主机里面,我们猛然发现有之前因为时钟漂移问题升级过内核到4.14.26的宿主机ServerA,心里突然有一丝不详的预感。初步分析
因为现代软件部署结构的复杂性以及网络的不可靠性,我们很难快速定位“connect timout”或“connectreset by peer”之类问题的根因。历史经验告诉我们,一般比较大范围的超时问题要么和交换机路由器之类的网络设备有关,要么就是底层系统不稳定导致的故障。从报障的情况来看,4.10和4.14的内核都有,而宿主机的机型也涉及到多个批次不同厂家,看上去没头绪,既然没什么好办法,那就抓个包看看吧。
图1
图2图1是App端容器和宿主机的抓包,图2是Redis端容器和宿主机的抓包。因为APP和Redis都部署在容器里面(图3),所以一个完整请求的包是B->A->C->D,而Redis的回包是D->C->A->B。
图3上面抓包的某一条请求如下:
B(图1第二个)的请求时间是21:25:04.846750 #99
到达A(图1第一个)的时间是21:25:04.846764 #96
到达C(图2第一个)的时间是21:25:07.432436 #103
到达D(图2第二个)的时间是21:25:07.432446 #115
D的回复时间是21:25:07.433248 #116
到达C的时间是21:25:07.433257 #104
到达A点时间是21:25:05:901108 #121
到达B的时间是21:25:05:901114 #124
延迟好像跟内核版本没有关系,3.