请求处理线程与自定义线程,以实现异步处理与Web服务器性能

时间:2013-12-13 17:56:43

标签: java multithreading http servlets webserver

问题:当我创建一个自定义线程以异步方式处理传入的HTTP请求时,我是否因为引入太多线程而损害了性能?

更多洞察力: 让我们说传入的请求需要执行一些繁重的数据库操作。 Web服务器负载很重,在任何给定时刻,10个请求处理线程都在忙着处理请求。服务器有10个内核,所以假设每个内核运行1个线程。

请求以同步方式处理,每个请求处理线程处理从到达到完成的作业。虽然需要等待数据库。

可能的“改进”将是稍微改变流程,而不是处理整个请求的请求处理线程,创建额外的线程来处理繁重的数据库操作并且提前释放请求处理线程。

这引起了人们的关注 - 现在需要10个核心上超过10个线程。 - 上下文切换会降低性能

我的意思是请求处理线程: http://docs.oracle.com/cd/E19146-01/821-1834/geeie/index.html

我的意思是自定义线程:

void handleHttpMethod(){
  //request processing thread running here
  executorService.submit(new DBTask())
  //request processing thread exits here
}

我知道这是一个有点开放的问题,但我真的对您的反馈和评论感兴趣。

[编辑] 更多细节:  我正在运行部署到Glassfish3服务器的Web应用程序,该服务器处理大约1000个请求/秒。每个请求都涉及一些DB操作(存储一些数据而不需要等待结果),这与请求中执行的其他逻辑相比较重。我试图了解异步会如何影响Web服务器性能,因为请求处理线程现在必须与我创建的自定义线程共享CPU来处理数据库操作。

1 个答案:

答案 0 :(得分:1)

注意:下面假设您的数据库在不同的主机上运行,​​因此数据库查询不会从您的Web服务线程中获取CPU。

如果数据库查询时间因客户端而异,则可以通过将数据库请求卸载到“自定义”线程来提高吞吐量(就服务请求数而言)。

,例如,如果client1Query运行10秒并且没有空闲线程,则client2Query只需要1秒钟即可完成,需要等到client1Query完成,或者某个其他线程可用。