记一次TcpListenOverflows报警解决过程

问题描述

2015-06-25,晚上21:33收到报警,截图如下:

此时,登陆服务器,用curl检查,发现服务报500错误,不能正常提供服务。

问题处理

tail各种日志,jstat看GC,不能很快定位问题,于是dump内存和线程stack后重启应用。

jps -v,找出Process ID

jstack -l PID > 22-31.log

jmap -dump:format=b,file=22-29.bin PID

TcpListenOverflows

应用处理网络请求的能力,由两个因素决定:

1、应用的OPS容量(本例中是 就是我们的jetty应用:controller和thrift的处理能力)

2、Socket等待队列的长度(这个是os级别的,cat  /proc/sys/net/core/somaxconn 可以查看,默认是128,可以调优成了4192,有的公司会搞成32768)

当这两个容量都满了的时候,应用就不能正常提供服务了,TcpListenOverflows就开始计数,zabbix监控设定了>5发警报,于是就收到报警短信和邮件了。

这个场景下,如果我们到服务器上看看 listen情况,watch "netstat -s | grep listen",会看到“xxx times the listen queue of a socket overflowed”,并且这个xxx在不断增加,这个xxx就是我们没有对网络请求正常处理的次数。

参考文章:

关于tcp listen queue的一点事

如何判断是否丢掉用户请求

linux里的backlog详解

linux下socket函数之listen的参数backlog

TCP SNMP counters

LINUX下解决netstat查看TIME_WAIT状态过多问题

理解了以上,我们已经可以大致认为,问题的根源,就是应用处理能力不足。以下的问题分析步骤,可以继续对此进行佐证。

问题分析

线程栈

首先看线程栈,大约12000多个线程,大量线程被TIME_WAIT/WAIT在不同的地址,偶有多个线程被同一个地址WAIT的情况,但是都找不到这个地址运行的是什么程序,貌似这个线程栈意义不大。

关于这点,还请高手进一步帮助分析,能否可以通过这个文件直接定位问题。

Eclipse Memory Analyzer

MAT分析工具,分析JVM内存dump文件,下载地址:http://www.eclipse.org/mat/downloads.php

通过分析,我们可以看到,内存中最多的类,是socket相关的,截图如下:

Shallow heap & Retained heap

Zabbix监控

问题解决

1、申请两台新虚拟机,挂上负载。

2、Jetty调优,增大线程数,maxThreads设置为500。

3、调用外部接口Timeout时间,统一调整为3秒,3秒前端就会超时,继续让用户走别的,所以我们的后端进程继续处理已经毫无意义。

时间: 2024-08-10 02:11:14

记一次TcpListenOverflows报警解决过程的相关文章

记一次帮朋友解决apache站点403错误的过程

apache版本: [[email protected] web]# rpm -qa | grep httpd httpd-tools-2.2.15-47.el6.centos.3.x86_64 httpd-2.2.15-47.el6.centos.3.x86_64 先说最终解决办法吧: 将/etc/httpd/conf.d/目录下的virtual.conf里面的具体服务器IP改为*号即可. 解决过程: 1.apache启动时发现报错: Starting httpd: httpd: Could

(原)记一次CentOS7 磁盘空间大小异常的解决过程

环境:kvm系统:CentOS7故障描述:10g的ssd,可使用大小仅有2g解决过程: ? ? 某次重装系统后,安装软件总提示磁盘空间不足,检查之下发现仅有2G空间,实则明明是10G的ssd,以下为排错过程: 1.df -h查看vda1大小为2.7G #df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 2.7G 2.4G 236M 91% / devtmpfs 234M 0 234M 0% /dev tmpfs 244M 0 2

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的,但是客户反应说CPU占用很高,经常达到80%~90% 我检查了任务管理器,确实是SQLSERVER占的CPU 而服务器的内存是16G内存,只占用了7G+ 客户的环境: Windows2008R2 SQLSERVER2005 SP3 64位 企业版 服务器内存:16G CPU:8核 RDS:阿里云主机

MySQL数据库ab主从复制出错及解决过程

MySQL数据库ab主从复制出错及解决过程 一.mysql主从服务器报错描述:Slave_IO_Running=NO,Slave_SQL_Running=YES,Last_Errno=0 mysql slave stop ; mysql slave start; mysql show slave status ; 如果Slave_IO_Running=YES ...解决过程 :1 如果:Slave_IO_Running=NO,Slave_SQL_Running=YES,Last_Errno=0m

[MySQL CPU]线上飙升800%,load达到12的解决过程

接到报警通知,负载过高,达到800%,load也过高,有11了. MySQL版本号为5.6.12-log 1 top 之后,确实是mysqld进程占领了全部资源. 2 查看error日志,无不论什么异常 3 show eninge innodb status\G,没有死锁信息. 4 show full processlist; 没有耗时很大的慢sql再跑.看并发,当前的线程总数量也才30个左右. 5 查看iostat,读写正常. 究竟是什么问题呢?查看slow log,发现例如以下SQL,频繁运

linux中企业网站中病毒的解决过程

1.1 处理过程 和运维人员确认确实出问题了,并详细确认问题情况. 指定处理方案,先备份已有数据,然后执行命令批量修改回来. 写解决说明,写完发给他们的运维. 询问处理结果,并告知详细查看日志,寻找问题发生来源. 提供亡羊补牢解决方案 1.2 从发现到解决过程 运营人员.网站客户发现问题,网站有弹窗广告. 运营人员报给开发人员,开发联系运维人员,开发和运维共同解决. 开发发现的问题原因就是所有站点目录被嵌入一段JS代码. 详细查看日志,寻找问题发生来源. 提供亡羊补牢解决方案

一个图文混排问题的解决过程

需求如所示:左边的是效果图,右边的是完成后的图                 具体需求描述:用户的回复一条就是一个cell,字数不定.当存在某种条件时,需要在文字(可能换行)的最后一个字后面添加一个能点击的删除按钮小图标,文字支持emoji表情符号. 解决过程: 1.一看到这种文字中需要穿插图片的就想到了富文本中的NSTextAttachment对象,它可以包装一个image后生成一个富文本,再给UILabel显示就能完成显示需求,但是,该对象只能包装UIImage对象,无法监听图片的点击事件

系统无法识别移动硬盘的解决过程

1. 如果是从未使用过USB外接设备的,需要查看CMOS参数 对于从来没有使用过USB外接设备的朋友来说,即使正确安装了驱动程序也有可能出现系统无法检测USB硬盘的情况,这主要是由于主板默认的CMOS端口是关闭的,如果没有将其设置为开启状态,那么Windows自然无法检测到移动硬盘了.为了解决这个问题,我们可以重新开机,进入CMOS设置窗口,并且在“PNP/PCI CONFIGURATION”栏目中将“Assign IRQ For USB”一项设置为“Enable”,这样系统就可以给USB端口分

记录一则ORA-00054,ORA-00031解决过程

生产环境:AIX 5.3 + Oracle 10.2.0.5 任务要求:普通表改造分区表,历史数据不要 这个需求很简单: pl/sql导出建表语句,依次修改成分区的建表语句,注意将索引修改成本地索引; drop 原表; create 新分区表. 1.重建过程中遇到问题:删除某表时报错ORA-00054,导致无法删除重建此表. SQL> drop table MOD_RESALT_PERF_CARR_1X_ZTE; create table MOD_RESALT_PERF_CARR_1X_ZTE(