记一次线上系统故障(文件句柄引起)

 当时产品发现页面无法正常发送短信,点击就报错“out of memory ”,一看以为内存溢出,连上服务器 发现内存还有很多。

同时又发现xhell无法连接服务器。就解决 这个问题 

[root@apps ~]#  cat /var/log/secure

Jul 19 21:16:22 apps sshd[17349]: pam_unix(sshd:session): session closed for user jgw
Jul 19 21:17:53 apps sshd[21807]: Accepted password for jgw from 61.164.59.252 port 6452 ssh2
Jul 19 21:17:53 apps sshd[21807]: pam_unix(sshd:session): session opened for user jgw by (uid=0)
Jul 19 21:18:06 apps sshd[21836]: Accepted password for jgw from 61.164.59.252 port 6453 ssh2
Jul 19 21:18:06 apps sshd[21836]: pam_unix(sshd:session): session opened for user jgw by (uid=0)
Jul 19 21:18:18 apps su: pam_unix(su-l:session): session opened for user root by jgw(uid=1000)

 参考:https://www.cnblogs.com/zangdalei/p/7693518.html 这个文档操作并没有解决问题。

后来查看每个进程占用的线程数量:

[jgw@redis01 logs]$ ps -ef|grep java|awk '{print "lsof -p "$2" | wc -l"}'|bash  #每个进程的线程数量
116
76
127
0
128
111
124
147
88
236
153
77
310
141
97
299
113

其中发现有个进程的数量上千,就找出此进程,查看线程:

[jgw@redis01 logs]$ ps -T -p 10214     #在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创建的所有线程。
  PID  SPID TTY          TIME CMD
10214 10214 ?        00:00:00 java
10214 10216 ?        00:00:23 java
10214 10217 ?        00:00:00 java
10214 10218 ?        00:00:00 java
10214 10219 ?        00:00:00 java
10214 10220 ?        00:00:00 java
10214 10221 ?        00:00:00 java
10214 10223 ?        00:00:00 java
10214 10224 ?        00:00:00 java
10214 10225 ?        00:00:00 java
10214 10226 ?        00:00:36 java
10214 10228 ?        00:00:36 java
10214 10229 ?        00:00:08 java
10214 10230 ?        00:00:00 java

用了此命令后发现是ms-code进程连接了1000多个redis线程。就杀掉ms-code进程。恢复。

lsof -p  PID  # 查看打开什么文件,可以更好的定位问题
原文地址:https://www.cnblogs.com/sheng-247/p/11215770.html