Chinaunix

标题: 求助: 需要tcpdump多处理器支持,有奖征答! [打印本页]

作者: unsword    时间: 2006-07-03 13:42
标题: 求助: 需要tcpdump多处理器支持,有奖征答!
诸位大虾好, 小弟在最近遇见一个难题,寻求各位达人支持!

在一些千兆网络,流量比较高的情况下,例如有1000Mps 的流量下,用一台双志强3.0G的服务器进行抓包.

在使用tcpdump抓包并写入硬盘的时候, 发现一个CPU 跑到100%,但另外一个cpu为空闲。

后一个朋友告诉我,现在的抓包程序,如tcpdump,ethreal 等软件,均不支持多cpu处理,所以
没有办法在高流量的网络环境中抓包并存储起来。

后去tcpdump.org察看,有一个所谓turbo packet 的机制,可以提高抓包工作效率,但不知道
如何才能搞定这个东西?   

此外,求那位达人赐linux环境下使用的 支持多处理器的 抓包软件一个 ,
小弟设 "酒吧 世界杯决赛通宵看球+无限量供应扎啤 大礼包" 致谢!

[ 本帖最后由 unsword 于 2006-7-3 13:49 编辑 ]
作者: unsword    时间: 2006-07-04 09:27
顶上啊,不能掉下去!
作者: liubinbj    时间: 2006-07-04 13:17
包括往返机票吗?
作者: flw    时间: 2006-07-04 13:35
是否支持 SMP 好像和 tcpdump 没关系吧?
作者: assiss    时间: 2006-07-04 13:56
原帖由 flw 于 2006-7-4 13:35 发表
是否支持 SMP 好像和 tcpdump 没关系吧?

我对SMP也一点不懂,纯属瞎问一下:
SMP是不是跟前一阶段炒得比较厉害的超线程(一样也一点不懂)一样,要用户程序自己实现?

我一直以为这样的事情应该交给操作系统去做,用户程序不用关心它面对的是几个CPU。
纯属瞎想,请大家多批评。
作者: mq110    时间: 2006-07-04 14:00
此事应该交给操作系统来做.
作者: flw    时间: 2006-07-04 14:11
原帖由 assiss 于 2006-7-4 13:56 发表

我对SMP也一点不懂,纯属瞎问一下:
SMP是不是跟前一阶段炒得比较厉害的超线程(一样也一点不懂)一样,要用户程序自己实现?

我一直以为这样的事情应该交给操作系统去做,用户程序不用关心它面对的是几个C ...

SMP 和超线程不同,
SMP 是“Symmetric Multiple Processor 对称多处理器”的缩写。
也就是说,如果一个计算机系统中有两个或两个以上的 CPU 的话,
OS 里面有很多代码就需要额外考虑很多单 CPU(也叫“UP”)时不需要考虑的情形,
这主要体现在 CPU 资源的分配已经并发时的同步等方面。

近来的 linux kernel 版本自身就提供对 SMP 环境的支持(从什么时候开始我就不清楚了),
编译时只需要打开 SMP 选项就可以了。

超线程应该是 CPU 芯片中实现的一种技术,可以把一个 CPU 当两个来用(?)
反正在 linux 2.6 中,超线程选项是 SMP 选项的一个子选项,
也就是说,除非 SMP 生效,否则超线程总是不生效的。
作者: namtso    时间: 2006-07-04 14:17
对于使用了线程技术的程序,SMP能够最大限度地发挥作用。对于没用使用线程技术的程序,只要操作系统支持SMP,也应该可以优化程序的性能。
作者: flw    时间: 2006-07-04 14:19
原帖由 namtso 于 2006-7-4 14:17 发表
对于使用了线程技术的程序,SMP能够最大限度地发挥作用。对于没用使用线程技术的程序,只要操作系统支持SMP,也应该可以优化程序的性能。

我怎么记得是,SMP 对多线程一点儿帮助都没有?SMP 只对多进程有帮助。
作者: namtso    时间: 2006-07-04 15:48
原帖由 flw 于 2006-7-4 14:19 发表

我怎么记得是,SMP 对多线程一点儿帮助都没有?SMP 只对多进程有帮助。

可能是我记错了。。。
以前好像在哪儿看过,如果内核级支持线程的,那么OS调度的最小单位就是线程,同一个进程的不同线程可以在不同的CPU上同时运行,这样同一个进程就可以分到更多的CPU时间片,从而提升进程的运行速度。Aix和linux的2.6以上的内核,好像都是内核级支持线程的。
作者: liubinbj    时间: 2006-07-04 15:50
原帖由 flw 于 2006-7-4 14:19 发表

我怎么记得是,SMP 对多线程一点儿帮助都没有?SMP 只对多进程有帮助。


传说用户线程在内核看来是进程,所以多线程是可以调度到SMP上的不同CPU。
作者: 笨    时间: 2006-07-04 16:21
我的解决办法:
安装 支持 openmp 的编译环境
拿到 tcpdump 的源代码
修改 tcpdump 源代码,将其中可并行处理的部分修改使 openmp 发挥作用
编译、运行


good luck!
作者: albcamus    时间: 2006-07-04 17:40
linux什么版本的内核? pgrep migration看看有没有这个内核线程。 我觉得12楼的方法是正解。
作者: unsword    时间: 2006-07-04 20:10
标题: 谢谢各位大虾 收获不小
我的环境是这样的  安装了FC5  自己编译2.6.20.16的kernel

编译kernel的时候对smp 的支持已经打开  

tcpdump的版本为fc5自带  因该是3.8点几的版本

现在的情况就是一个 CPU 跑满, 而另一个 为空闲状态

现在在延庆出差, 回去后我会把系统情况贴上来, 请诸位继续研究

注意:  奖励依然有效,直到这个周末   日期是 2006年7月9日前
作者: albcamus    时间: 2006-07-05 08:53
标题: 回复 14楼 unsword 的帖子
既然这么新的linux, 那么用多线程实现就可以。  不过这应该不是件小事情。  另外, 现在最新的内核才是2.6.17,怎么你都到2.6.20了?
作者: unsword    时间: 2006-07-06 16:28
标题: 内核的版本打字打错了!
因该是 2.6.16 ,而不是2.6.20.16 ,打字太快打错了.

这个问题是一个大问题, 我现在一直在考虑, 到底如何才能实现多线程的抓包,  看来目前是没有办法了

唉, 失望啊
作者: tan1    时间: 2006-07-06 17:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: tan1    时间: 2006-07-06 17:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: Alligator27    时间: 2006-07-06 21:46
可以试试多进程并发处理. 比如原来是: "tcpdump expr", 改为

tcpdump expr1 &
tcpdump expr2 &
...
tcpdump exprn &

而且 expr == expr1 | expr2 | ... | exprn
作者: JohnBull    时间: 2006-07-06 22:30
用PC处理千兆流量本身就是Mission Impossible.
作者: unsword    时间: 2006-07-11 09:08
标题: 郁闷了
看来这是一个不可能完成的任务.....
作者: unsword    时间: 2007-08-13 10:08
没有搞定,看来国内是搞不定这个问题了。
作者: connet    时间: 2007-08-13 14:22
多 线程 做, 一个线程 抓包, 一个线程 写 文件,当然你的 硬盘要 够快。
linux 下 多 线程 对 SMP 绝对 有效 。我 试过的。2CPU下 一个多线程 程序的 CPU使用率 达到 190%以上, 其实 就是 使用到了 2个 CPU
作者: connet    时间: 2007-08-13 14:24
原帖由 flw 于 2006-7-4 14:19 发表

我怎么记得是,SMP 对多线程一点儿帮助都没有?SMP 只对多进程有帮助。

非也 ,linux 下使用 pthread 多线程 可是使用 SMP的。别的 系统没测试过。
作者: JohnBull    时间: 2007-08-13 15:00
如果PC机能处理1000Mps的协议分析,硬件协议分析仪卖给谁去啊?
作者: 思一克    时间: 2007-08-13 15:26
SMP对多THREAD和多PROCESS都有效果。

LINUX下THREAD调度和PROCESS一样处理。
作者: flw    时间: 2007-08-13 15:31
原帖由 思一克 于 2007-8-13 15:26 发表
SMP对多THREAD和多PROCESS都有效果。

LINUX下THREAD调度和PROCESS一样处理。

如果是由线程库在应用层实现的线程呢?
作者: 思一克    时间: 2007-08-13 15:32
一个单进程的程序(如果tcpdump是)同时刻只能用一个CPU。

按CONNET说的,改tcpdump程序会利用上2个。
作者: connet    时间: 2007-08-13 15:44
原帖由 思一克 于 2007-8-13 15:32 发表
一个单进程的程序(如果tcpdump是)同时刻只能用一个CPU。

按CONNET说的,改tcpdump程序会利用上2个。

单进程多线程也可以使用多CPU
我测试 多线程 程序在 双核 核 的 P4 / amd64 x2 上可以使用 CPU 到 150%以上
程序在 关掉SMP 时CPU 占到 100%.
没使用超线程(因为我的理解中超线程是骗人的垃圾),
当然你的 多线程的负载 要足够 重,系统才会分配线程到多CPU运行。
作者: connet    时间: 2007-08-13 15:47
原帖由 JohnBull 于 2007-8-13 15:00 发表
如果PC机能处理1000Mps的协议分析,硬件协议分析仪卖给谁去啊?

离线分析也可以啊。
如果 系统正常 运行时能 处理 到 1000Mbps的话, 使用 足够快的 存储系统,离线分析肯定没问题。
说不定 4核 以上的 系统实时分析也可以,我 估计 。
作者: 思一克    时间: 2007-08-13 15:47
当然了----单进程多线程也可以使用多CPU。

LINUX调度多THREAD和PROCESS一样。

一个PROCESS,一个THREAD的同时仅仅使用一个CPU


原帖由 connet 于 2007-8-13 15:44 发表


我测试 多线程 程序在 双核 核 的 P4 / amd64 x2 上可以使用 CPU 到 150%以上
程序在 关掉SMP 时CPU 占到 100%.
没使用超线程(因为我的理解中超线程是骗人的垃圾),
当然你 ...

作者: 思一克    时间: 2007-08-13 15:49
应用层线程库另论。
我说的是LINUX上pthread的情况。

原帖由 flw 于 2007-8-13 15:31 发表

如果是由线程库在应用层实现的线程呢?





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2