当前位置: 首页 > 知识库问答 >
问题:

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

夏宪
2023-03-14

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

更多细节:假设传入的请求需要执行一些繁重的数据库操作。Web服务器负载很重,在任何给定时刻,10个请求处理线程都在忙于处理请求。服务器有10个核心,所以假设每个核心运行一个线程。

请求以同步方式处理,每个请求处理线程从到达到完成处理作业。但是需要对数据库进行一些等待。

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

这引起了人们的担忧——现在需要在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
}

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

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

共有1个答案

皇甫学海
2023-03-14

注意:下面假设您的DB在不同的主机上运行,所以DB查询不会占用web服务线程的CPU。

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

E、 例如,如果client1Query运行10秒,并且没有空闲线程,那么client2Query只需要1秒就可以完成,它将需要等待一个client1Query完成,或者其他线程可用。

 类似资料:
  • 线程中使用 java.lang.Runnable 如果用户在代码中通过 java.lang.Runnable 新启动了线程或者采用了线程池去异步地处理一些业务,那么需要将 SOFATracer 日志上下文从父线程传递到子线程中去,SOFATracer 提供的 com.alipay.common.tracer.core.async.SofaTracerRunnable 默认完成了此操作,大家可以按照

  • 问题内容: 我发现在Python 3.4中,用于多处理/线程的库很少:多处理vs线程与asyncio。 但是我不知道使用哪个,或者是“推荐的”。他们做的是同一件事还是不同?如果是这样,则将哪一个用于什么?我想编写一个在计算机上使用多核的程序。但是我不知道我应该学习哪个图书馆。 问题答案: 它们旨在(略有)不同的目的和/或要求。CPython(典型的主线Python实现)仍然具有全局解释器锁,因此多

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 我有一个用C#编写的grpc服务,它有2个调用,如Start和Stop。当客户端调用Start(这个调用需要很多时间),然后Stop服务器同步处理请求,而grpc启动了4个线程。 您能帮我了解它是否按设计运行,或者我错过了任何其他设置吗?

  • 问题内容: 在Java中创建FixedThreadPool Executor对象时,您需要传递一个参数,该参数描述Executor可以同时执行的线程数。我正在建立一个服务类,其职责是处理大量电话号码。对于每个电话号码,我需要执行Web服务(这是我的瓶颈),然后将响应保存在哈希图中。 为了使此瓶颈对我的服务性能的危害减少,我决定创建Worker类,该类将获取未处理的元素并对其进行处理。Worker类

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出