线程数究竟设多少合理要领.pdfVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程数究竟设多少合理 ⼀、需求缘起 Web-Server通常有个配置,最⼤⼯作线程数,后端服务⼀般也有个配置,⼯作线程池 的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有 业务设置为 CPU核数的2倍,有 业务设置为CPU核数的8倍,有 业务设置为CPU核数的32倍。 “⼯作线程数”的设置依据是什么,到底设置为多少能够最⼤化CPU性能,是本⽂要讨 论的问题。 ⼆、⼀些共性认知 在进⾏进⼀步深⼊讨论之前,先以提问的⽅式就⼀ 共性认知达成⼀致。 提问:⼯作线程数是 是设置的越⼤越好? 回答:肯定不是的 1)⼀来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个⼯ 作线程没有意义 2 )线程切换是有开销的,如果线程切换过于频繁,反⽽会使性能降低 提问:调⽤sleep()函数的时候,线程是否⼀直占⽤CPU? 回答:不占⽤,等待时会把CPU让出来,给其他需要CPU资源的线程使⽤ 不⽌调⽤sleep()函数,在进⾏⼀ 阻塞调⽤,例如⽹络编程中的阻塞accept() 【等待客 户端连接】和阻塞recv() 【等待下游回包】也不占⽤CPU资源 提问:如果CPU是单核,设置多线程有意义么,能提⾼并发性能么? 回答:即使是单核,使⽤多线程也是有意义的 1)多线程编码可以让我们的服务/代码更加清晰,有 IO线程收发包,有 Worker线 程进⾏任务处理,有 T meout线程进⾏超时检测 2 )如果有⼀个任务⼀直占⽤CPU资源在进⾏计算,那么此时增加线程并不能增加并 发,例如这样的⼀个代码 wh le(1){ ++; } 该代码⼀直不停的占⽤CPU资源进⾏计算,会使CPU 占⽤率达到100% 3 )通常来说,Worker线程⼀般不会⼀直占⽤CPU进⾏计算,此时即使CPU是单核, 增加Worker线程也能够提⾼并发,因为这个线程在休息的时候,其他的线程可以继续 ⼯作 三、常见服务线程模型 了解常见的服务线程模型,有助于理解服务并发的原理,⼀般来说互联⽹常见的服务 线程模型有如下两种 IO线程与⼯作线程通过队列解耦类模型 如上图,⼤部分Web-Server与服务框架都是使⽤这样的⼀种“IO线程与Worker线程通 过队列解耦”类线程模型: 1)有少数⼏个IO线程监听上游发过来的请求,并进⾏收发包 (⽣产者) 2 )有⼀个或者多个任务队列,作为IO线程与Worker线程异步解耦的数据传输通道 (临界资源) 3 )有多个⼯作线程执⾏正真的任务 (消费者) 这个线程模型应⽤很⼴,符合⼤部分场景,这个线程模型的特点是,⼯作线程内部是 同步阻塞执⾏任务的 (回想⼀下tomcat线程中是怎么执⾏Java程序的,dubbo⼯作线程 中是怎么执⾏任务的),因此可以通过增加Worker线程数来增加并发能⼒,今天要讨 论的重点是“该模型Worker线程数设置为多少能达到最⼤的并发” 。 纯异步线程模型 任何地⽅都没有阻塞,这种线程模型只需要设置很少的线程数就能够做到很⾼的吞吐 量,L ghttpd有⼀种单进程单线程模式,并发处理能⼒很强,就是使⽤的的这种模 型。该模型的缺点是: 1)如果使⽤单线程模式,难以利⽤多CPU多核的优势 2 )程序员更习惯写同步代码,callback 的⽅式对代码的可读性有冲击,对程序员的要 求也更⾼ 3 )框架更复杂,往往需要server端收发组件,server端队列,cl ent端收发组件,cl ent 端队列,上下⽂管理组件,有限状态机组件,超时管理组件的⽀持 however ,这个模型不是今天讨论的重点。 四、⼯作线程的⼯作模式 了解⼯作线程的⼯作模式,对量化分析线程数的设置⾮常有帮助: 上图是⼀个典型的⼯作线程的处理过程,从开始处理start到结束处理end ,该任务的处 理共有7个步骤: 1)从⼯作队列⾥拿出任务,进⾏⼀ 本地初始化计算,例如http协议分析、参数解 析、参数校验等 2 )访问cache拿⼀ 数据 3 )拿到cache⾥的数据后,再进⾏⼀ 本地计算,这 计算和业务逻辑相关 4 )通过RPC调⽤下游service再拿⼀ 数据,或者让下游serv ce去处理⼀ 相关的任务 5 )RPC调⽤结束后,再进⾏⼀ 本地计算,怎么计算和业务逻辑相关 6 )访问DB进⾏⼀ 数据操作 7 )操作完数据库之后做⼀ 收尾⼯作,同样这 收尾⼯作也是本地计算,和业务逻 辑相关 分析整个处理的时间轴,会发现: 1)其中1,3 ,5 ,7步骤中 【上图中粉⾊时间轴】,线程进⾏本地业务逻辑计算时需 要占

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档