队列数据处理问题(最大每秒40万个数据包)
时间:2010-08-06
来源:互联网
通过此端口的数据包最多每秒40万个(硬件设备足够,很牛的哦)
现在要把所有的包都抓到放到一个队列中
问题:怎么处理这个队列中的数据,才能更好的处理数据,不让这个队列有满的情况。
也就是说后台的处理数据程序能力要高于抓包的能力。(抓包能力很强的)
方法1:多线程取包,共享一个队列
结论:pass
原因:多线程频繁加锁觖锁,性能也高不到哪里去。
大家有什么好方法么?也可以不用队列。
作者: jlccwss 发布时间: 2010-08-06
用队列里干什么?做缓冲吗?支持处理不就得了。反正性能很强
作者: zhangsuozhu 发布时间: 2010-08-06
作者: zhangsuozhu 发布时间: 2010-08-06
作者: hellioncu 发布时间: 2010-08-06
作者: daybreakcx 发布时间: 2010-08-06
不分队列也可以,但问题是这个抓包工具是第三方的。我们处理的只能是他抓到的数据。直接处理不了的,要分析DNS是否被攻击的。
我不在长春,但是在长春上的大学
作者: jlccwss 发布时间: 2010-08-06
您的意思是我搞多个队列,然后抓放数据的时候每个队列按顺序放,然后每个队列对应一个线程去处理,是这意思么?
作者: jlccwss 发布时间: 2010-08-06
您的意思是我搞多个队列,然后抓放数据的时候每个队列按顺序放,然后每个队列对应一个线程去处理,是这意思么?
我的意思是第一个包放第一个队列里,第二个包放第二个队列里,这样轮询放,您是这个意思么?
作者: jlccwss 发布时间: 2010-08-06
是做每个IP的 conntrack(session)吗? 即把每个IP的会话全记下来,做个队列是吗?
作者: zhangsuozhu 发布时间: 2010-08-06
作者: cookis 发布时间: 2010-08-06
如果数据比较简单,可以做成顺序栈,减少队列指针的开支。
但问题是如果你数据比较多处CPU跟不上,可能栈底的那些数据要等很长时间才能得到处理。
如果是这样的话,做成顺序队列也可以。
作者: davelv 发布时间: 2010-08-06
您的意思是我搞多个队列,然后抓放数据的时候每个队列按顺序放,然后每个队列对 ...
jlccwss 发表于 2010-08-06 14:31
嗯,就是尽量减少锁,这样才能充分发挥硬件的性能。
作者: hellioncu 发布时间: 2010-08-06
我们要的是一个DNS服务收到的所有包。然后按IP,按域名去做统计。
我第一个想到的结构就是队列,其实用hash做也行,只是我想不到性能更好的设计。
作者: jlccwss 发布时间: 2010-08-06
只要有锁就会影响性能。一次多取,取n个包的数据块也一样
按照数据规律放入多个队列,每个线程对应一个自己的队列。或者数据直接处理。
作者: snailshen 发布时间: 2010-08-06
pass掉的原因就是因为多线程操作一个队列,这个锁用的真不是一般的多。我用hash表都比这个快。
多线程操作一个队列是比一个进程操作一个队列快,
但是和多线程操作队列相比,哪个性能更好一些呢?
作者: jlccwss 发布时间: 2010-08-06
这个,呃,设备CPU不会这么差吧,一个网线都可以容纳这么多,CPU要是差,那可真是……
作者: jlccwss 发布时间: 2010-08-06
恩,明白,谢谢
作者: jlccwss 发布时间: 2010-08-06
按照数据规律放入多个队列,每个线程对应一个自己的队列。
恩恩,这个我写个程序试试。
数据直接处理不太可行,抓包是用的第三方的库,只有抓的功能,如果改动这个库,那就麻烦多了
作者: jlccwss 发布时间: 2010-08-06
如果是一个线程一个队列,你想想,锁的次数是不会少的。
我的做法是:
线程A 负责 push
线程B C D 负责 get
B C D get 的时候都将所有 可用的数据取出来,尽量减少取的次数
你可以看一下ACE 的 Task + MessageQueue的实现, 只是ACE的 MessageQueue少了, 一次get多个的方法
不过这个很好实现,你可以自己写一个
作者: cookis 发布时间: 2010-08-06
分多个线程, 每个线和处理一个队列。 用IP作hash,hash大小为线程个的个数,把每个hash完的IP包存入相应的hash链中。操作哪个队列,那个队列上加锁。
尽可能的打散IP的hash值,平均分给各个队列中。用线程池技术,及内存池技术。
回复 davelv
作者: zhangsuozhu 发布时间: 2010-08-06
恩,我试试,谢谢
作者: jlccwss 发布时间: 2010-08-06
恩,谢谢,现在就是用hash这么实现的。弄了两个hash,一开始写第一个hash,收到alarm信号了,告诉他我该处理了,然后包往另一个hash放。如此往复
我弄多个线程,多个队列处理下试试。
哎,每秒还要把每个线程的汇总再搞一个总汇总,send出去。郁闷
作者: jlccwss 发布时间: 2010-08-06
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28