'Yar_Client_Transport_Exception' with message 'curl exec failed 'Timeout was reached' 超时问题

3 篇文章 0 订阅

介绍一下背景,当我遇到这个问题的时候已经参考过

https://github.com/laruence/yar/issues/15

https://blog.csdn.net/diandianxiyu_geek/article/details/53038407

https://www.cnblogs.com/MYSQLZOUQI/articles/5020676.html

但都没能解决,当然我的意思不是说这些是错的,而是遇到问题辨证论治,灵活解决

首先我这样的yar curl 超时是偶尔性的,那么这个问题只能从curl的实现上找解决方案

系统背景 centos7.4 + 宝塔面板( 很反感这种白痴的lnmp集成环境)

先解释一下什么是curl:

curl是一个库,能让你通过URL和许多不同种的服务器进行勾搭、搭讪和深入交流,并且还支持许多协议。并且人家还说了curl可以支持https认证、http post、ftp上传、代理、cookies、简单口令认证等等功能

那么yar 是什么, 它是一个擅长于做远程调用的拓展,基于curl

那么yar curl 超时无外乎几个原因,libcurl 拓展实现的问题,首先我这个不是os系统排除,curl 超时时间设置的问题,一般也只能是这个问题,解决: yar.timeout = 6000   或者 SetOpt(YAR_OPT_TIMEOUT, 0) 例如:我封装的yar client

function enhanceYar(string $actionName,$entranceParam)
{
        return (new \Yar_Client($this->serverUrl))->SetOpt(YAR_OPT_TIMEOUT, 0)->{$actionName}(...$entranceParam);
 } 如果到这里问题解决了,就不必往下看了

但是我的问题其实并不是这个问题:

我遇到的是curl 偶尔超时,而且测试的越多,超时的越少,是不是很诡异

上面介绍过什么是curl了,yar是基于curl的发起一个http请求的,我们都知道http 是基于tcp的传输协议,现在介绍一下tcp 的工作流:

tcp connect 的流程是这样的:
1、tcp发出SYN建链报文后,报文到ip层需要进行路由查询
2、路由查询完成后,报文到arp层查询下一跳mac地址
3、如果本地没有对应网关的arp缓存,就需要缓存住这个报文,发起arp请求
4、arp层收到arp回应报文之后,从缓存中取出SYN报文,完成mac头填写并发送给驱动。

那么问题的原因就是,arp层缓存队列长度默认为3。如果你运气不好,刚好赶上缓存已满,这个报文就会被丢弃。

TCP层发现SYN报文发出去3s(默认值)还没有回应,就会重发一个SYN。这就是为什么少数连接会3s后才能建链。

 解决办法: 

  增大arp pending queue len :  echo 32  > /proc/sys/net/ipv4/neigh/eth0/unres_qlen;(原来的值是31,根据实际情况调整)

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值