Web服务中使用线程池是提高了性能还是限制了性能问题?

上邪
  • 104
  • 创建一个Web服务,比如一个:SpringBoot微服务。
  • SpringBoot服务中定义一个线程池,核心线程数20个,最大线程数也是20个。
  • 对外暴露一个API接口,接口功能是需要循环60次到数据库获取数据(不要说让改这个查询逻辑),并且合并返回。
此时,为了提高服务器性能,加快返回的时间,现在将查询数据库的操作提交给线程池处理,那么相当于说:当有一个request进来的时候,原本需要循环60次才能拿到的结果集,现在有20个线程在同时查询,性能提高了20倍(理论上)。

但是,如果现在我有100个并发,也就是说有100个请求同时进来,那么这个线程池是怎么工作的呢?

  1. 是同一个时间段只有20个线程在连接数据库查询呢?
  2. 还是有100 * 20 = 2000个在连接数据库查询呢?

如果是第一种情况,那么是不是限制了服务器运行,降低了性能呢。甚至,因为请求并发提交给线程池处理数据,有可能造成第一个请求要等最后一个请求执行的差不多的时候才能拿到结果。严重影响性能。

如果是第二种情况,那么进程中的线程数量将暴增,有可能硬件设置也是无法承受的。

我猜测是第一种情况,一会要按照上面的步骤写一个demo试试,现在先把问题提出来,大家一起讨论一下。

回复
阅读 375
2 个回答

要具体问题具体分析. 线程池免去了创建线程的开销, 肯定是提高性能了.
我们的目标是最大程度压榨机器性能, 又不能让机器挂掉.

又多少个线程完全看你怎么写,如果你线程池公用,那么无论你多少个用户请求,就只有20个线程。如果你每个用户创建一个线程池,那就会有很多个线程。线程并不是越多越好,要看是IO密集性还是计算密集型。你这种确实属于IO密集性,但最合适的线程数是通过压测得来的,也得看CPU是几核的,大致的话是有公式参考的CPU 核心数 * (1 + IO 耗时/ CPU 耗时)。不推荐每一个用户创建一个线程池,这是在埋雷。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏