基于libevent的rpc框架的利弊

本文记录了使用C++和libevent库时遇到的IO同步阻塞问题。问题表现为请求发送延迟,经排查发现是由于SIGALRM信号注册导致的连接超时,进而引发并发调用的串行化。通过strace系统调用跟踪,确认了并发连接时的阻塞现象。分析源代码揭示了1s超时设置和阻塞socket的交互问题,影响了程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

       做过一些老的项目,基于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秒)。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值