IO/CPU密集型

服务器压力较大时,如何判断压力来源?如何进行优化?什么是IO密集型?啥是计算密集型?经过这篇了解一下架构设计时会遇到的性能分析的基础知识吧。html

基础知识

首先说明,IO密集 与 计算密集 为两个相对概念,这个得从冯·诺依曼计算机结构体系提及。算法

电子计算机基本结构图

运算器与控制器 又被称为中央处理器,即 CPU ( Center Process Unit )缓存

电子计算机操做流程图

存储器又可分为 内存与外存服务器

CPU, 存储器, 输入(I)、输出(O)设备等接口设备均经过 系统总线 链接在一块儿。网络

啥是系统总线?大学学习的时候,都会提到这个名词,仿佛它就是个概念而已,其实,系统总线(Bus),就能够粗略地理解为总线就是主板好了。多线程

在总线上通常有两个独立的单元不常在计算机原理中说起到,就是南、北桥芯片(即DIY时常说起的芯片组),具体的内容能够百科一下。架构

北桥芯片,离CPU最近,通常都贴有散热片,也称为主桥芯片(Host Bridge),通常来讲,芯片组的命名就是以北桥芯片的名称来命名的。主要负责总线上的高速设备好比AGP、PCI-e、内存等与CPU的数据高速交换。并发

南桥芯片,相对北桥芯片,离CPU较远,通常不会贴散热片。主要负责中低速外部设备好比USB、PCI、IDE、Sata、网卡等,芯片中集成了中断控制器、DMA控制器。负载均衡

因而可知,负责给CPU提供数据的在总线上,还有两个管家,一个大内总管(北桥),一个外掌柜(南桥)。函数

好的,弯子绕回来,说正题

如何断定

待完成…

I/O bound (I/O 读写密集型) 指的是系统的CPU效能相对硬盘/内存的效能要好不少,此时,系统运做,大部分的情况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CPU Loading 不高。


CPU bound (CPU 计算密集型) 指的是系统的 硬盘/内存 效能 相对 CPU 的效能 要好不少,此时,系统运做,大部分的情况是 CPU Loading 100%,CPU 要读/写 I/O (硬盘/内存),I/O在很短的时间就能够完成,而 CPU 还有许多运算要处理,CPU Loading 很高。

 

在多重程序系统中,大部份时间用来作计算、逻辑判断等CPU动做的程序称之CPU bound。例如一个计算圆周率至小数点一千位如下的程序,在执行的过程中。绝大部份时间用在三角函数和开根号的计算,即是属于CPU bound的程序。It is because the performance characteristic of most protocol codec implementations is CPU-bound, which is the same with I/O processor threads.

根据以上分析,能够认为一般状况下,大部分程序针对某个特定的性能metric而言,均可分为CPU bound 和 I/O bound两类。CPU bound的程序通常而言CPU占用率至关高。这多是由于任务自己不太须要访问I/O设备,也多是由于程序是多线程实现所以屏蔽掉了等待I/O的时间。而I/O bound的程序通常在达到性能极限时,CPU占用率仍然较低。这多是由于任务自己须要大量I/O操做,而pipeline作得不是很好,没有充分利用处理器能力。

 

如何优化

话说,网卡、硬盘都由南桥芯片控制,并属于中、低速设备,因此,在服务器上进行网络通信、网络传输、磁盘读写均受南桥控制,此类即为IO操做。IO密集型服务/业务便是以网络请求压力大、磁盘读写频繁的操做类型,当进行这些IO密集型操做时,CPU的负载相对较低(现代计算机均集成了对硬件访问控制的操做逻辑,使得CPU从这些操做中解放出来,提升核心资源的利用率)。

计算密集型,能够理解为在北桥芯片与CPU之间的通信较高的服务/业务,每每这类操做常见的都是以计算为主的,而计算又是CPU/GPU的专长,没据说过哪一个硬盘能够进行计算(固然,声卡或硬解压卡应该属于例外了,在南桥将媒体的数据流经过总线传递给声卡或是硬解压卡,而声卡和硬解压卡经过烧录在卡上的解码器进行硬件级别的编码处理,最终总处理后的数据流经过卡上的接口传给输出设备,好比声卡传递给音箱)。

对于服务器,经过开发的服务或是业务,能够在项目之初就根据需求来对资源进行预先估算,大体属于IO密集型仍是计算密集型的业务,并进行项目前期的资源预算等工做的开展,也包括前期的设计和后期的优化。

1. 项目立项过程当中,根据需求对应的资源负载类型,提出对服务资源的需求配置

IO密集型的需求,通常来讲,若是是磁盘读写频繁,经过对磁盘进行升级,提升磁盘的响应速度和传输效率或经过负载技术,将文件读写分散到多台服务器中;若是是网络请求负载较高,能够经过负载均衡技术,水平扩展服务,提升负载能力;或使用代理缓存服务器,下降核心服务的负载压力。

计算密集型的需求,首先能够考虑使用计算能力更好的CPU,而后考虑经过消息队列或其它降维算法,将计算分散的不一样的计算结点,进行处理。

2. 项目开发时,进行合理的规划和业务开发

对于IO密集型的需求,在开发过程当中,就要考虑尽量减小IO开销,对磁盘读写频繁的业务,能够考虑经过内存缓存将热数据缓存起来,减小磁盘的请求。

对于计算密集型的需求,在开发过程当中,须要注意计算算法的优化及结果重用,并尽量进行降维处理,好比经过某种算法将原业务需求的计算分散成可拆分的逻辑,并分散计算进行结果求解,最后进行组合(很像如今大数据处理里的一些模式,能够参考),或经过消息队列将大量的计算请求分发到其它的计算结点上去。

3. 项目上线后,对服务资源调配进得合理的优化

上线后对服务资源须要持续监控并根据业务推广和实际状况进行优化处理。

思路上致上也同上述状况。

总结

待处理的数据离CPU越近,处理越快。

启动线程数 = [ 任务执行时间 / ( 任务执行时间 - IO等待时间 ) ] x CPU内核数 最佳启动线程数 和 CPU内核数量 成正比,和IO阻塞时间成反比。 若是CPU计算型任务,那么线程数最多不超过CPU内核数,由于启动再多线程,CPU也来不及调度; 相反若是是任务须要等待磁盘操做(即IO密集型),网络响应,那么多启动线程有助于提升任务并发度,提升系统吞吐能力,改善系统性能。

引用参考

参考文档

扩展阅读

相关文章
相关标签/搜索