多线程-网络请求线程数设置

自己闲暇时,也曾尝试实现过简单的线程池,对高并发有过预生产的压测和调优,然而一直我都是作为服务提供方在做多线程。

最近,接过一个服务消费方的代码,看过代码,实现上并没有看出问题,每秒也有过千的请求并发效果,但是领导要求完成每秒两万。

凭借我一直的实践和阅读,理论上 线程数 = 2*CPU数时,可以达到一个最优的性能表现。

当下机器配置 12台 8C 机器,理论每台 16线程相对不错了。

按服务方说明,http请求,响应延时 10ms

计算理论值 200ms(tcp握手+延时) ,每秒每个线程可以 5次请求。

问题来了,16线程见鬼去吧。

猜测,16线程的理论值应该是非网络环境或者长连接情况下的一个结果。

16线程的最优是考虑了线程调度的花费,而在tcp握手面前,这个调度几乎应该忽略,重新计算线程数,20000  / 12 / 5 > 333

理论上是这样的,情况可能会比我想象的要好一些吧!

实际生产将会发生什么,是我一直都不敢给领导保证的,实际结果还是在千级徘徊。

猜测是,服务方的说明和实际性能不符。

本想和代码作者分析个可能的原因,然而接手的锅还是得自己动手,添加日志。

一路日志重新请求,日志显示,实际服务方的响应延时在10ms-10s不等,且多数响应实际为4s。

永远不要完全相信服务方的承诺,尤其国内,我的脑子里冒出这个曾经的经验。

线程数干到千级不多说,虽然仍未达到预期,但也已能够解释原因和完成基本场景要求。

准备收拾下班,愿明天 不再如此泥泞。

原文地址:https://www.cnblogs.com/qq1144054302/p/10381318.html

时间: 2024-10-10 17:24:34

多线程-网络请求线程数设置的相关文章

思考:网络性能优化:网络 -- cpu -- 线程数 -- 单个任务耗时 --- qps --- 并发

思考:网络性能优化:网络 -- cpu -- 线程数 -- 单个任务耗时 --- qps --- 并发如果没有理清楚上述概念和它们之间的关系,那么优化会毫无章法:线程越多,利用上的线程越多,cpu的idle会约低,只到cpu低得不能再低,一般情况下,可以可劲用(idle为10%你遇到过吗?),但是要注意你的下游能否能扛得住你转嫁给他们的并发压力呢:单个任务处理越快,qps和并发会越高:两个线程的并发一定是一个线程的两倍,10个线程的并发一定是2个线程的5倍:qps是一秒处理的任务数,这个换算逻辑

[转载]C# 多线程、控制线程数提高循环输出效率

C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段10条数据. int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1

C# 多线程、控制线程数提高循环输出效率

原文:C# 多线程.控制线程数提高循环输出效率 C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段10条数据. int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(cre

猫猫学iOS(四十九)多线程网络之线程的创建NSThreand

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:NSThread的基本使用 1:创建和启动线程 一个NSThread对象就代表一条线程 创建.启动线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(sel) object:nil]; [thread start];

工作线程数究竟要设置多少

一.需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍. “工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题. 二.共性认知 在进行进一步深入讨论之前,先以提问的方式就一些共性认知达成一致. 问:工作线程数是不是设置的越大越好? 答:肯定不是的 服务器CPU核数有

设置最佳线程数总结

看到一篇关于最佳线程数相关的文章,内容比较经典,不敢私藏,分享一下! 最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为什么要找最佳线程数 1.过多的线程只会造成,更多的内存开销,更多的CPU开销,但是对提升QPS确毫无帮助 2.找到最佳线程数后通过简单的设置,可以让web系统更加稳定,得到最高,最稳定的QPS输出 最佳线程数的获取: 1.通过用户

Tomcat设置最佳线程数总结

最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为什么要找最佳线程数 1.过多的线程只会造成,更多的内存开销,更多的CPU开销,但是对提升QPS确毫无帮助 2.找到最佳线程数后通过简单的设置,可以让web系统更加稳定,得到最高,最稳定的QPS输出 最佳线程数的获取: 1.通过用户慢慢递增来进行性能压测,观察QPS,响应时间 2.根据公式计算:服务器

赠送 HttpClient 和HttpURLConnection 的轻型网络 --》线程池介绍和网络请求流程

转载注明出处 :http://blog.csdn.net/codingandroid/article/details/41748743 作为一个框架,肯定要去处理一些比较复杂的情况,正常情况下当然不会阻塞,当情况比较复杂的时候,会出现前多个网络请求的情况,那对于这种情况我们规范去管理当然是最好的了,于是我们需要一个线程池. 首先解释一下,什么叫线程池  : 每当启动一个线程的时候,我们通常代码是   new Thead(){}.start();  new 一个对象 里面又要new一个runnab

网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据

1.网络请求怎么样和UI线程交互? 目前我的做法是,建立线程池管理网络请求线程,通过添加task来新增网络请求.所有的网络操作通过统一的request来实现,网络返回结果通过回调onError和onSuccess来实现对结果的处理(涉及到ui部分用runOnUiThread or handler通知ui更新,工程上两种都有,主要看你喜欢,不过用handler请注意内存泄露问题...) 这种做法好处就是,线程池可以避免不断开启线程导致虚耗资源,同时可以做到管理线程,自定义任务执行的顺序.统一req