linux tcp connection timeout,linux上TCP connection timeout的原因查找

linux上TCP connection timeout的原因查找

好久没有写文章了, 今天解决了一个网络连接超时的问题, 记录以备查看。

最近在线上nginx经常出现输出connection timeout的日志,如下格式:

2016/03/17 15:33:01 [error] 32356#0: *102974264722 no live upstreams while connecting to upstream, client: 123.151.42.*, server: localhost, request: "POST /* HTTP/1.1", upstream: "http://geo_for_gdtbid/gdtbid", host: "*.istreamsche.com"

很明显就是nginx在连接服务器时,出现了超时。一般连接超时是三次握手没有, 也就是nginx发送syn包, 服务器因为一些原因没有回复ack, 导致nginx连接超时输出日志。

server为什么没有响应ack呢, 我们知道整个链接过程不需要应用程序的参与, 应用程序只需要在连接建立后,accept请求就ok。  那么可以猜测可能是网络或系统的部分参数导致。

第一个原因,查看系统的最大打开文件数目, 此限制可能导致分配socket失败, 查看系统的允许最大文件数目, 远大于系统目前在用的socket数目。 继续网络的配置。

首先查看系统的backlog, backlog为系统的listen队列最大长度 = 接受syn队列长度 + 连接成功没有accept队列长度。

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

输出8192,  服务器每秒并发最大在12000左右,每个链接的生命周期平均在100ms以内, 线上不可能backlog queue不足。

继续查看: 使用命令直接查看服务器端口的队列。

ss -lt

看到Send-Q在服务端口是20 ,原来在服务器端启动listen 的时候设置了20的backlog;

修改listen的参数为2048, 在次查看

ss -lt

看到Send-Q在服务端口是128, 并不是2048, 其实修改为128的队列长度,此时nginx已经没有在出现connect timeout的错误。

通过详细分析查找, 发现原来内核参数也受somaxconn控制

查看

cat /proc/sys/net/core/somaxconn

发现值是128, OK 原因貌似找到了,赶快修改/etc/sysctl.conf 添加:

net.core.somaxconn = 8192

sysctl -f /etc/sysctl.conf 重新加载一下。

再次查看:

ss -lt

send-q 变为2048, 修改成功。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LinuxTCP connect失败时出现connection timeout和no route to host的错误时,通常是由于以下原因导致的: 1. Connection Timeout(连接超时):当客户端尝试建立一个TCP连接时,如果在预设的时间内没有收到服务端的响应,就会出现connection timeout错误。这可能是因为网络延迟过高,网络拥堵,或者服务端没有正确地响应连接请求。 2. No Route to Host(无法路由到主机):当客户端无法找到到达特定主机的路由时,就会出现no route to host错误。这可能是因为主机的IP地址不正确,网络设置不正确,或者网络连接中断导致客户端无法找到到达目标主机的路径。 解决这些问题的方法如下: 1. Connection Timeout: - 检查网络连接是否正常,包括网络带宽和延迟等情况。 - 确保服务端程序正常运行,并能够接受客户端的连接请求。 - 调整客户端和服务端的超时时间,可以尝试增大连接建立的超时时间。 2. No Route to Host: - 检查目标主机的IP地址是否正确,在客户端中进行确认。 - 确保网络设置正确,包括网关等相关配置。 - 检查客户端与目标主机之间的网络连接是否正常,比如通过ping命令测试网络连通性。 - 如果网络连接中断,尝试重新连接网络,或与网络管理员联系。 总而言之,connection timeout和no route to host错误提示都是无法成功建立TCP连接的指示,通常与网络连接的问题有关。通过识别和解决网络连接的问题,可以解决这些错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值