+ -
当前位置:首页 → 问答吧 → 队列数据处理问题(最大每秒40万个数据包)

队列数据处理问题(最大每秒40万个数据包)

时间:2010-08-06

来源:互联网

有个程序监听一个端口,这个程序会把通过这个端口的数据包都抓过来放到一个队列里面

通过此端口的数据包最多每秒40万个(硬件设备足够,很牛的哦)

现在要把所有的包都抓到放到一个队列中

问题:怎么处理这个队列中的数据,才能更好的处理数据,不让这个队列有满的情况。
也就是说后台的处理数据程序能力要高于抓包的能力。(抓包能力很强的)

方法1:多线程取包,共享一个队列
结论:pass
原因:多线程频繁加锁觖锁,性能也高不到哪里去。

大家有什么好方法么?也可以不用队列。

作者: jlccwss   发布时间: 2010-08-06

本帖最后由 zhangsuozhu 于 2010-08-06 14:30 编辑

用队列里干什么?做缓冲吗?支持处理不就得了。反正性能很强

作者: zhangsuozhu   发布时间: 2010-08-06

楼主在长春?

作者: zhangsuozhu   发布时间: 2010-08-06

尽量使用多个队列

作者: hellioncu   发布时间: 2010-08-06

同意多个队列

作者: daybreakcx   发布时间: 2010-08-06

回复 zhangsuozhu


    不分队列也可以,但问题是这个抓包工具是第三方的。我们处理的只能是他抓到的数据。直接处理不了的,要分析DNS是否被攻击的。



我不在长春,但是在长春上的大学

作者: jlccwss   发布时间: 2010-08-06

回复 hellioncu


    您的意思是我搞多个队列,然后抓放数据的时候每个队列按顺序放,然后每个队列对应一个线程去处理,是这意思么?

作者: jlccwss   发布时间: 2010-08-06

回复 daybreakcx


    您的意思是我搞多个队列,然后抓放数据的时候每个队列按顺序放,然后每个队列对应一个线程去处理,是这意思么?


我的意思是第一个包放第一个队列里,第二个包放第二个队列里,这样轮询放,您是这个意思么?

作者: jlccwss   发布时间: 2010-08-06

回复 jlccwss

是做每个IP的 conntrack(session)吗? 即把每个IP的会话全记下来,做个队列是吗?

作者: zhangsuozhu   发布时间: 2010-08-06

为什么要pass 掉? 每个线程取job的时候多取几个不就行了, 锁的次数就少了

作者: cookis   发布时间: 2010-08-06

本帖最后由 davelv 于 2010-08-06 14:39 编辑

如果数据比较简单,可以做成顺序栈,减少队列指针的开支。
但问题是如果你数据比较多处CPU跟不上,可能栈底的那些数据要等很长时间才能得到处理。
如果是这样的话,做成顺序队列也可以。

作者: davelv   发布时间: 2010-08-06



QUOTE:
回复  hellioncu


    您的意思是我搞多个队列,然后抓放数据的时候每个队列按顺序放,然后每个队列对 ...
jlccwss 发表于 2010-08-06 14:31




    嗯,就是尽量减少锁,这样才能充分发挥硬件的性能。

作者: hellioncu   发布时间: 2010-08-06

回复 zhangsuozhu


    我们要的是一个DNS服务收到的所有包。然后按IP,按域名去做统计。

我第一个想到的结构就是队列,其实用hash做也行,只是我想不到性能更好的设计。

作者: jlccwss   发布时间: 2010-08-06

多线程操作只要共享一个队列,都不是好方法,
只要有锁就会影响性能。一次多取,取n个包的数据块也一样
按照数据规律放入多个队列,每个线程对应一个自己的队列。或者数据直接处理。

作者: snailshen   发布时间: 2010-08-06

回复 cookis


    pass掉的原因就是因为多线程操作一个队列,这个锁用的真不是一般的多。我用hash表都比这个快。
多线程操作一个队列是比一个进程操作一个队列快,
但是和多线程操作队列相比,哪个性能更好一些呢?

作者: jlccwss   发布时间: 2010-08-06

回复 davelv


    这个,呃,设备CPU不会这么差吧,一个网线都可以容纳这么多,CPU要是差,那可真是……

作者: jlccwss   发布时间: 2010-08-06

回复 hellioncu


    恩,明白,谢谢

作者: jlccwss   发布时间: 2010-08-06

回复 snailshen


    按照数据规律放入多个队列,每个线程对应一个自己的队列。
恩恩,这个我写个程序试试。


数据直接处理不太可行,抓包是用的第三方的库,只有抓的功能,如果改动这个库,那就麻烦多了

作者: jlccwss   发布时间: 2010-08-06

回复 jlccwss


    如果是一个线程一个队列,你想想,锁的次数是不会少的。
我的做法是:

线程A 负责 push
线程B C D 负责 get

B C D get 的时候都将所有 可用的数据取出来,尽量减少取的次数

你可以看一下ACE 的 Task + MessageQueue的实现, 只是ACE的 MessageQueue少了, 一次get多个的方法

不过这个很好实现,你可以自己写一个

作者: cookis   发布时间: 2010-08-06

本帖最后由 zhangsuozhu 于 2010-08-06 15:11 编辑

分多个线程,  每个线和处理一个队列。 用IP作hash,hash大小为线程个的个数,把每个hash完的IP包存入相应的hash链中。操作哪个队列,那个队列上加锁。

尽可能的打散IP的hash值,平均分给各个队列中。用线程池技术,及内存池技术。
回复 davelv

作者: zhangsuozhu   发布时间: 2010-08-06

回复 cookis


    恩,我试试,谢谢

作者: jlccwss   发布时间: 2010-08-06

回复 zhangsuozhu


    恩,谢谢,现在就是用hash这么实现的。弄了两个hash,一开始写第一个hash,收到alarm信号了,告诉他我该处理了,然后包往另一个hash放。如此往复

我弄多个线程,多个队列处理下试试。
哎,每秒还要把每个线程的汇总再搞一个总汇总,send出去。郁闷

作者: jlccwss   发布时间: 2010-08-06

相关阅读 更多

热门下载

更多