java吧 关注:1,297,228贴子:12,834,819

回复:请问一下关于Tomcat并发处理请求的问题

只看楼主收藏回复

CPU的核心数和线程数决定了它可以同时执行的指令流的数量。一个核心可以对应一个或多个线程,比如Intel的超线程技术(Hyper-Threading)可以让一个核心模拟出两个线程。所以,一个12核24线程的CPU可以同时执行24个指令流,也就是说它可以同时处理24个任务。
Tomcat的线程数决定了它可以同时处理的请求的数量。一个Tomcat线程可以对应一个或多个请求,比如Tomcat的NIO模式可以让一个线程处理多个非阻塞的请求。所以,一个设置了500个线程的Tomcat可以同时处理500个请求,也就是说它可以同时响应500个客户端。
CPU和Tomcat之间的关系是一对多的,也就是说一个CPU线程可以运行多个Tomcat线程,但是一个Tomcat线程只能运行在一个CPU线程上。这是因为CPU线程是操作系统层面的概念,而Tomcat线程是Java虚拟机层面的概念。操作系统会通过调度算法来分配CPU资源给不同的进程和线程,而Java虚拟机会通过映射机制来将Java线程绑定到操作系统线程上。所以,一个CPU线程在一段时间内可能会运行多个Tomcat线程,而一个Tomcat线程在一段时间内可能会切换到不同的CPU线程上。
CPU和Tomcat之间的并发处理能力取决于多个因素,比如CPU的性能、内存的大小、网络的带宽、操作系统的优化、Java虚拟机的参数、Tomcat的配置、应用程序的逻辑等等。一般来说,并不是说设置越多的CPU线程或者Tomcat线程就越好,因为这样也会带来一些开销和冲突,比如上下文切换、同步锁、竞争条件等等。所以,要根据实际情况来合理地选择和调整CPU和Tomcat的线程数,以达到最佳的效率和性能。


IP属地:浙江18楼2023-09-14 23:50
回复
    500个。。。哈哈,那为啥不搞5万个,5亿个。。。


    IP属地:湖南来自Android客户端19楼2023-09-15 00:02
    回复
      2026-02-09 17:21:42
      广告
      不感兴趣
      开通SVIP免广告
      12核心24线程这里是硬件的参数,应用层的线程数就是上面提到的500线程,一个请求是100ms,但实际上线程并不是一直占用了cpu100ms,其中有其他时间,具体要看请求的任务类型来分析。


      IP属地:湖南来自Android客户端20楼2023-09-15 00:20
      回复
        如果耗时都是CPU计算的话,感觉并发量理论值是24*10,如果请求过程中让出线程,让出时间片,单片机很多都是单核的rtos vtaskdelay 让出时间片后,任务处理可以提升很大一部分,多种条件相互影响不太好计算了,可能我理解有误,等会写个Demo,再来回复实验结果


        IP属地:山东来自Android客户端23楼2023-09-15 08:08
        回复
          大佬们的回复我都看了, 后面老师又有了例子, 我在重开一个帖子, 这次有具体的配置


          IP属地:四川25楼2023-09-15 09:07
          回复
            你们这老师水货而已


            IP属地:上海来自Android客户端26楼2023-09-15 09:22
            回复
              cpu一个线程都能并行处理好多了


              IP属地:广西27楼2023-09-15 10:15
              回复
                因为执行任务的总耗时和线程实际跑的时间是不一定一样的。
                线程只有在内存计算的过程才会去消耗cpu,举个例子,web服务从socket channel里获取到数据之后,第一个耗时的过程肯定是把二进制消息反序列化成内存结构,之后内存里做操作,然后可能将部分内存对象再次序列化成请求的结构去请求其他中间件(redis,数据库,mq等)之后线程其实就被挂起了,因为需要等待网络交互的返回。返回有结果了之后再把内存对象序列化成响应返回给客户端。
                这整个过程假如说是100ms,那么其中序列化和反序列化可能耗时20ms,与中间件的交互等待时间占接近80ms,内存的方法调用和遍历的时间甚至能做到忽略不计。而与中间件的交互的80ms线程是挂起的,这个过程完全不占用cpu,cpu大可去处理其他线程那20ms的逻辑操作。


                IP属地:辽宁28楼2023-09-15 10:32
                回复
                  2026-02-09 17:15:42
                  广告
                  不感兴趣
                  开通SVIP免广告
                  楼上的搞笑呢,tomcat项目不是默认io密集型,一个线程阻塞了直接切另一个线程了,理论上12核线程确实够处理500个线程,因为大部分线程都在io阻塞呢。当然确实是理论上,正如楼主所言的还有线程上下文切换等耗时,实际qps还是得跑个压测看一下


                  IP属地:北京来自Android客户端29楼2023-09-15 11:44
                  收起回复
                    某一个时间点只有24个同时处理,一秒已经算时间段了


                    IP属地:浙江来自Android客户端30楼2023-09-15 12:46
                    回复
                      你要是考虑cpu核心数和线程数,那你把负载均衡也考虑上,一般都一个对外开放接收端口,背后是数台数十台甚至成千上万在负担着业务处理


                      IP属地:广东来自Android客户端31楼2023-09-15 13:06
                      回复
                        666


                        IP属地:上海来自iPhone客户端32楼2023-09-16 00:28
                        回复
                          跟处理器有啥关系,你就算一个人,在十秒内做了一百件事,这十秒内你就是在并行做事,就是有一百个线程


                          IP属地:广东来自Android客户端33楼2023-09-17 13:25
                          收起回复
                            也就是说如果系统同时运行25个进程,系统就嘎了?


                            IP属地:江苏来自Android客户端34楼2023-09-17 22:13
                            回复
                              2026-02-09 17:09:42
                              广告
                              不感兴趣
                              开通SVIP免广告
                              别用tomcat不就好了


                              IP属地:福建35楼2023-09-18 19:28
                              回复