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, 修改成功。
linux上TCP connection timeout的原因查找的更多相关文章
- Linux上TCP的几个内核参数调优
Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优.光TCP的调优参数就有50多个.在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数.在此分享出来,希望对大家 ...
- 从linux源码看socket(tcp)的timeout
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌.在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp ...
- [转] TCP/IP原理、基础以及在Linux上的实现
导言:本篇作为理论基础,将向我们讲述TCP/IP的基本原理以及重要的协议细节,并在此基础上介绍了TCP/IP在LINUX上的实现. OSI参考模型及TCP/IP参考模型 OSI模型(open syst ...
- .net core linux环境下 System.Data.SqlClient.SqlException: Connection Timeout Expired.
最近遇到了一个很奇葩的问题,我编写了一个.net core程序读取多个数据库数据源,进行数据同步处理.该程序在windows环境下运行完全正常,但在linux环境下运行报异常,提示 System.Da ...
- Linux上的文件查找工具之locate与find
前言 Linux上提供了两款工具用于查找文件,一款是locate,另一款是find. locate的特点是根据已生成的数据库查找,速度较快,但是查找的是快照数据,不准确. 因此在日常使用中,为了准确性 ...
- 使用.NetCore在Linux上写TCP listen 重启后无法绑定地址
拥抱.net core的过程中, 将公司的一套java项目改成了.net core 2.0版的. 里面的tcp服务被我用msdn的SocketAsyncEventArgs方式重写了, 然而在测试的过程 ...
- C++的标准库函数默认都是操作字节,而不是字符,非常痛苦,所以引入了u16string和u32string(Linux上的wchar_t是32位的原因,utf16对unicode的支持是有缺陷的)good
时至今日,字符串使用unicode已经是不需要理由的常识,但对一些有着悠久历史的编程语言来说,这仍然是个头痛的问题.如果抛开第三方库的支持,C++其实并不能实际有效地支持unicode,即使是utf8 ...
- 使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序
本文于2019年04月10日将标题「CentOS7 部署 ASP.NET Core应用程序」修改为「使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序」. 环境准备 VMwa ...
- 不要在linux上启用net.ipv4.tcp_tw_recycle参数
不要在linux上启用net.ipv4.tcp_tw_recycle参数 发布于 2015/07/27 莿鸟栖草堂 本文为翻译英文BLOG<Coping with the TCP TIME-WA ...
随机推荐
- java反射技术
Class c2 = Class.forName("com.reflection.Test"); // 对类的寻找,找到一个类,注意不是对象 WifiManager mWifiMa ...
- C# 类是怎么执行的?
C# 类是怎么执行的? public class Person{ static person(){} //不写,默认也有个空的 public person(){}//不写,默认也有个空的 public ...
- swift-03-数据类型转换
// main.swift // 05-数据类型的转换 // // Created by wanghy on 15/8/9. // Copyright (c) 2015年 wanghy. Al ...
- JVM - 内存溢出问题排查相关命令jcmd jmap
jcmd http://docs.oracle.com/javase/8/docs/technotes/tools/windows/jcmd.html jcmd-l 列出正在执行的JAVA进程ID ...
- 深入理解Python中的生成器
生成器(generator)概念 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束. 生成器语法 生成器表达式: 通列表解 ...
- 【实习记】2014-09-24万事达卡bin查询项目总结
8月28号,接到这个问题:现有前缀查询速度较慢,改进此知值求区间问题. 一开始没想到用二分法,更没有想到这个项目用了一个月,这一个月里,我学习并使用了middle框架写出了server ...
- 网站开发常用jQuery插件总结(六)关键词说明插件cluetip
我们开发的网站,总有它一定的用途.如企业站用来宣传企业或展示产品,技术站用来分享自己的思路和经验.既然网站有了它的用途,那么就拥有了它本身的关键词(关键词说明网站的主要内容).例如企业站的关键词大部分 ...
- 苹果ios、ipad加密视频播放器使用教程
操作流程 温馨提示 播放时,请务必保证播放设备联网(原因:用户名权限验证需要网络,播放后10秒即可关闭网络) a) 请在苹果商店下载并安装app播放器:DrmPlayer b) 选择已 ...
- 尝试一下用MARKDOWN嵌入代码
public void test(){ // }
- Mysql 与 php动态网站开发 入门教程
这个系列的教程由表单开始写,因为表单可以把数据库和web 之间的交互表现得很明显.提交表单 ,数据库记录注册信息. 本教程属于基础教程.大神请略过. 对于php和mysql之间的稳固性很 ...