之前系统出了一次问题,主要是一个服务开启了太多句柄,导致最后socket超出最大值,这次增加进程句柄数量监控:
def check_pid_handle_num(maxnum = 500):
try:
#获取当前所有进程打开句柄数
cmd = "/usr/sbin/lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
#轮询检查当前所有进程
ret = {}
for i in p.stdout.readlines():
d = i.strip(' ').strip('\n').split(' ')
if d[0] > maxnum:
cmdd = "ps -C -p "+d[1]+"|awk '{print $6}'"
pp = subprocess.Popen(cmdd, shell=True, stdout=subprocess.PIPE)
#放入当前进程和句柄数量
ret[d[1]] = {'serv':pp.stdout.readlines()[1], 'num':d[0]}
pp.terminate()
return ret
except:
logging.error('error in check_pid_handle_num:%s', traceback.format_exc())
return []
如果超出了最大数,方法返回的是个字典{‘进程id’:{‘serv’:’服务名’, ‘num’:’打开句柄数’}}。查看系统当前最大句柄数:ulimit -n