在我的 web 应用程序启动后的某个时间点,我开始收到Can't handle a new request, too many request threads already
来自 hunchentoot 的警告,并在浏览器中显示相应的 http-service-unavailable 响应。问题是这永远不会返回到正常的请求处理,即好像某些请求处理程序“挂起”而没有返回,所以当调用了足够多的这些处理程序时,最大线程数会被击中并保持这种状态。如何获取当前线程的列表并检查其中一个线程的当前调用堆栈,以便检查问题出在哪里?这甚至有意义吗?我没有收到其他警告。关于如何开始调查的任何建议?
问问题
272 次
1 回答
3
我看到与 SBCL 相同的行为(在 Windows 上)。问题似乎是客户端正在发送 Keep-Alive 标头,hunchentoot 通过在处理请求后保持工作线程运行来实现这一点。它处于空闲状态,等待进一步的输入,但不幸的是,套接字似乎永远不会超时,线程也永远不会终止,所以我很快就遇到了一个无法正常工作的服务器。这似乎是一个特定于 Windows 的问题,因为相同的代码在 (Ubuntu) Linux 下运行良好。
@Paralife 你可以暂停一个线程并检查它的调用堆栈
(bt:interrupt-thread thread #'break)
您可以使用 (bt:all-threads) 获取您想要的线程。
于 2014-03-18T10:44:54.027 回答