网络分流器-网络分流器-多核编程的几个难题及其应对策略

网络分流器-网络分流器-多核编程的几个难题及其应对策略!

戎腾网络: 随着多核CPU的出世,多核编程方面的问题将摆上了程序员的日程,有许多老的程序员以为早就有多CPU的机器,业界在多CPU机器上的编程已经积累了很多经验,多核CPU上的编程应该差不多,只要借鉴以前的多任务编程、并行编程和并行算法方面的经验就足够了。

我想说的是,像涉及到网络分流器采集器功能的多核处理板业内统称为业务处理板,而多核机器和以前的多CPU机器有很大的不同,以前的多CPU机器都是用在特定领域,比如服务器,或者一些可以进行大型并行计算的领域,这些领域很容易发挥出多CPU的优势,而现在多核机器则是应用到普通用户的各个层面,特别是客户端机器要使用多核CPU,而很多客户端软件要想发挥出多核的并行优势恐怕没有服务器和可以进行大型并行计算的特定领域简单!
网络分流器

串行化方面的难题

1)加速系数

衡量多处理器系统的性能时,通常要用到的一个指标叫做加速系数,定义如下:

S(p) = 使用单处理器执行时间(最好的顺序算法)/ 使用具有p个处理器所需执行时间

2)阿姆尔达定律

并行处理时有一个阿姆尔达定律,用方程式表示如下:

S(p) = p / (1 + (p-1)*f)

其中 S(p)表示加速系数

p表示处理器的个数

f表示串行部分所占整个程序执行时间的比例

当f = 5%, p = 20时, S(p) = 10.256左右

当f = 5%, p = 100时, S(p) = 16.8左右

也就是说只要有5%的串行部分,当处理器个数从20个增加到100个时,加速系数只能从10.256增加到16.8左右,处理器个数增加了5倍,速度只增加了60%多一点。即使处理器个数增加到无穷多个,加速系数的极限值也只有20。

如果按照阿姆尔达定律的话,可以说多核方面几乎没有任何发展前景,即使软件中只有1%的不可并行化部分,那么最大加速系统也只能到达100,再多的CPU也无法提升速度性能。按照这个定律,可以说多核CPU的发展让摩尔定律延续不了多少年就会到达极限。

3)Gustafson定律

Gustafson提出了和阿姆尔达定律不同的假设来证明加速系数是可以超越阿姆尔达定律的限制的,Gustafson认为软件中的串行部分是固定的,不会随规模的增大而增大,并假设并行处理部分的执行时间是固定的(服务器软件可能就是这样)。Gustafson定律用公式描述如下:

S(p) = p + (1-p)*fts

其中fts表示串行执行所占的比例

如果串行比例为5%,处理器个数为20个,那么加速系数为20+(1-20)*5%=19.05

如果串行比例为5%,处理器个数为100个,那么加速系数为100+(1-100)*5%=95.05

Gustafson定律中的加速系数几乎跟处理器个数成正比,如果现实情况符合Gustafson定律的假设前提的话,那么软件的性能将可以随着处理个数的增加而增加。

4)实际情况中的串行化分析

阿姆尔达定律和Gustafson定律的计算结果差距如此之大,那么现实情况到底是符合那一个定律呢?我个人认为现实情况中既不会象阿姆尔达定律那么悲观,但也不会象Gustafson定律那么乐观。为什么这样说呢?还是进行一下简单的分析吧。

首先需要确定软件中到底有那么内容不能并行化,才能估计出串行部分所占的比例,20世纪60年代时,Bernstein就给出了不能进行并行计算的三个条件:

条件1:C1写某一存储单元后,C2读该单元的数据。称为“写后读”竞争

条件2:C1读某一存储单元数据后,C2写该单元。称为“读后写”竞争

条件1:C1写某一存储单元后,C2写该单元。称为“写后写”竞争

满足以上三个条件中的任何一个都不能进行并行执行。不幸的是在实际的软件中大量存在满足上述情况的现象,也就是我们常说的共享数据要加锁保护的问题。

加锁保护导致的串行化问题如果在任务数量固定的前提下,串行化所占的比例是随软件规模的增大而减小的,但不幸的是它会随任务数量的增加而增加,也就是说处理器个数越多,锁竞争导致的串行化将越严重,从而使得串行化所占的比例随处理器个数的增加而急剧增加。(关于锁竞争导致的串行化加剧情况我会在另一篇文章中讲解)。所以串行化问题是多核编程面临的一大难题。

5)可能的解决措施

对于串行化方面的难题,首先想到的解决措施就是少用锁,甚至采用无锁编程,不过这对普通程序员来说几乎是难以完成的工作,因为无锁编程方面的算法太过于复杂,而且使用不当很容易出错,许多已经发表到专业期刊上的无锁算法后来又被证明是错的,可以想象得到这里面的难度有多大。

第二个解决方案就是使用原子操作来替代锁,使用原子操作本质上并没有解决串行化问题,只不过是让串行化的速度大大提升,从而使得串行化所占执行时间比例大大下降。不过目前芯片厂商提供的原子操作很有限,只能在少数地方起作用,芯片厂商在这方面可能还需要继续努力,提供更多功能稍微强大一些的原子操作来避免更多的地方的锁的使用。

第三个解决方案是从设计和算法层面来缩小串行化所占的比例。也许需要发现实用的并行方面的设计模式来缩减锁的使用,目前业界在这方面已经积累了一定的经验,如任务分解模式,数据分解模式,数据共享模式,相信随着多核CPU的大规模使用将来会有更多的新的有效的并行设计模式和算法冒出来。

第四个解决方案是从芯片设计方面来考虑的,由于我对芯片设计方面一无所知,所以这个解决方案也许只是我的一厢情愿的猜想。主要的想法是在芯片层面设计一些新的指令,这些指令不 象以前单核CPU指令那样是由单个CPU完成的,而是由多个CPU进行并行处理完成的一些并行指令,这样程序员调用这些并行处理指令编程就象编写串行化程序一样,但又充分利用上了多个CPU的优势。

负载平衡问题!众所周知,网络分流器常用的功能就是负载均衡!

多核编程中的锁竞争难题 这篇文章中讲过一个多核编程中的串行化的难题,这篇文章中再来讲解一下多核编程中的另外一个难题,就是负载平衡方面的难题。

多核CPU中,要很好地发挥出多个CPU的性能的话,必须保证分配到各个CPU上的任务有一个很好的负载平衡。否则一些CPU在运行,另外一些CPU处于空闲,无法发挥出多核CPU的优势来。

要实现一个好的负载平衡通常有两种方案,一种是静态负载平衡,另外一种是动态负载平衡。

1、静态负载平衡

静态负载平衡中,需要人工将程序分割成多个可并行执行的部分,并且要保证分割成的各个部分能够均衡地分布到各个CPU上运行,也就是说工作量要在多个任务间进行均匀的分配,使得达到高的加速系数。

静态负载平衡问题从数学上来说是一个NP完全性问题,Richard M. Karp, Jeffrey D. Ullman, Christos H. Papadimitriou, M. Garey, D. Johnson等人相继在1972年到1983年间证明了静态负载问题在几种不同约束条件下的NP完全性。

虽然NP完全性问题在数学上是难题,但是这并不是标题中所说的难题,因为NP完全性问题一般都可以找到很有效的近似算法来解决。

2、动态负载平衡

动态负载平衡是在程序的运行过程中来进行任务的分配达到负载平衡的目的。实际情况中存在许多不能由静态负载平衡解决的问题,比如一个大的循环中,循环的次数是由外部输入的,事先并不知道循环的次数,此时采用静态负载平衡划分策略就很难实现负载平衡。

动态负载平衡中对任务的调度一般是由系统来实现的,程序员通常只能选择动态平衡的调度策略,不能修改调度策略,由于实际任务中存在很多的不确定因素,调度算法无法做得很优,因此动态负载平衡有时可能达不到既定的负载平衡要求。


网络分流器

3、负载平衡的难题在 那 里?

负载平衡的难题并不在于负载平衡的程度要达到多少,因为即使在各个CPU上分配的任务执行时间存在一些差距,但是随着CPU核数的增多总能让总的执行时间下降,从而使加速系数随CPU核数的增加而增加。

负载平衡的困难之处在于程序中的可并行执行块很多要靠程序员来划分,当然CPU核数较少时,比如双核或4核,这种划分并不是很困难。但随着核数的增加,划分的粒度将变得越来越细,到了16核以上时,估计程序员要为如何划分任务而抓狂。比如一段顺序执行的代码,放到128核的CPU上运行,要手工划分成128个任务,其划分的难度可想而知。

负载划分的误差会随着CPU核数的增加而放大,比如一个需要16个时间单位的程序分到4个任务上执行,平均每个任务上的负载执行时间为4个时间单位,划分误差为1个时间单位的话,那么加速系数变成 16/(4+1)=3.2,是理想情况下加速系数 4的80%。但是如果放到一个16核CPU上运行的话,如果某个任务的划分误差如果为0.5个时间单位的话,那么加速系数变成16/(1+0.5) = 10.67,只有理想的加速系数16的66.7%,如果核数再增加的话,由于误差的放大,加速系数相比于理想加速系数的比例还会下降。

负载划分的难题还体现在CPU和软件的升级上,比如在4核CPU上的负载划分是均衡的,但到了8核、16核上,负载也许又变得不均衡了。软件升级也一样,当软件增加功能后,负载平衡又会遭到破坏,又需要重新划分负载使其达到平衡,这样一来软件设计的难度和麻烦大大增加了。

如果使用了锁的话,一些看起来是均衡的负载也可能会由于锁竞争变得不平衡起来,详细情况请查查相关的资料,不是什么大问题! 网络分流器

4、负载平衡的应对策略

对于运算量较小的软件,即使放到单核CPU上运行速度也很快,负载平衡做得差一些并没有太大影响,实际中负载平衡要考虑的是大运算量和规模很大的软件,这些软件需要在多核上进行负载平衡才能较好地利用多核来提高性能。

对于大规模的软件,负载平衡方面采取的应对策略是发展划分并行块的宏观划分方法,从整个软件系统层面来进行划分,而不是象传统的针对某些局部的程序和算法来进行并行分解,因为局部的程序通常都很难分解成几十个以上的任务来运行。

另外一个应对策略是在工具层面的,也就是编译工具能够协助人工进行并行块的分解,并找出良好的分解方案来,这方面Intel已经作出了一些努力,但是还需要更多的努力让工具的功能更强大一些才能应对核数较多时的情况。

多核编程中的锁竞争问题

在前一篇讲解多核编程的几个难题及其对策(难题一)的文章中提到了锁竞争会让串行化随CPU的核数增多而加剧的现象,这篇文章就来对多核编程的锁竞争进行深入的分析。

为了简化起见,我们先看一个简单的情况,假设有4个对等的任务同时启动运行,假设每个任务刚开始时有一个需要锁保护的操作,耗时为1,每个任务其他部分的耗时为25。这几个任务启动运行后的运行情况如下图所示: 此处的图片有保留,未公布!

网络分流器ATCA6槽位和14槽位
在上图中,可以看出第1个任务直接执行到结束,中间没有等待,第2个任务等待了1个时间单位,第3个任务等待了2个时间单位,第3个任务等待了3个时间单位。

这样有3个CPU总计等待了6个时间单位,如果这几个任务是采用OpenMP里的所有任务都在同一点上进行等待到全部任务执行完再向下执行时,那么总的运行时间将和第四个任务一样为29个时间单位,加速系数为:(1+4×25)/ 29 = 3.48即使以4个任务的平均时间27.5来进行计算,加速系数=101/27.5 = 3.67,按照阿姆尔达定律来计算加速系数的话,上述应用中,串行时间为1,并行处理的总时间转化为串行后为100个时间单位,如果放在4核CPU上运行的话,加速系数=p / (1 + (p-1)f) = 4/(1+(4-1)1/101) = 404/104 = 3.88。

这就产生了一个奇怪的问题,使用了锁之后,加速系数连阿姆尔达定律计算出来的加速系数都不如,更别说用Gustafson定律计算的加速系数了。

其实可以将上面4个任务的锁竞争情况推广到更一般的情况,假设有锁保护的串行化时间为1,可并行化部分在单核CPU上的运行时间为t,CPU核数为p,那么在p个对成任务同时运行情况下,锁竞争导致的总等待时间为:1+2+…+p = p*(p-1)/2

耗时最多的一个任务所用时间为: p + t/p

使用耗时最多的一个任务所用时间来当作并行运行时间的话,加速系数如下

S(p) = (t+1) / (p + t/p) = p(t+1) / (pp+t) (锁竞争下的加速系数公式)

这个公式表明在有锁竞争情况下,如果核数固定情况下,可并行化部分越大,那么加速系数将越大。在并行化时间固定的情况下,如果CPU核数越多,那么加速系数将越小。

还是计算几个实际的例子来说明上面公式的效果:

令t=100, p=4, 加速系数=4×(100 +1)/ (4*4+100) = 3.48

令t=100, p=16, 加速系数=16×(100+1) / (16*16+100) = 4.54

令t=100, p=64, 加速系数=64×(100+1) / (64*64+100) = 1.54

令t=100, p=128, 加速系数=128×(100+1) / (128*128+100) = 0.78

从以上计算可以看出,当核数多到一定的时候,加速系数不仅不增加反而下降,核数增加到128时,加速系数只有0.78,还不如在单核CPU上运行的速度

上面的例子中,锁保护导致的串行代码是在任务启动时调用的,其实对等任务中在其他地方调用的锁保护的串行代码也是一样的。

对等型任务的锁竞争现象在实际情况中是很常见的,比如服务器软件,通常各个客户端处理任务都是对等的,如果在里面使用了锁的话,那么很容易造成上面说的加速系数随CPU核数增多而下降的现象。

以前的服务器软件一般运行在双CPU或四CPU机器上,所以锁竞争导致的加速系数下降现象不明显,进入多核时代后,随着CPU核数的增多,这个问题将变得很严重,所以多核时代对程序设计提出了新的挑战。以前的多任务下的编程思想放到多核编程上不一定行得通。

所以简单地认为多核编程和以前的多任务编程或并行计算等同的话是不切实际的,在讲串行化难题的那篇文章中提出了一些解决方面的对策,但是那些对策还有待业界继续努力才能做得到。
当然由于目前市面上销售的多核CPU还是双核和四核的,等到16核以上的CPU大规模进入市场可能还有几年时间,相信业界在未来的几年内能够对于上面对等任务上的锁竞争问题找到更好的解决方案。


网络分流器用的业务处理板多核
戎腾网络多核NPU处理板(Ezchip NPS400),使用主频800MHz 的NPS400,4K个处理线程,内存48G,支持正则表达式匹配、5级QoS调度策略、大容量报文输出缓冲、2M项带掩码的多元组规则、1亿精确五元组规则,处理能力400Gbps,正则表达式匹配能力200Gbps。可使用EC-X16万兆子卡、EC-Z2X4 100G子卡,定于网络流量分析业务、深度报文检测、负载均衡、在线流量控制等。戎腾网络分流器
网络分流器

网络分流器盒式1U

原文地址:http://blog.51cto.com/13853577/2165807

时间: 2024-10-08 00:01:00

网络分流器-网络分流器-多核编程的几个难题及其应对策略的相关文章

网络分流器-网络分流器TAP网络流量监控

戎腾网络分流器作为网络安全重要装备,是整个网络安全领域网络监控前端最关键的装备! 今天我们详解网络流量监控! 网络分流器TAPATCA网络分流器支持多用户高密度网络分流器DPI检测五元组过滤网络分流器镜像可视化流量汇聚分流从网络体系架构来说,网络流量是基础.所有对网络的应用和网络本身的行为特点的研究都可以通过对网络流量的研究来获得.网络的行为特征可以通过其承载的流量的动态特性来反映,所以有针对性地监测网络中流量的各种参数(如接收和发送数 据 报大小.丢包率.数据报延迟等信息),能从这些参数中分析

网络分流器-网络分流器-网络安全评估探讨

有关注笔者文章的朋友肯定知道,戎腾网络分流器作为网络安全领域前端网络监控的重要基础设备!今天得空聊一聊,网络安全问题!也算是一种拓展吧|网络分流器网络分流器1\ 引言 |网络分流器|网络安全随着互联网的普及.电子商务的广泛应用和云虚拟网络建设步伐的加快,人们对网络安全的需求也变得越来越强烈.由于网络安全问题的日益突出,这就促使网络安全产品不断采用最新安全技术,供应商不断推出满足用户需求以及可以应对当前复杂环境的安全设备:同时,这也进一步促进了网络安全技术和网络安全评估测试技术的发展.近几年来,网

iOS开发网络篇—网络编程基础

iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力 (3)如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水 移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据 新闻:网易新闻.新浪新闻.搜狐新闻.腾讯新闻 视频:优酷.百度视频.搜狐视频.爱奇艺视频 音乐

python 网络篇(网络编程)

一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据,你要怎么做呢? 这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了. 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢? 类似的机制有计算机网盘,qq等等.我们可以在我们的电脑上和别人聊天,可以在自己

网络革命:软件定义网络与网络虚拟化

发表于2014-08-28 14:49| 5691次阅读| 来源OpenStack中国社区| 13 条评论| 作者郑晨 摘要:虽然现在SDN或网络虚拟化还没有达到预期的高度,但对于IT从业者来说,拥抱这些技术永远都不算早,目前以太网在每一个数据中心中扮演者举足轻重的角色,但SDN厂商们正在摩拳擦掌准备迎接下一场网络革命. [编者按]网络经过多年的发展,已经来到“后Cisco”时代,软件定义网络.网络虚拟化等名词已经来到大家眼前,本文中着重介绍了传统网络架构与SDN网络的异同,网络虚拟化的发展状况

网络爬虫(网络蜘蛛)之网页抓取

现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎.资讯采集.舆情监测等等,诸如此类.网络爬虫涉及到的技术(算法/策略)广而复杂,如网页获取.网页跟踪.网页分析.网页搜索.网页评级和结构/非结构化数据抽取以及后期更细粒度的数据挖掘等方方面面,对于新手来说,不是一朝一夕便能完全掌握且熟练应用的,对于作者来说,更无法在一篇文章内就将其说清楚.因此在本篇文章中,我们仅将视线聚焦在网络爬虫的最基础技术--网页抓取方面. 说到网页抓取,往往有两个点是不得不说的,首

Lambda&Java多核编程-6-方法与构造器引用

在Lambda&Java多核编程-2-并行与组合行为一文中,我们对Stream<Contact>里的每一位联系人调用call()方法,并根据能否打通的返回结果过滤掉已经失效的项. 应该注意到此时filter(..)中Lambda的写法有些特殊: // ....filter(Contact::call)// ... 按常理我们应该使用s -> s.call(),但是这里却将参数.箭头以及对参数调用方法全部用其类型Contact的方法标签(暂且这样称呼)call来代替,而这个::就跟

网络的网络——当今的互联网

? 由于因特网是由数以亿计的用户构成的,因此接入ISP本身必须互联,创建"网络的网络". 上图大概是2012年的网络.由十多个第一层ISP和数十万个较低层ISP组成.较低层的ISP与较高层的ISP相连,较高层ISP彼此相连.用户和内容提供商是较低层ISP的客户,较低层ISP是较高层ISP的客户.主要的内容提供商也已经创立了自己的网络,直接在可能的地方与较低层ISP互联. 第一层ISP (tier-1 ISP) 提供全球承载的功能,大约有十几个第一层全球ISP,如AT&T.NTT

Docker 1.10 RC 新网络 overlay 网络

Overlay 网络 Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式. 这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制, 支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥. 因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案. Overlay网络的实现方式可以有许多种,其中IETF(国