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 ...
随机推荐
- android studio 导入的项目有乱码-笔记2
如果导入的项目原本就是UTF-8.且android studio编码设置为UTF-8就不会乱码.这种情况多是导入的原项目编码为GBK. 解决方法:在android studio 右下角,切换编码为GB ...
- Entity Framework 使用sql语句分页(查询视图)
1.查询视图 //3.查询视图 var sql = @" SELECT D.* FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY TestView.B_M ...
- js单击显示元素,点击元素本身以外隐藏元素
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- jQuery 源码分析3: jQuery.fn/ jQuery.prototype
// 建立方法实例,提高方法访问的速度(避免在原型链上搜索) var deletedIds = []; var slice = deletedIds.slice; var concat = delet ...
- Ubuntu系统的安装
在上一篇博客中,我们已经建立了一个“空白”的虚拟Ubuntu镜像,在这篇博客中,我们将介绍如何安装并进入完整的Ubuntu系统. 写在前面:不同版本的系统在安装过程中,有些操作可能会不同,但是其核心步 ...
- MySQL存储引擎,优化,事务
1唯一约束unique和主键key的区别? 1.什么是数据的存储引擎? 存储引擎就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数 ...
- leetcode problem (5) Longest Palindromic Substring
最长回文子串: 1. 暴力搜索 时间复杂度O(n^3) 2. 动态规划 dp[i][j] 表示子串s[i…j]是否是回文 初始化:dp[i][i] = true (0 <= i <= ...
- Cocos2d-x课程大纲/学习路线
Cocos2d-x课程大纲/学习路线 这是什么? 这个一个Cocos2d-x技术路线的课程大纲/学习大纲. 你能用它做什么? 如果你是找工作的人, 利用本大纲, 你可以学习Cocos2d-x, 做一个 ...
- svn-主副分支使用
主改bug 副加功能, :主合并到副(在副中切换主分支),副调试成功,合并回主(在主切换回副分支) 奇葩的实现了需求 主改bug 副加功能, :主合并到副(在副中切换主分支),副调试成功,合并回主(在 ...
- 【 java版坦克大战--绘图技术】 绘制坦克
通过上一节,我们学会的用java绘图.那现在就用java绘制自己坦克. 首先通过分析坦克由这几部分组成.如图 各个部件的长宽如图.15,10为圆心. /** * 坦克游戏的1.0版 * 1.画出坦克 ...