我刚刚接手了一个网站的管理,发现了一些问题:
当网站流量达到峰值时(当我们的帖子出现在某些分发列表/RSS 提要中时会发生这种情况),服务器会变得繁忙,然后冻结(错误 502)。
它由 AWS 托管,通过 Cloudwatch 我可以看到,在高流量峰值(非高峰时段平均流量高达 100 倍)之后,CPU 使用率在 1-1:30 小时内保持 100%(正常情况下不会超过 20%)。
- 每分钟 Apache 请求数(非峰值):约 300
- Apache 每分钟请求数,峰值:约 3000
Tomcat 和 Grails 日志没有说太多,“只是”一遍又一遍地重复这一点:
[http-bio-8080-exec-299] 错误 util.JDBCExceptionReporter - [http-bio-8080-exec-299] 超时:池为空。无法在 30 秒内获取连接,无可用连接[size:100; busy:100; idle:0; lastwait:30000]。
所以我猜问题在于,当流量如此之大时,30 秒超时就变成了“敌人”,因为有太多用户等待服务。
应用程序级别的数据库配置是:
池化 = true
properties { maxActive = 100 maxIdle = 25 minIdle = 5 initialSize = 5 minEvictableIdleTimeMillis=300000 timeBetweenEvictionRunsMillis=300000 numTestsPerEvictionRun=3 testOnBorrow=true testWhileIdle=true testOnReturn=true validationQuery="SELECT 1" }
关于如何调整这些值有什么建议吗?
谢谢!
更新:该网站再次瘫痪,我已经能够运行“top”命令,这是我所看到的:
top - 18:46:33 up 2:42, 2 users, load average: 1.04, 1.56, 1.78
Tasks: 136 total, 1 running, 135 sleeping, 0 stopped, 0 zombie
Cpu(s): 25.0%us, 0.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 28.6%hi, 0.0%si, 46.1%st
Mem: 3843124k total, 3385800k used, 457324k free, 42800k buffers
Swap: 0k total, 0k used, 0k free, 681368k cached
1340 tomcat 20 0 3611m 2.3g 11m S 61.3 64.0 51:18.60 java
2609 root 20 0 15140 1252 916 R 0.3 0.0 0:00.14 top
1 root 20 0 19488 1600 1284 S 0.0 0.0 0:00.88 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.23 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
...