今天发现有台redis机器上出现socket个数告警,这是很奇怪的现象。因为一台redis服务器上就部署了几个redis实例,打开的端口应该是有限。

1、netstat显示的tcp连接数正常

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

TIME_WAIT 221

ESTABLISHED 103

netstat -nat |wc -l

368

建立的tcp连接数并不是很多。

2、ss -s显示大量的closed连接

ss -s

Total: 158211 (kernel 158355)

TCP: 157740 (estab 103, closed 157624, orphaned 0, synrecv 0, timewait 173/0), ports 203

Transport Total IP IPv6

* 158355 - -

RAW 0 0 0

UDP 9 6 3

TCP 116 80 36

INET 125 86 39

FRAG 0 0 0

closed 157624,很多socket是处于closed状态。

而我的系统监控取值方法是:

cat /proc/net/sockstat | grep sockets | awk '{print $3}'

158391

cat /proc/net/sockstat

sockets: used 158400

TCP: inuse 89 orphan 2 tw 197 alloc 157760 mem 16

UDP: inuse 6 mem 0

UDPLITE: inuse 0

RAW: inuse 0

FRAG: inuse 0 memory 0

很多socket处于alloc状态,已经分配sk_buffer,而且处于closed。

redis的file discriptes存在泄漏,没有被内核回收。

3、追查真凶

上面信息说明存在socket fd泄漏,那么用lsof命令检查系统sock的文件句柄。

lsof | grep sock

java 4684 apps *280u sock 0,6 0t0 675441359 can't identify protocol

java 4684 apps *281u sock 0,6 0t0 675441393 can't identify protocol

java 4684 apps *282u sock 0,6 0t0 675441405 can't identify protocol

java 4684 apps *283u sock 0,6 0t0 675441523 can't identify protocol

java 4684 apps *284u sock 0,6 0t0 675441532 can't identify protocol

java 4684 apps *285u sock 0,6 0t0 675441566 can't identify protocol

可以发现,Name列的值为“an’t identify protocol”,socket找不到打开的文件,。

这个显示,是java进程(pid=4684)出现了socket fd泄漏的状况。

ps auxww | grep 4684

发现是redis机器上日志收集工具flume。

4、解决方案

没有很好的的方法,简单粗暴的kill占有scoket fd的进程。

今天发现,重启flume agent之后,仍然会出现这种大量的closed socket现象。

strace flume进程,发现flume进程已经挂起了。

sudo strace -p 36111

Process 36111 attached - interrupt to quit

futex(0x2b80e2c2e9d0, FUTEX_WAIT, 36120, NULL

首先,我比较怀疑文件句柄不够用,因为google查找到的资料也提高了文件fd不够而导致这种问题。

在我的机器上,最大允许打开的文件数为131072,文件fd个数还有近1/4没有使用。

lsof | wc -l

10201

ulimit -a

ulimit -n

131072

这时,同事提示我,还有其他大量机器也出现了这种问题(flume已经上线了3个月,之前都很正常)。

这是,我想起了还有flume的日志可以查看。而查看flume的日志,提示flume找不到broker 5。

纳尼,不是kafka集群不是只有4个broker(节点)。这时候才想起前几天的邮件然来spark开发的同事,对kakf集群进行扩容了。

而新的集群节点9092端口对这台redis所在的机房没有开放访问权限。

[SinkRunner-PollingRunner-DefaultSinkProcessor] (kafka.utils.Logging$class.warn:89) - Failed to send producer request with correlation id 63687539 to broker 5 with data for partitions [titan,4]

5、问题重现

在lsof: can’t identify protocol这篇文章中,用python代码重现了这种状况。

:)

在解决问题时,google查找是一种比较快捷的方式。而有时候,google出来的结果反而会影响排查问题的方向。

在我看到google的搜索结果之后,第一感觉是因为操作系统的max open files参数太小导致。在发现不是这个原因之后。我的思路仍然停留在内核参数是否配置合理的思路上。知道其他的机器上部署的flume出现了同种状况是,我才意识到是flume本身出了问题,才去strace flume进程的状态和查看flume的日志。

linux 文件句柄 sock,tcp socket文件句柄泄漏相关推荐

  1. codeblock socket 编译错误_从Linux源码看Socket(TCP)Client端的Connect

    从Linux源码看Socket(TCP)Client端的Connect 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的 ...

  2. linux内核线程socket,从Linux源码看Socket(TCP)的accept

    从Linux源码看Socket(TCP)的accept 前言 笔者一直以为若是能知道从应用到框架再到操做系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...

  3. java linux 调用32位so_从linux源码看socket(tcp)的timeout

    从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌.在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp ...

  4. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

  5. 从Linux源码看Socket(TCP)的bind

    从Linux源码看Socket(TCP)的bind 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看下Server ...

  6. linux socket句柄泄露,socket句柄泄漏问题的定位: losf和strace的联合使用!

    最近遇到一个socket句柄泄漏的问题, 我们来简要说说如何定位: 1.  确定哪个进程在泄漏, 可以用命令 lsof -n|awk '{print $2}'| sort | uniq -c | so ...

  7. Linux下基于TCP的简易文件传输(socket编程)

    Linux下基于TCP的简易文件传输(socket编程) OSI和TCP/IP: 关于TCP/IP协议 关于TCP协议 TCP编程的一般步骤[^2] TCP文件传输实现 功能概述 服务器编程 客户端编 ...

  8. Linux下高并发socket最大连接数所受的各种限制

    修改最大打开文件数 # ulimit -n 修改最大进程数 # ulimit -u ------------------------------------------------------ Lin ...

  9. linux socket文件数限制,Linux下高并发socket最大连接数所受的限制问题

    Linux下高并发socket最大连接数所受的限制问题1.修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对 ...

  10. 转:Linux下高并发socket最大连接数所受的各种限制

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

最新文章

  1. python中的encode()和decode()函数_python里面的encode和decode函数
  2. 维护局域网,让更给力,教你如何去维护局域网
  3. 数据科学家常用的十大机器学习算法,都在这了!
  4. HZOJ 斐波那契(fibonacci)
  5. android 中的常用组件
  6. 线程同步的各种方法汇总
  7. SpringBoot_入门-HelloWorld细节-场景启动器(starter)
  8. 蜂窝注册表和永久存储
  9. 最佳Linux服务器发行版
  10. 为什么NOLOCK查询提示是个不明智的想法
  11. 三星Galaxy S21 FE现身Geekbench:骁龙888+6GB运存
  12. GEOTOOLS-几何学
  13. ugmented reality(AR) equipment
  14. android 自定义取色器,Android Studio设置颜色拾色器工具Color Picker教程
  15. 61850客户端软件构建
  16. [STL源码剖析]空间置配器allocator
  17. 微信小程序运营系列(八)——怎么玩转中高频行业运营?
  18. 2021年备战面试--算法13
  19. 【图像处理】图像锐化的工作原理和算法实现(matlab实现)
  20. VIVADO时序约束之Output Delay(set_output_delay)

热门文章

  1. c# asp.net 修改webconfig文件 配置
  2. 高程三(1):简介、使用、严格模式
  3. linux中c表示字符设备文件符号
  4. BeX5平台简明部署过程
  5. redis3.2版本protected-mode参数
  6. tuple操作、dict、其他常用操作
  7. 2017年12月24日23:46:07
  8. Dawn 阿里开源前端开发构建工具
  9. CentOs6.5配置安装DRBD
  10. Postgresql 插入json数据