问题现象:
网站访问长时间等待,然后超时失败。
解决历程:
1,先直接查看网站应用的日志。
日志最直接的报错是“GetConnectionTimeoutException”,如果是第一次见到这个错误,可能会第一时间想到就是数据库连接池中的连接不够用了。
让我们疑惑的是,根据active 292 maxactive 500就可以判断出数据库连接是够用的。那为什么又报获取连接超时呢?
这里有一篇参考文章,解答了我的疑惑。
https://blog.csdn.net/xiaolaoban212/article/details/115357734
简单说就是,因为异常的日志打印没有放在同步块中,使用的变量没有考虑多线程。
所以在打印日志时,变量(active)的值已被修改,所以不是异常发生时的值。
知道了线程池被占满,那么必定是应用在处理大量的请求。
2,于是我们查看了一下这台服务器的资源使用情况
我们采用df,du,free,top等命令查看了服务器资源,发现磁盘和内存都正常有余,CPU资源几乎被一个进程消耗殆尽。这个进程就是网站应用。
网站的应用,在疯狂的占用CPU资源,要么就是极高的并发,要么就是死循环。
3,查看java运行情况
同时我们通过jstack命名查看了一下java的运行使用情况。
能够看到大量的线程在等待的状态。可以结合数据库线程池不够,基本确定就是大量的并发线程。
4,查看nginx日志,确定问题dos攻击
然后我们查看了nginx的access.log日志,(不再贴图)
只见访问日志一超高的速度在访问,所以确定就是受到了dos攻击。
5,解决方法
使用 awk命令,统计访问日志,查询出高频访问的恶意IP
将这些IP加入到服务器黑名单。
更高级的做法,可以写一个脚本每间隔一段时间统计一次,更新黑名单。(这个我们没做)
现在的云服务器,一般都会自带态势感知,流量分析等软硬件设备。