一、背景
做过一些老的项目,基于c++和libevent。过程中遇到一些问题,这里记录下问题和与原理分析。后续再整理下libevent的和rcp相关的技术点。
二、问题整理
1、IO同步阻塞问题
问题现象:日志显示发给A服务的请求时间,抓包看有n秒的延迟才实际发包,回包现象相同。
排查:
(1)排除VM和宿主机负载。
(2)代码打印对应接口日志,发现框架提供的函数执行发送无延迟,排除框架进程执行发送异常。
(3)进一步复现并strace打印系统调用。发现延迟请求之间有大量的SIGALRM信号注册,一个信号周期阻塞1s,框架是单进程模型,代码里面单独做了connect的系统调用,现象就是并发串行调用导致阻塞n秒不等。
strace -ttp PID
分析:查看源代码有SIGALRM注册,并设置1s,这是一个阻塞socket,1s内连不上对方被SIGALRM打断。每个connect有1s的阻塞,并发多台同时状态机超时之后的循环调用导致其他进程任务阻塞不定的n秒,strace日志表现就是其他进程任务发送给A服务请求同时,正常请求的系统调用阻塞n秒(日志表现延迟n秒)。