服务器用admin ssh上去显示:
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash-4.1$
因为设置root的ulimit更大,所以用root可以ssh去查看问题。
/etc/security/limit.conf
root hard nofile 65535
root soft nofile 65535
admin hard nofile 65000
admin soft nofile 65000
服务器上跑了user space的程序有nginx,jsvc启动 tomcat,mongodb。java程序会和另外三台机器交互。
写脚本监控java(pid=1619)使用fd数量,mongodb连接数,和整体连接数。
monitor.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from datetime import datetime
import time
while 1:
os.system("echo -n %s $(ls -al /proc/`ps aux | grep jsvc | grep -v grep | awk {'print $2'} | sort -r | head -n 1`/fd | wc -l) >> monitor.log" % datetime.now().isoformat())
os.system('''echo " `netstat -antp | grep 27017 | wc -l` `netstat -antp | wc -l` `pstree | grep jsvc | awk -F'-' {'print $NF'}`" >> monitor.log''')
time.sleep(60)
可是用admin跑这个脚本,等到出问题后,就只有时间被记录。
因而用root用户查看出问题时的连接数:
netstat -na | wc -l 只有1043
跑脚本查看各个进程的file descriptor,发现jsvc 的进程最多1057个,其他30几个系统进程都不超过20个。脚本如下:
detect_process_fd.sh
for di in $(find /proc -maxdepth 1 -type d)
do
[ -e $di/fd ] && echo $di `ls -al $di/fd | wc -l` || echo -n
done
pstree -u
init-+-acpid
|-agetty
|-auditd---{auditd}
|-crond
|-dbus-daemon(dbus)
|-haproxy(haproxy)
|-jsvc(ruyi)---jsvc---1013*[{jsvc}]
|-6*[mingetty]
|-mongod(mongod)---9*[{mongod}]
|-nginx---2*[nginx(ruyi)]
|-ntpd(ntp)
|-rsyslogd---3*[{rsyslogd}]
|-sshd-+-sshd---sshd(ruyi)---sftp-server
| |-sshd---bash---pstree
| `-sshd---sshd(ruyi)---bash
|-tmux(ruyi)---bash---python
|-udevd---2*[udevd]
`-uma---python
jsvc开了过多线程,系统给ruyi用户设置的是1024,所以有问题
修改/etc/securite/limit.d/90-nproc.conf
* soft nofile 12000
参考资料:
阅读(1471) | 评论(0) | 转发(0) |