DevOps: 一例高负载多并发服务器连接池满的异常排解过程
2019独角兽企业重金招聘Python工程师标准>>>
今天是三八国际妇女节, 也是中国农历二月二/龙抬头的节日,恭祝女同胞节日快乐!恭祝中国善良的人们都抬头见喜!
好一阵子没更新Blog,今天也借这喜气冲刷一下往日的阴霾,经过多日的观察,终于找到这阵子“有福新闻”高负载多并发服务器的异常报错背后的原因之一。此前在Blog中频繁观测到 GWA2 PHP Memcached的报错,并且在代码层面进行了多次调优,问题暂时得到缓解,深层并未深究出个所以然。
“GWA2 PHP Memcached自动追加服务器连接?一例缓存服务被击穿的异常分析”, -R/52SP 。
在进行日常服务器状态巡检时,先是发现 Apache 在数日的持续运行中,会有 segmentation fault 导致的死掉,于是对 Apache 2.4.x 进行升级到最新版的操作,然而加了保护措施。尽管偶尔有 Apache child 有 segmentation fault退出,但整个服务顽强的活着.
后续几日的连续观测中,Apache暂无异常死掉,而 GWA2 PHP Memcached再次开始报错,报错信息为唯一的 127.0.0.1/11211 服务被标记为 DEAD (error code: 35). 然而在终端用 telnet 进行手工模拟时,memcached的服务又是正常的,这是为何?时好时坏,随机出错吗?
近日继续探测,在最近的一次服务器上尝试使用 ping ufqi.com 时,命令行开始报错说 sendmeg not permitted… 于是一例服务器操作系统层面的问题被曝露出来。
ping命令的无法执行,可能是网络配置或操作系统异常,循着这个思路,我们使用 journalctl -f 命令,很快看到 kernel层的报错信息:
Mar 08 04:43:06 srv21 kernel: nf_conntrack: nf_conntrack: table full, dropping packet
Mar 08 04:43:06 srv21 kernel: nf_conntrack: nf_conntrack: table full, dropping packet
Mar 08 04:43:06 srv21 kernel: nf_conntrack: nf_conntrack: table full, dropping packet
原来是系统的网络连接池出现了问题!关于 “nf_conntrack: table full, dropping packet” 这里 -R/u2SR 有详细的解释。 简单地说,操作系统集成了 Netfilter 防火墙服务,基于 iptables 的操作系统的连接管理器中,有四个 table(表) 和五个 chain(链)。
Fig1. Iptables 4 tables and 5 chains
Tables: categorized by different operations to data packets.
raw
: highest priority, only appied toPREROUTING
andOUTPUT
chain. When we don’t need to do NAT, we can use RAW table to increase performance.
mangle
: modify certain data packet
nat
: NAT, port mapping, address mapping
filter
: filterChains: categorized by different hooks.
PREROUTING
: packet before going to route table
INPUT
: after packet passing route table, destination is current machine
FORWARDING
: after packet passing route table, destination is not current machine
OUTPUT
: packet comes from current machine and to outside
POSTROUTIONG
: packet before going to network interface
当操作系统处理 TCP/IP 连接相关模块出错时,所有基于连接的服务都会报出异常。这是此前在代码层无论如何优化都没办法解决OSI分层中更底层的问题。
操作系统默认的并发连接数为 65535, 通过命令:cat /proc/sys/net/netfilter/nf_conntrack_max 可以查看到。 如果通过命令 cat /proc/sys/net/netfilter/nf_conntrack_count 获得到的数字等于 max 的最大值时,此时再有新创建连接的需求就会报错,当创建连接失败时,基于其上的所有应用都将失败,而这些在代码层并不容易解决。推荐的 /proc/sys/net/netfilter/nf_conntrack_max 值的计算公式: CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32) , 如 8GB RAM in x86_64 OS, max = 8*1024^3/16384/2=262144 。
当一台繁忙的服务器的连接数超过默认值时,需要通过修改 /proc/sys/net/netfilter/nf_conntrack_max 来使得系统能够接收更多连接进来。
临时修改:
echo 524288 > /proc/sys/net/netfilter/nf_conntrack_max
or
sysctl -w net.netfilter.nf_conntrack_max=262144
永久修改:
在 /etc/rc.d/after.local 或者 /etc/rc.d/rc.local 中增加上述命令行语句。
除了增加 /proc/sys/net/netfilter/nf_conntrack_max 参数设定外,还可以通过调整 iptables 的表或者链上相关规则来进行调优,更多参考: -R/u2SR 。
“有福新闻”, “全国招投标信息中心” 等服务又可以畅快地运行并有信心地迎接下一次洪峰的到来。
小结:
1. 在代码层很难发现操作系统层的问题,可行的路线是分析应用层源码;
2. 系统层的异常,通过具有随机性,比如连接数,是一个动态变化数据,可能下一秒异常就没有了,无法确定重现的问题为 troubleshooting 带来了一定的障碍。
但是,已有的问题,在没解决之前,会再次发生,这是确定的。
-R/n2SO
转载于:https://my.oschina.net/wadelau/blog/3021781
DevOps: 一例高负载多并发服务器连接池满的异常排解过程相关推荐
- java设计高并发内存池_高并发服务器-连接池的设计
高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...
- 服务器连接池怎么配置文件,服务器连接池怎么配置
服务器连接池怎么配置 内容精选 换一换 本节操作以Windows Server 2012操作系统的云服务器为例介绍实现多用户登录的操作步骤.Windows server2012服务器默认能够支持两个用 ...
- weblogic服务器连接池配置细节
进入某个连接池配置页,进入"连接"页,点击高级选项的"show"显示高级选项. 指定 "测试频率" 并启用 "测试保留的连接&qu ...
- 高并发 高负载 网站系统架构
高并发 高负载 网站系统架构 注:我看到这篇文章写的太好了,可以没法转到CSDN上我就COPY了,看到下面激烈的评论,我也一并COPY了.不过还是要谢谢哪位作者了.这样的文章很少. 转自:http:/ ...
- 高并发高负载网站系统架构
我在CERNET做过拨号接入平台的搭建,而后在Yahoo&3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大 ...
- 大型高并发高负载网站的系统架构
转载请保留出处:俊麟 Michael's blog (http://www.toplee.com/blog/?p=71) Trackback Url : http://www.toplee.com/b ...
- 高并发高负载系统架构
本文作者在Cernet做过拨号接入平台的搭建,而后在Yahoo3721负载搜索引擎前端平台开发,又在猫扑处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大型网 ...
- 说说大型高并发高负载网站的系统架构 1
转载请保留出处:俊麟 Michael's blog (http://www.toplee.com/blog/?p=71) Trackback Url : http://www.toplee.com/b ...
- [转载]说说大型高并发高负载网站的系统架构
转载请保留出处:俊麟 Michael's blog (http://www.toplee.com/blog/?p=71) Trackback Url : http://www.toplee.com/b ...
- 说说大型高并发高负载网站的系统架构【转】
我在CERNET做过拨号接入平台的搭建,而后在Yahoo&3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大 ...
最新文章
- Android点击图标重新启动问题
- C# BeginInvoke与EndInvoke的使用
- iOS Ruby出现问题,导致无法安装Pod
- hdu3234 带权并查集(XOR)
- 分页原理+分页代码+分页类制作
- java中怎样计算个人所得税计算器,个人所得税计算器
- Win7搭建http文件共享
- java中if结构用图表示_Java if语句结构和指令流水线
- 机器学习算法基础4-K-近邻算法、朴素贝叶斯算法、分类模型评估、模型的选择与调优
- 千方百剂创建账套服务器文件,千方百剂辅助工具使用手册(图解).doc
- c语言高亮字符,C语言语法高亮工具
- 个性化定制软件安装包流程指导(按照步骤即可定制化安装流程)
- 怎么使qq推广效果最大化
- 小红书种草模式有哪些?如何保证种草效果
- 备忘_命令行查看电池损耗
- 36个非常有用的电脑知识?
- u-boot启动流程分析
- 下载 axios.js 文件到本地
- CodeForces 3-B Lorry
- 【自然语言处理】【向量检索】面向开放域稠密检索的多视角文档表示学习
热门文章
- C# winfrom 添加Log4Net日志库
- python中size的用法_PyArray_SIZE的正确用法是什么?
- PHP中preg_match_all正则匹配出需要的内容
- Python百度语音合成
- voronoi图代码_在Unity中实时计算Voronoi图
- android系统各种版本所占市场比例
- MAC修改.bashrc/.bash_profile无效,默认的用户配置文件是.zshrc,
- 六石编程学:自动化测试的优点
- 疑似BAT的BUG及避错办法
- gpg: no default secret key: 私钥不可用