Patterns in network system design (2)

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




3) Queue based design

Pattern Name and Classification: queue based design 
Intent: 简化包处理流程
Also Known As: pending and polling 
Motivation (Forces):

  包交换(存储转发)网络,最基本的操作就是enqueue/dequeue。这个和电路交换网络有本质的不同。电路交换,在包通过的路径上,有资源预留,所以不会有等待的情况;而包交换网络是按跳(hop)转发的,在包通过的路径上,没有资源预留,所以当一个包不能被立即转发时,需要放到队列里面。队列可以分为很多种,比如按包大小分类的队列,按协议分类的队列等等。由于入队和出队是两个独立的操作,所以有多种入队和出队的策略。网络设备的处理基本上就是:从队列里面取出packet;处理;把packet放入队列。不同的处理可以基于不同的队列,比如在tunnel的处理过程中,可以把封装后的包放入一个新的队列,后续的处理流程可以从队列里面把包取出来,然后发送出去。引入队列以后,针对不同队列,可以有不同的处理过程,这些过程相对独立,编程或者纠错都方便一些。

  引入队列之后,可能会使得系统的处理时间变长,从而是系统的latency变大。入队,出队操作越多,latency就越大,这一点需要注意。
Known Uses: ip network gateway
Related Patterns: event-driven programming
References:

1:  http://en.wikipedia.org/wiki/Queueing_theory

2:  Elements of Queuing Systems

3:  Event-driven programming

4) Per thread queue

Pattern Name and Classification: per thread queue
Intent: 每个thread有自己的队列,减小冲突,增加并行
Also Known As: M model;costco model
Motivation (Forces):

  在多核编程里面,任务调度非常重要。如果每个核都是独立poll自己的队列,那么这些核之间就不需要锁。锁只存在于:其他核把包放入接收队列;处理完成之后,把包放入发送队列,由发送核把包发出去。

       Receiving core —> Processing core —> Transmitting core

只需要两个锁,而且最多有两个core在竞争这些锁。

  这里面的问题在于:Receiving core如何把packet有效分配给processing core,使得每个processing core的workload是均衡的;还有就是如果processing core需要把包放入入队列,它只能放入当前core所在的队列,这样就是的任务处理更加不均衡。
Known Uses: multicore gateway
Related Patterns: Global queue
References:

1: Queueing Theory In Action, plus, frogs

5) Global queue

Pattern Name and Classification:  global queue
Intent: 多个thread共享队列,任务共享,均衡调度
Also Known As: W model; fry’s model
Motivation (Forces):

  在多核编程里面,如果多个核共享一个队列,每个核都是从这个队列里面把包取出来,然后处理。这样就每个核的load就是均衡的,因为每个核都是平等的,处理相同的任务。

                                              /—> Processing thread —\

Receiving core —> Queue —–> Processing thread —> Queue —> Transmitting thread

                                              \—> Processing thread  —/

  这里面的问题在于:锁冲突的几率增大;queue管理比较复杂。
Known Uses: multicore gateway   
Related Patterns: per thread queue
References:

1: Queueing Theory In Action, plus, frogs

6) Run to completion

Pattern Name and Classification:  run to completion
Intent: 在任务处理过程中,禁止调度
Also Known As: No
Motivation (Forces):

  在实时系统里面,一个任务开始运行后,它应该被执行完成之后,才能调度其他任务到当前的CPU上运行,也就是说,这个任务不应该不中断,否则的话,任务运行的时间就是无法估计的,而且需要保护的东西将会有很多。网络系统是一个典型的实时系统,所以在包处理过程中,它是run to completion的。
Known Uses: network system
Related Patterns: pipe line; preemptive 
References:

1: Design Patterns for Packet Processing Applications on Multi-core Intel® Architecture Processors

2: More about multicores and multiprocessors

7) Pipe line

Pattern Name and Classification:  pipe line
Intent: 复杂任务需要分解成多个任务,分阶段执行
Also Known As:  pipeline and filter
Motivation (Forces):

  在网络系统里面,如果一个任务很复杂,需要很多CPU时间,那么这个任务需要分解成多个小任务来执行,否则的话,这个任务占用CPU时间过长,导致其他任务无法执行。而且多个每个核都执行这样的任务,那么,整个系统就无法处理其他任务,这将会导致严重的丢包。所以,每个任务执行的时间不应该有很大的差别,否则,任务调度就有困难。

  一个任务分解成多个小任务后,每个小任务之间由queue连接,上一次处理完成之后,放入下一个队列。这样可以任务调度更均衡。每个小任务都是run to completion的,这一点需要注意。
Known Uses: network system
Related Patterns: run to completion; parallel 
References:

1: Design Patterns for Packet Processing Applications on Multi-core Intel® Architecture Processors

2: More about multicores and multiprocessors

(2个打分, 平均:5.00 / 5)

雁过留声

“Patterns in network system design (2)”有18个回复

  1. 加菲猫 于 2010-12-30 12:16 上午

    有个疑问, 作者对这方面有实践经验么? 还是只是在收集整理网上资料呢?

  2. droplet 于 2010-12-30 1:04 上午

    有没有经验,自己说了不算,得别人说,呵呵。

  3. westermann 于 2010-12-30 1:53 上午

    design patter应该算学院派的还是实践派的?

  4. spike 于 2010-12-30 2:47 上午

    GoF的design pattern应该算学院派的实践作品并被工业界所认可。

    pattern无处不在啊

  5. droplet 于 2010-12-30 4:19 上午

    加菲猫是新来的吧。。。

  6. 100G 于 2010-12-30 4:44 上午

    建议在后续系列里给出前面系列的链接,(2)加上 (1)的链接

  7. droplet 于 2010-12-30 5:25 上午

    计划在两三个周之内发完,然后再整理一下。大家的讨论不热烈啊,是太专业了哪,还是太肤浅了?对于网络系统设计,国外的书虽然很多,但是国内却很少看到。可能是从业人员太少了,或者是圈子太小了。做软件是相通的,不总结的话,一是会走弯路,二是有可能不知道哪条才是正路。

  8. wuyu 于 2010-12-30 6:10 上午

    大宋最近火热的村长门,咋个不见动静?

  9. 陶潜 于 2010-12-30 3:42 下午

    to droplet :
    你说的“对于网络系统设计,国外的书虽然很多,”,有什么推荐列表?
    多谢

  10. 加菲猫 于 2010-12-30 5:37 下午

    to: droplet,
    “加菲猫是新来的吧。。。”
    “关注不多…, 太专业or太肤浅~…”

    算是吧, 关注弯曲两年多了, 只是最近才开始冒冒泡~

    把您发表的文章都浏览了一遍, 专业谈不上, 肤浅也不至于, 所以不热也是必然的~呵.

    个人感觉深度不够, 道理大家都明白, 方案的具体实施才是最大的问题. 所以如果您有实践经验, 提供相关案例解析, 那就圆满了~ 哈

  11. 胡不才 于 2010-12-30 5:44 下午

    To droplet:

    我不了解网络系统设计,但很多年前(03/04年)国内就出过关于网络编程的经典《C++网络编程》卷1/2,两三本书,基本上是ACE的作者把自己应用pattern在网络编程方面的总结。

    你上面所列举的3457在里面都有论述。而且感觉上,345其实是一种,就是队列,它可能是多线程共享或者一个线程一个。

    如果想出彩,我的建议是引导方式的,提出问题,给出各种解法,然后分析各种方法的优缺点以及所适用的环境。以点带线再到面,引一发而动全身。

  12. droplet 于 2010-12-30 6:06 下午

    有人拿我的id发言,这个要能甄别,不能做不明真相的群众。有案例当然最好,但是一是没时间,二是没有具体的代码可以列出了。有些东西虽然大家都知道,但是在没有GoF之前,谁能把design pattern说清楚?总结和提炼是必须的,这样才能拿来指导工作。如果能把这个系列写清楚,写透了,出本书是足够了。

  13. ASR 于 2010-12-30 6:19 下午

    呵呵 droplet 是个好同志 实践经验比在座很多人要丰富 具体的我就不说了。。。

  14. droplet 于 2010-12-30 6:36 下午

    ACE是distributed network programming,与之对应的是pattern oriented software architecture volume 2 (这套书有5卷,很不错)。这个和network system design还是有一点区别的。网络系统一般都是software, hardware co-design,这里写的都是在构造软件时需要考虑的一些问题。queue based design有很多种用法,比如4和5就是相互竞争的两个pattern,需要在用的时候权衡利弊。

  15. 颓废 于 2011-01-02 5:06 下午

    淡定, 淡定。 貌似这些所谓patten就是几点实践总结, 而且貌似随便找本网络设计的书上都有, 意思相同, 各有表述而已。

    对文章不对作者。 若有冒犯, 淡定,淡定.

  16. Will Chie 于 2011-01-05 8:53 下午

    十分感谢droplet的总结和分享,我觉得总结的非常不错,在实践中都是用的到的。
    小弟不才,加入讨论队伍:
    多核的两种队列如果都不考虑保序问题的话,小有遗憾啊,个人觉得这个队列还是和保序的问题耦合度很高的。

    另:弯曲咋越来越像公司了?干活的人只有被批判的份,不干活的人都出来扮演批判角色。

  17. 陈怀临 于 2011-01-05 9:05 下午

    要有勇气接受批评。。。当作没看见就是了:-)

  18. droplet 于 2011-01-05 10:16 下午

    保序是个处理过程,而queue是packet缓存的地方,这个就像指令和数据的关系一样,是可以完全分开的两个东西。网络设备基本上就是在queue之间把数据倒来倒去。