范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

阿里面试官问高并发下,你都怎么选择最优的线程数?

  为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及"过度切换"(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换) 。
  但是有一个很大的问题摆在我们面前,即我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程。那么在高并发的情况下,我们怎么选择最优的线程数量呢?选择原则又是什么呢?一、理论分析
  关于如何计算并发线程数,有两种说法。
  第一种,《Java Concurrency in Practice》即《java并发编程实践》8.2节 170页
  对于计算密集型的任务,一个有Ncpu个处理器的系统通常通过使用一个Ncpu + 1个线程的线程池来获得最优的利用率(计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个"额外"的线程,可以确保在这种情况下CPU周期不会中断工作)。
  对于包含了 I/O和其他阻塞操作的任务,不是所有的线程都会在所有的时间被调度,因此你需要一个更大的池。为了正确地设置线程池的长度,你必须估算出任务花在等待的时间与用来计算的时间的比率;这个估算值不必十分精确,而且可以通过一些监控工具获得。你还可以选择另一种方法来调节线程池的大小,在一个基准负载下,使用 几种不同大小的线程池运行你的应用程序,并观察CPU利用率的水平。
  给定下列定义:Ncpu = CPU的数量 Ucpu = 目标CPU的使用率, 0 <= Ucpu <= 1 W/C = 等待时间与计算时间的比率 为保持处理器达到期望的使用率,最优的池的大小等于: Nthreads = Ncpu x Ucpu x (1 + W/C)
  你可以使用Runtime来获得CPU的数目:
  int N_CPUS = Runtime.getRuntime().availableProcessors();
  当然,CPU周期并不是唯一你可以使用线程池管理的资源。其他可以约束资源池大小的资源包括:内存、文件句柄、套接字句柄和数据库连接等。计算这些类型资源池的大小约束非常简单:首先累加出每一个任务需要的这些资源的总童,然后除以可用的总量。所得的结果是池大小的上限。
  当任务需要使用池化的资源时,比如数据库连接,那么线程池的长度和资源池的长度会相互影响。如果每一个任务都需要一个数据库连接,那么连接池的大小就限制了线程池的有效大小;类似地,当线程池中的任务是连接池的唯一消费者时,那么线程池的大小反而又会限制了连接池的有效大小。
  如上,在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式:Nthreads = Ncpu x Ucpu x (1 + W/C),其中 Ncpu = CPU核心数 Ucpu = CPU使用率,0~1 W/C = 等待时间与计算时间的比率
  第二种,《Programming Concurrency on the JVM Mastering》即《Java 虚拟机并发编程》2.1节 12页
  为了解决上述难题,我们希望至少可以创建处理器核心数那么多个线程。这就保证了有尽可能多地处理器核心可以投入到解决问题的工作中去。通过下面的代码,我们可以很容易地获取到系统可用的处理器核心数:
  Runtime.getRuntime().availableProcessors();
  所以,应用程序的最小线程数应该等于可用的处理器核数。如果所有的任务都是计算密集型的,则创建处理器可用核心数那么多个线程就可以了。在这种情况下,创建更多的线程对程序性能而言反而是不利的。因为当有多个仟务处于就绪状态时,处理器核心需要在线程间频繁进行上下文切换,而这种切换对程序性能损耗较大。但如果任务都是IO密集型的,那么我们就需要开更多的线程来提高性能。
  当一个任务执行IO操作时,其线程将被阻塞,于是处理器可以立即进行上下文切换以便处理其他就绪线程。如果我们只有处理器可用核心数那么多个线程的话,则即使有待执行的任务也无法处理,因为我们已经拿不出更多的线程供处理器调度了。
  如果任务有50%的时间处于阻塞状态,则程序所需线程数为处理器可用核心数的两倍。如果任务被阻塞的时间少于50%,即这些任务是计算密集型的,则程序所需线程数将随之减少,但最少也不应低于处理器的核心数。如果任务被阻塞的时间大于执行时间,即该任务是IO密集型的,我们就需要创建比处理器核心数大几倍数量的线程。我们可以计算出程序所需线程的总数,总结如下:线程数 = CPU可用核心数/(1 - 阻塞系数),其中阻塞系数的取值在0和1之间。计算密集型任务的阻塞系数为0,而IO密集型任务的阻塞系数则接近1。一个完全阻塞的任务是注定要挂掉的,所以我们无须担心阻塞系数会达到1。
  为了更好地确定程序所需线程数,我们需要知道下面两个关键参数:处理器可用核心数;任务的阻塞系数;
  第一个参数很容易确定,我们甚至可以用之前的方法在运行时查到这个值。但确定阻塞系数就稍微困难一些。我们可以先试着猜测,抑或采用一些性能分析工具或java.lang.management API来确定线程花在系统IO操作上的时间与CPU密集任务所耗时间的比值。如上,在《Programming Concurrency on the JVM Mastering》一书中,给出了估算线程池大小的公式:
  线程数 = Ncpu /(1 - 阻塞系数)
  对于说法一,假设CPU 100%运转,即撇开CPU使用率这个因素,线程数 = Ncpu x (1 + W/C)。
  现在假设将方法二的公式等于方法一公式,即Ncpu /(1 - 阻塞系数)= Ncpu x (1 + W/C),推导出:阻塞系数 = W / (W + C),即阻塞系数 = 阻塞时间 /(阻塞时间 + 计算时间),这个结论在方法二后续中得到印证,如下:
  由于对Web服务的请求大部分时间都花在等待服务器响应上了,所以阻塞系数会相当高,因此程序需要开的线程数可能是处理器核心数的若干倍。假设阻塞系数是0.9,即每个任务90%的时间处于阻塞状态而只有10%的时间在干活,则在双核处理器上我们就需要开20个线程(使用第2.1节的公式计算)。如果有很多只股票要处理的话,我们可以在8核处理器上开到80个线程来处理该任务。
  由此可见,说法一和说法二其实是一个公式。二、实际应用
  那么实际使用中并发线程数如何设置呢?我们先看一道题目:
  假设要求一个系统的TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s。那么问题转化为:
  如何设计线程池大小,使得可以在1s内处理完20个Transaction?
  计算过程很简单,每个线程的处理能力为0.25TPS,那么要达到20TPS,显然需要20/0.25=80个线程。
  这个理论上成立的,但是实际情况中,一个系统最快的部分是CPU,所以决定一个系统吞吐量上限的是CPU。增强CPU处理能力,可以提高系统吞吐量上限。在考虑时需要把CPU吞吐量加进去。
  分析如下(我们以说法一公式为例):
  Nthreads = Ncpu x (1 + W/C)
  即线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。这就可以划分成两种任务类型:
  IO密集型 一般情况下,如果存在IO,那么肯定W/C > 1(阻塞耗时一般都是计算耗时的很多倍),但是需要考虑系统内存有限(每开启一个线程都需要内存空间),这里需要在服务器上测试具体多少个线程数适合(CPU占比、线程数、总耗时、内存消耗)。如果不想去测试,保守点取1即可,Nthreads = Ncpu x (1 + 1) = 2Ncpu。这样设置一般都OK。
  计算密集型 假设没有等待W = 0,则W/C = 0。Nthreads = Ncpu。
  根据短板效应,真实的系统吞吐量并不能单纯根据CPU来计算。那要提高系统吞吐量,就需要从"系统短板"(比如网络延迟、IO)着手:尽量提高短板操作的并行化比率,比如多线程下载技术;增强短板能力,比如用NIO替代IO;
  第一条可以联系到Amdahl定律,这条定律定义了串行系统并行化后的加速比计算公式:加速比 = 优化前系统耗时 / 优化后系统耗时 加速比越大,表明系统并行化的优化效果越好。Addahl定律还给出了系统并行度、CPU数目和加速比的关系,加速比为Speedup,系统串行化比率(指串行执行代码所占比率)为F,CPU数目为N:Speedup <= 1 / (F + (1-F)/N)
  当N足够大时,串行化比率F越小,加速比Speedup越大。
  这时候又抛出是否线程池一定比但线程高效的问题?
  答案是否定的,比如Redis就是单线程的,但它却非常高效,基本操作都能达到十万量级/s。从线程这个角度来看,部分原因在于:多线程带来线程上下文切换开销,单线程就没有这种开销;锁;
  当然"Redis很快"更本质的原因在于:
  Redis基本都是内存操作,这种情况下单线程可以很高效地利用CPU。而多线程适用场景一般是:存在相当比例的IO和网络操作。
  总的来说,应用情况不同,采取多线程/单线程策略不同;线程池情况下,不同的估算,目的和出发点是一致的。
  至此结论为:
  IO密集型 = 2Ncpu(可以测试后自己控制大小,2Ncpu一般没问题)(常出现于线程中:数据库数据交互、文件上传下载、网络数据传输等等)
  计算密集型 = Ncpu(常出现于线程中:复杂算法)
  当然说法一中还有一种说法:
  对于计算密集型的任务,一个有Ncpu个处理器的系统通常通过使用一个Ncpu + 1个线程的线程池来获得最优的利用率(计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个"额外"的线程,可以确保在这种情况下CPU周期不会中断工作)。
  即,计算密集型 = Ncpu + 1,但是这种做法导致的多一个CPU上下文切换是否值得,这里不考虑。读者可自己考量。

苹果为特定用户免费发特别版iPhone为iOS系统找Bug据悉,这批特殊版的iPhone会以免费赠送的形式进行,而能得到这些手机的用户,都是参与苹果公司仅限邀请漏洞奖励计划的安全研究人员。8月6日消息,据外媒报道称,苹果将为一批特殊的用户蓝城兄弟Q2财报总付费用户数同比增长58。18月24日,蓝城兄弟(NasdaqBLCT)发布了2021年第二季度财务报告。财报显示,总付费用户数增长58,会员服务收入翻了一番。在今天的一份声明中,这家亚洲最大的LGBTQ社区三星PM981a是970EVOplus的亲兄弟,价格少一半?Hello大家好,我是兼容机之家的小牛。三星作为闪存行业的龙头老大,其生产的固态硬盘自然也是位居第一梯队。三星的970EVOPLUS一直是其卖的最好的产品之一,带来了3500MBs苹果你是魔鬼吗?接下来iPhone发售考虑移除充电线等配件看到这样的消息,真的不仅想要说苹果你是魔鬼吗?今年iPhone12已经取消了充电头,而且在巴西法国地方已经遭到了抵制,甚至还要花费昂贵的费用代价去维系关系,还以为苹果能够收敛一点,办公娱乐两不误三星GalaxyTabS7双12种草当下,屏幕作为我们与互联网交互最频繁的媒介,几乎无时不刻地充斥在我们每一个现代人的生活中。如果说手机是我们的交流沟通中心电脑是我们的生产力与工作中心,那在屏幕尺寸方面介于两者之间的笑人不如人?三星前脚嘲笑苹果不送充电器,后脚新一代产品或效仿据10月28日报道,此前,苹果在iPhone12的发布会上表示,在新发布的iPhone12系列手机的包装盒中,将不再有充电器和Earpods,只会搭配一根充电线。这样名为环保实际抠雷蛇发布噬魂鲨专业版Xbox无线耳麦雷蛇为XBOX主机平台推出了噬魂鲨专业版Xbox无线耳麦,支持XBOXWIRELESS和蓝牙5。0无线连接。针对XBOXSERIESXS,通过XboxWireless享受直接低延迟市场白皮书浅谈国内安防监控视频技术的未来发展和机遇伴随着物联网AI智能数字化技术的发展与安防监控设备的提升,整个安防监控行业已经快速进入了网络监控时代。除了监控摄像机(枪机球机)硬盘录像机或电视墙等各样式的监控产品,核心的视频监控Python太好用了!AI初学者快速体验人脸检测为了迎合和满足现代化的市场需求,我们开发了支持提供多种协议设备接入的视频平台EasyCVR,前期我们做好了EasyCVR在视频能力上的各项铺垫,包括摄像头的云台控制语音对讲告警上报EasyGBSEasyCVR做视频直播,HLS和webrtc该如何选择?EasyGBS是TSINGSEE青犀视频开发较早较为成熟的一款国标GB28181流媒体服务平台,根据我们的开发基础,后期又开发了EasyCVR,相较EasyGBS,EasyCVR的新零售弯道超车AI人工智能在电商领域如何大展拳脚?在全球经济放缓电子商务冲击经营成本上涨这样一个大时代背景下,整个零售行业目前正在面临着重大的变革,数字化转型成为新零售发展的必然趋势,现阶段整个零售企业信息化建设投入是不足的,一方
广大的头条网友们,有没有特别推荐的电视剧啊,剧荒了?剧荒的拿走不谢。西部世界作为美剧里面的神剧之一,目前三部曲已经完结,可以开饭了。西部世界讲述的是一个成人乐园的故事。这个乐园里面的接待员全部是清一色的机器人,她们每天的工作就是提供新能源车的终极猜想Part3这次尝试说说能不能逆袭成功哈照例先放结论大概率是可以的。任务上是目前ZZ任务最正确的赛道我们肯定要掌握能源安全及自己真正的大规模工业的核心能力,而从发达国家的经验来看,汽车工业从来让你爱不释手的耳机推荐,网易云音乐氧气真无线mini版蓝牙耳机大家周末好,今天我为大家推荐一款非常富有色彩气息的无线蓝牙耳机,它小巧精致的外形,实在是太吸引女生的眼球了。下面我就给大家介绍一下这款耳机这款耳机一共有四个颜色,纯情白,典雅黑,热老iPhone有救了,把地区改为法国就流畅多了?我3台苹果都试了这两天,网上突然传出一个说法,说老iPhone,只要进行一项简单操作后,把iPhone的地区改为法国后,流畅度立马提升,甚至不输iPhone12。而我手中正好有多年的iPhone7警惕!巴西近半金字塔骗局与比特币等加密货币相关南美侨报网编译张裕9月8日报道多年来,巴西金字塔诈骗(层压式推销或者层压式传销)案件数量的增长引起了国内重要监管机构的注意,其中包括负责对证券市场进行监督并惩罚不守规则者的证券委员中国为什么造不出打印机?关键技术被美日垄断,华为正在努力突破华为向美日打印机巨头发起挑战,正式进军打印机市场,将推出自家打印机,并搭配鸿蒙系统,打印机一直以来都被日本和美国垄断,中国为什么造不出好的打印机?在这个领域受制于人?那么我们所熟悉反击开始!不只是华为,OPPO也出手了本文原创,请勿抄袭和搬运,违者必究华为积极参与5G网络市场布局,但是在展开布局的同时,也遭到许多变数。诸多国家站在同一立场,和美国同流合污。但华为没有低头,反而起诉美国运营商专利侵从微云台到自研芯片,vivo影像再进步9月7日消息,今天,vivo官方微博发布了一张记录vivoX系列影像发展的长图,在图片中可以看到,从2014年开始,vivo就在Xshot系列中发力影像,作为国内第一款f1。8光圈宝马加速推进电动化转型,专利价值高于同行平均水平近日,有媒体报道称,宝马在今年加大了购买电池订单,总金额高达约240亿美元,创下了近30年以来的新高。此外,宝马计划于明年开始在产品上采用全新一代电池。公司CEO奥利弗齐普斯表示,如何从零开始学习做互联网运营,互联网运营四种入门方法学习互联网运营,先要了解什么是互联网行业。互联网行业的业务就是软件开发,你可以理解为互联网行业就是软件行业,那么互联网运营就是软件运营,这样就很容易理解自己要学习的是什么了?01互是什么原因让你一定要用iPhone?就喜欢拿在手里手感不错,用起来让人爱不释手的手机,而这也就是让我选择iPhone手机的原因!已入手iPhone12作为一个忠实的iPhone用户,首先列出一些平时经常用到的功能1按