线程数,512是否合理?

news2025/3/2 1:23:00

Web-Server有个配置,工作线程数。

Service一般也有个配置,工作线程数。

经验丰富的架构师,懂得如何配置这些参数,使得系统的性能达到最优:有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。

“线程数”的设置依据,是本文要讨论的问题。

工作线程数是不是设置的越大越好?

答案显然是否定的:

(1)服务器CPU核数有限,能够同时并发的线程数有限,单核CPU设置1000个工作线程没有意义;

(2)线程切换有开销,如果线程切换过于频繁,反而会使性能降低;

调用sleep()函数的时候,线程是否一直占用CPU?

不占用,休眠时会把CPU让出来,给其他需要CPU资源的线程使用。

不止sleep,一些阻塞调用,例如网络编程中的:

(1)阻塞accept(),等待客户端连接;

(2)阻塞recv(),等待下游回包;

都会让出CPU资源。

单核CPU,设置多线程有意义么?

单核CPU,设置多线程能否提高并发性能?

即使是单核,使用多线程也是有意义的,大多数情况也能提高并发:

(1)多线程编码可以让代码更加清晰,例如:IO线程收发包,Worker线程进行任务处理,Timeout线程进行超时检测;

(2)如果有一个任务一直占用CPU资源在进行计算,此时增加线程并不能增加并发,例如以下代码会一直占用CPU,并使得CPU占用率达到100%:

 while(1){ i++; }

(3)通常来说,Worker线程一般不会一直占用CPU进行计算,此时即使CPU是单核,增加Worker线程也能够提高并发,因为这个线程在休息的时候,其他的线程可以继续工作;

常见服务线程模型有几种?

了解常见的服务线程模型,有助于理解服务并发的原理,一般来说互联网常见的服务线程模型有两种:

(1)IO线程与工作线程通过任务队列解耦;

(2)纯异步;

第一种,IO线程与工作线程通过队列解耦类模型。

b8aa93b9a7419d3fc8f13b491d53a94f.jpeg
如上图,大部分Web-Server与服务框架都是使用这样的一种“IO线程与Worker线程通过队列解耦”类线程模型:

(1)有少数几个IO线程监听上游发过来的请求,并进行收发包(生产者);

(2)有一个或者多个任务队列,作为IO线程与Worker线程异步解耦的数据传输通道(临界资源);

(3)有多个工作线程执行真正的任务(消费者);

这个线程模型应用很广,符合大部分场景,这个线程模型的特点是,工作线程内部是同步阻塞执行任务的,因此可以通过增加Worker线程数来增加并发能力,今天要讨论的重点是“该模型Worker线程数设置为多少能达到最大的并发”。

第二种,纯异步线程模型。

没有阻塞,这种线程模型只需要设置很少的线程数就能够做到很高的吞吐量,该模型的缺点是:

(1)如果使用单线程模式,难以利用多CPU多核的优势;

(2)程序员更习惯写同步代码,callback的方式对代码的可读性有冲击,对程序员的要求也更高;

(3)框架更复杂,往往需要server端收发组件,server端队列,client端收发组件,client端队列,上下文管理组件,有限状态机组件,超时管理组件的支持;

however,这个模型不是今天讨论的重点。

第一类“IO线程与工作线程通过队列解耦”类线程模型,工作线程的工作模式是怎么样的?

了解工作线程的工作模式,对量化分析线程数的设置非常有帮助:

2605433f7e82ad6f4223c6150e3a5d35.png
上图是一个典型的工作线程的处理过程,从开始处理start到结束处理end,该任务的处理共有7个步骤:

(1)从工作队列里拿出任务,进行一些本地初始化计算,例如http协议分析、参数解析、参数校验等;

(2)访问cache拿一些数据;

(3)拿到cache里的数据后,再进行一些本地计算,这些计算和业务逻辑相关;

(4)通过RPC调用下游service再拿一些数据,或者让下游service去处理一些相关的任务;

(5)RPC调用结束后,再进行一些本地计算,怎么计算和业务逻辑相关;

(6)访问DB进行一些数据操作;

(7)操作完数据库之后做一些收尾工作,同样这些收尾工作也是本地计算,和业务逻辑相关;

分析整个处理的时间轴,会发现:

(1)其中1,3,5,7步骤中(上图中粉色时间轴),线程进行本地业务逻辑计算时需要占用CPU;

(2)而2,4,6步骤中(上图中橙色时间轴),访问cache、service、DB过程中线程处于一个等待结果的状态,不需要占用CPU,进一步的分解,这个“等待结果”的时间共分为三部分:

2.1)请求在网络上传输到下游的cache、service、DB;

2.2)下游cache、service、DB进行任务处理;

2.3)cache、service、DB将报文在网络上传回工作线程;

如何量化分析,并合理设置工作线程数呢?

通过上面的分析,Worker线程在执行的过程中:

(1)有一部计算时间需要占用CPU;

(2)另一部分等待时间不需要占用CPU;

通过量化分析,例如打日志进行统计,可以统计出整个Worker线程执行过程中这两部分时间的比例,例如:

(1)执行计算,占用CPU的时间(粉色时间轴)是100ms;

(2)等待时间,不占用CPU的时间(橙色时间轴)也是100ms;

得到的结果是,这个线程计算和等待的时间是1:1,即有50%的时间在计算(占用CPU),50%的时间在等待(不占用CPU):

(1)假设此时是单核,则设置为2个工作线程就可以把CPU充分利用起来,让CPU跑到100%;

(2)假设此时是N核,则设置为2N个工作现场就可以把CPU充分利用起来,让CPU跑到N*100%;

当当当当!!!

结论来了

N核服务器,通过执行业务的单线程分析出本地计算时间为x,等待时间为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化。

一般来说,非CPU密集型的业务(加解密、压缩解压缩、搜索排序等业务是CPU密集型的业务),瓶颈都在后端数据库访问或者RPC调用,本地CPU计算的时间很少,所以设置几十或者几百个工作线程是能够提升吞吐量的。

学废了吗?

架构师之路-分享技术思路

相关文章:

《线上问题排查,这些命令你一定用得到!》

《CPU100%,怎么快速定位?》

《顶尖的人都是怎么想的!(很残酷)》

思考题

贵司线程数设置为多少?

画外音:随手设了一个200?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sringboot2整合shiro实现登录认证和记住我功能

Sringboot2整合shiro实现及登录认证和记住我 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生…

resolution-robust large mask inpainting with fourier convolutions

Resolution-robust Large Mask Inpainting with Fourier Convolutions(2021)_studyeboy的博客-CSDN博客_分辨率稳健的大掩膜修复[Paper] Resolution-robust Large Mask Inpainting with Fourier Convolutions(2021)[Code]saic-mdal/lama基于傅里叶卷积的分辨率稳健的大型掩码修…

数据结构之排序【归并排序和快排的顶级优化和快排的三种原理的实现及分析】 内含动态演示图

文章目录引言:1.归并排序(MergeSort)2.快速排序的优化(顶级优化)3.快速排序的三种思路的代码实现及分析4.归并排序和快排第3原理的测试引言: 刚刚去回顾了一下递归实现的几个小代码,感觉递归真的是很神奇的一个东西&a…

C# StringBuilder

StringBuilder位于命名空间System.Text下,使用前需引入 using System.Text; StringBuilder的构造 new StringBuilder(string value) StringBuilder sb1 new StringBuilder("www.abc.com"); 利用构造函数创建一个值为“www.abc.com”的StringBuilder…

解决Ubuntu不能上网以及无法远程连接Ubuntu

本文环境 物理机OS: Windows10 专业版 虚拟机平台: VMware Workstation 16 Pro 虚拟机OS: Ubuntu 20.04 相信大家在使用Ubuntu中也有遇到不能上网,我也是尝试了很多的方法都不行,终于找到了一种可行的方法。 步骤…

测试开发应该具备的六大能力

前言 前几天一个前同事找我聊了个问题:一个好的测试开发同学需要具备哪些能力?我思考了一下,给了他如下答复: 从我工作中接触到的测试开发,以及面试测试开发候选人时问的问题,我将自己对测试开发这个岗位…

Chrome插件开发

1.什么是 Chrome 插件 谷歌浏览器插件是一种小型的定制浏览器体验的程序,通过插件可以自定义浏览器的一些行为来适合个人的需求,例如上面的查看服务器状态插件。 在应用商店中下载下来的插件基本上都是以.crx 为文件后缀,该文件其实就是一个…

实验一 课本第三章MongoDB数据库操作3.1-3.7

一、实验目的: 掌握MongoDb的部署 熟悉数据库和集合操作 二、实验环境: 一台运行的计算机 Linux平台 SecureCRT平台 三、实验内容: 3.1MongoDB部署 1.MongonDb部署(windows平台) (1)下载Mongo…

Node环境安装

Node的版本管理工具工具介绍gnvm官网指出特色的地方安装验证配置与使用配置文件内容命令使用nvm安装脚本命令下载请求文件下载验证配置文件使用n安装使用Fast Node Manager (fnm)安装使用工具介绍 本文介绍四款 Node 版本管理工具,用于下载和切换对应的 Node 与 Npm…

【金猿人物展】极盾科技CEO丁杨:让数据安全回归场景、业务和价值

‍丁杨本文由极盾科技CEO丁杨撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业我们的数据安全,还是以前的安全么?传统数据安全方案依赖网络和数据库安全能力进行围…

2022年安徽建筑八大员(标准员)考试试题及答案

百分百题库提供建筑八大员(标准员)考试试题、建筑八大员(标准员)考试真题、建筑八大员(标准员)证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 22.某设计单位对承接…

Vue2.x + Echarts实现知识图谱数据渲染

代码案例数据写死了&#xff0c;后端Java可使用SpringBootNeo4j查询数据返回。 <template><div id"myChart"></div> </template><style> #myChart {width: 100%;height: 1000px; } </style> <script>export default {nam…

视频号小店是什么?如何开通视频号小店API?

微信视频号于2022年7月正式推出“视频号小店“服务&#xff0c;为商家提供商品信息服务、商品交易&#xff0c;支持商家在视频号运营电商。目前视频号小店有个体工商户或企业资质的商家进行开店&#xff0c;企业店需要企业营业执照认证、个体工商户则需要个体工商户营业执照认证…

Android设计模式详解之模板方法模式

前言 定义&#xff1a;定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤&#xff1b; 使用场景&#xff1a; 多个子类有公有的方法&#xff0c;并且逻辑基本相同时&#xff1b;…

Linux环境下挂载外接硬盘

一. 前言 调试ARTIK过程中&#xff0c;首次外接硬盘不会自动挂载&#xff0c;需要将硬盘挂载到系统文件夹下方能读取硬盘内容&#xff0c;因此对于Ubuntu系统下挂载硬盘和开机自动挂载外接硬盘配置的方法进行总结。 二. 挂载外接硬盘步骤 通过命令 fdisk -l 查看硬盘资源信息…

Hive+Spark离线数仓工业项目--ODS层及DWD层构建(2)

ODS层构建&#xff1a;代码导入 目标&#xff1a;实现Python项目代码的导入及配置 实施 Oracle本地驱动目录**&#xff1a;将提供的**instantclient_12_2**目录放入D盘的根目录下 PyHive本地连接配置&#xff1a;将提供的CMU目录放入C盘的根目录下 auto_create_hive_table包…

Java中的Map集合体系

Map集合体系Map集合的概述Map集合体系特点Map集合常用APIMap集合的遍历方式&#xff1a;方式一&#xff1a;键找值方式二&#xff1a;键值对方式三&#xff1a;lambda表达式Map集合的实现类HashMapMap集合的实现类TreeMap集合嵌套Map集合的概述 Map集合概述和使用&#xff1a;…

Java 基础:变量、操作符、代码块和控制流

目录 一、变量&#xff1a;Variables 1、基本数据类型 2、数组 二、操作符/运算符 Operators 三、表达式、语句和代码块 四、程序控制流 一、变量&#xff1a;Variables Java 定义了以下几种变量&#xff1a; 实例变量/成员变量&#xff08;非静态字段&#xff09;&…

Docker+NETCore系列文章(五、推送自制镜像到Docker Hub、阿里云镜像仓库)

推送镜像到Docker Hub镜像仓库 1、访问Docker Hub&#xff1a;https://hub.docker.com/&#xff0c;注册并登陆Docker。 2、使用docker pull hello-world命令拉取hello-workld镜像。 [rootVM-0-6-centos ~]# docker pull hello-world Using default tag: latest latest: Pul…

微服务架构 VS 单体架构

在软件行业&#xff0c;微服务架构是一种重要的发展趋势。这一趋势&#xff0c;不仅仅是对企业内的IT信息系统建设&#xff0c;甚至在企业向数字化转型方面&#xff0c;都有着深远的影响。微服务架构与传统的单体软件架构代表着IT产业处理软件开发方式的一个根本性转变&#xf…