我正在对部署在 Tomcat 上的基于 Java 的 Web 应用程序 (Grails) 进行性能测试。该服务器上运行着以下服务:
- Apache HTTPD
- 阿帕奇 Tomcat
- MySQL的
- RabbitMQ
尽管我明白在理想情况下这些服务应该在三台独立的服务器上运行,但我只是想看看我的应用程序对某些负载的表现如何。我发现运行20
加速期超过40
几秒的线程似乎会导致服务器无响应。但是,我无法准确指出导致服务器无响应的具体原因
当时我可以通过 SSH 连接,但当它没有响应时,我甚至无法通过 SSH 连接机器。这是当它没有响应时来自 TOP 的数据,我甚至无法通过 SSH 连接它。它似乎没有说明为什么它会变得没有响应。
问题
- 我该如何调试导致服务器无响应的原因?
答案1
我要做的第一件事就是降低这些进程占用比操作系统更多的 CPU 或磁盘 IO 时间的可能性。我假设您的操作系统是 Linux。
在编辑所有配置文件之前,请务必备份它们。
通过查看 sar 数据,您可能能够获得有关崩溃之前操作系统行为的一些提示。
sar -A | more
一定要注意内存或 CPU 使用率是否上升。您可以通过编辑 /etc/cron.d/sysstat 来更频繁地运行 sar(假设它已安装并启用)。
对于您的进程正在运行的每个服务帐户,您可以在文件末尾的 /etc/security/limits.conf 中添加以下内容。
apache soft priority 19
apache hard priority 19
rabbitmq soft priority 18
rabbitmq hard priority 18
mysql soft priority 10
mysql hard priority 10
然后在每个守护进程的初始化脚本中,减少分配给它们的 CPU 和 IO 时间。
cp -p /etc/rc.d/init.d/some_init_script ~/`date '+%Y%m%d.%H%M'`.some_init_script
vi /etc/rc.d/init.d/some_init_script
在脚本的第二行添加以下内容,减少CPU和IO时间片:
renice 19 -p $$ > /dev/null 2>&1
ionice -c3 -p $$ > /dev/null 2>&1
重新启动每个服务。
假设 sshd 仍会无响应。如果您安装了“screen”,那么您可以在各种 screen 中运行 vmstat、iotop 和其他工具。screen 的使用有速查表,因此这里就不介绍了。
此时,即使您的服务失控,您仍然应该能够 ssh 到服务器,假设它没有触发恐慌。
您可以通过将资源固定到特定核心或 CPU 来进一步限制分配给每个守护进程的资源。这可以使用命令“taskset”来完成。 有关其用法的更多详细信息,请参见 man taskset。
[编辑] 我还应该补充一点,在某些自旋锁条件下,这不会有帮助。如果上述方法没有帮助,您可能必须在虚拟机中运行应用程序并使用调试内核或其他调试工具。