使用 ab 运行一些基准测试,tomcat 开始真的变慢了

cod*_*ing 6 ubuntu tomcat java

我正在使用 apache bench 为在 tomcat 上运行的 java 应用程序运行一些基准测试。

说我运行一个测试,如:

ab -c 10 -n 10000 http://localhost:8080/hello/world
Run Code Online (Sandbox Code Playgroud)

它会运行得很好。如果我遵循它:

ab -c 50 -n 50000 http://localhost:8080/hello/world
Run Code Online (Sandbox Code Playgroud)

再次它会运行良好,但如果我再试一次,它可能会在 3500 个完成的请求后开始变慢。

我需要帮助来尝试调试此问题的根本原因。

我跑到了上面,我有一些未使用的内存,所以内存似乎不是问题。

tomcat6 进程确实达到了 70-80 甚至 107%。

似乎重新启动 tomcat 可以解决问题,但有时需要重新启动服务器。

这是在分配了 200 个线程的默认 tomcat 安装上。

Tomcat 日志为空。

更新

因此,我将 tcp_tw_recycle/reuse 都更改为 1,并且现在运行 netstat 显示的计数非常低。

在更改 tcp_tw_recycle/reuse 之前,我注意到事情变慢并运行 netstat 并且我有 32400 个 tcp TIME_WAIT 连接。

所以现在运行基准测试的更新,使用 -k 开关,我看到了更多的吞吐量。但是,在某些时候事情又开始变慢了,但是现在重新启动 tomcat 使事情恢复正常。之前,即使我重新启动tomcat,运行ab 的响应时间也会非常非常慢。 现在更改 tcp_tw_recycle/reuse 后,重新启动 tomcat 使事情恢复正常。运行 top 显示只有大约 20% 的 cpu 的 tomcat,所以现在看来​​问题出在 tomcat 上,但我怎么知道是什么?

mca*_*uth 4

这里可能发生了一些事情。上面的命令转换为 50 个并发连接,每个连接发出 1000 个请求。这里需要注意的一件事是,如果我没记错的话 apachebench 默认情况下不会启用 keepalived。可能值得添加这个(将 -k 传递给上面的命令)。无论如何,这将更像是一个现实世界的测试,因为大多数用户代理确实使用 keep-alive,Tomcat 默认情况下也是如此。如果我下面的理论是正确的,这应该有助于解决这个问题。

1)我怀疑你用太多的请求猛击了线程池,因为每个请求都在崩溃。这对这些线程以及系统上的 TCP/IP 堆栈来说是一个相当大的打击。这让我...

2) 您可能(好吧,您可能)用完了临时端口和/或命中了 TIME_WAIT 套接字。如果每个请求确实是一个新的、唯一的请求,那么您很可能会遇到 TIME_WAIT 情况,其中有数千个套接字处于该状态(请查看 netstat -an |grep -ic TIME_WAIT 以了解在该状态下它们的计数)你的负载)。除非您在系统上启用了 time_wait_reuse,否则这些套接字将无法重复使用。事实上,您使用 localhost 只会让情况变得更糟。

有关设置 time_wait 重用的更多信息,请查看此处。另请注意,该线程正确指出在 time_wait 上下文中设置 fin_wait 超时是不正确的,因此请避免这样做。在 TIME_WAIT 上下文中触发 fin_wait 是错误的,并且不会帮助您。

因此,请查看并可能专门调整 tcp_tw_recycle/reuse。这些将帮助您通过测试,并保持活力。