1、事发
刚好在外干活,开发着急上线,就远程进行上线,过程中发现tomcat出现大量异常日志。
2、报错日志
java.lang.OutOfMemoryError: unable to create new native thread
3、原因:得知市场部门正在推广app
4、直接去看接口并发以及数据库监控,发现接口并发连接数峰值在2500左右,全站应用日志都在报错,就猜到了又是数据库出现了瓶颈,结果发现是一台从库cpu100%导致所有查询都吭住了。明明两台从库可是请求大多数都在了第二台从库上,告知市场部情况并要求暂时停止推广,开发修改代码将部分应用手工指定连接到第一台从库上,问题得到解决。
最开始以为是并发过大导致的应用内存溢出,就做了一些关于进程的线程数量查询,以下是记录:
pstree -p ps -ef | grep story-wap|grep -v grep | awk '{print $2}' | wc -l
查看story-wap进程的线程数量(如果story-wap过滤不出来会统计系统所有的线程数量)
pstree -p ps -ef | grep story-app|grep -v grep | awk '{print $2}' | wc -l
pstree -p ps -ef | grep story-back|grep -v grep | awk '{print $2}' | wc -l
Linux下查看某个进程的线程数量
有些时候需要确实进程内部当前运行着多少线程,那么以下几个方法值得一用。

1.根据进程号进行查询:

pstree -p 进程号

top -Hp 进程号

2.根据进程名字进行查询:

pstree -p ps -e | grep server | awk '{print $1}'

pstree -p ps -e | grep server | awk '{print $1}' | wc -l

这里利用了管道和命令替换,
关于命令替换,我也是今天才了解,就是说用括起来的命令会优先执行,然后以其输出作为其他命令的参数,
上述就是用 ps -e | grep server | awk '{print $1}' 的输出(进程号),作为 pstree -p 的参数
管道和命令替换的区别是:
管道:管道符号"|"左边命令的输出作为右边命令的输入
命令替换:将命令替换符"
"中命令的输出作为其他命令相应位置的参数

参考
http://www.cnblogs.com/myshare/p/5177135.html

kill -9 ps -ef |grep story-app|grep -v grep|awk '{print $2}'
kill -9 ps -ef |grep story-back|grep -v grep|awk '{print $2}'
kill -9 ps -ef |grep story-wap|grep -v grep|awk '{print $2}'