|
多线程的系统开发需要这几个东东:
任务执行单元(Worker):每个CPU逻辑内核分配一个线程用于执行任务,通常取60%-70%的核心数用来分配执行单元 ,如果核心数总数小于等于4核,有的软件是分配全部核心使用,有的服务端软件为了稳定只分配2-3个核心,至少留下一个核心使用。这部分单元在执行任务时是大量占用核心资源,而等待任务时就只使用少量核心资源;
任务分配单元(我忘了英文咋说了):如果是持续执行任务的话,需要10%-15%的核心数用来做任务调度单元,需要将任务拆解打包分给前面的任务执行单元,同时将任务执行结果打包反馈,这部分单元只有在拆解任务和结果打包反馈时才会占用一定量的核心资源,其余时间都是处于等待状态,;
有的系统做得细致的话,又将任务分配单元细化,分解任务的单元和打包任务的单元分开设计。
一个多进程任务的系统很难100%地把全部CPU核心做到恰好吃光的,即使超负荷任务也不行,设计师需要仔细调教有多少个核心来参与任务分解、打包,有多少个核心来参与任务执行,做到这几个单元一起协同工作,这就需要各种场景的算法支撑了。
简单的压缩解压缩场景下,也许半个到核心执行任务分解和打包就够了,其余30个全部参与计算;
而网络环境下怎么分解打包我不懂,但我知道这很复杂,复杂到仅靠简单一两套算法是不够的,能尽量充分利用核心数来实现最大负载而不浪费资源,各家网络公司都有各自的专利,而路由系统索要的首先是稳定,然后才是负载,我想为了这个目的,设计师还是会浪费掉一些核心来达成稳定性的,至于浪费多少,就看该公司的技术功底了。从第一台多路CPU的电脑出现开始至今,有一点是无法打破的,越复杂的任务,越难把内核数量和资源吃光,吃得多的都是牛X大神,也只有像WinRAR这种简单场景可以把所有内核用光。
前面我说的Oracle的资源分配实际是一个经验值,60%也许不是最好,但是相对稳定的,为了提升性能将其分配到70%也可以,但实际使用场景下一是很少有用满这70%的,二是Oracle里任务调度分解使用的核心数也不会少,它是满足多用户使用的前提,具体问题具体分析,你的路由器资源分配在网络层面上我不懂,我只是从我了解的多CPU任务系统开发环境上给出看法,建议都算不上,因为这里头要估算的核心数分配在各个场景下完全不同。
另外一点我看了截图,总消耗大约在50%上下,估摸着应该是默认的开启超线程技术(Hyper Threading)。40个CPU就是40个物理内核,而是把20个物理内核资源用自己的技术提供出40个逻辑内核,Intel这么设计实际就是为了多内核任务调度做优化的考量,因为许多场景下任务调度和计算很少能出现持续把某个内核全部吃光的,偶尔会出现一下峰值可以忽略,当然如果时纯计算场景,比如计算超大质因数,这时候把超线程关掉反而更快,因为这种场景纯粹就是算,关掉HT可以完整把内核用满。 |
|