OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于netJobAdd: ring buffer overflow

共11条 1/2 1 2 跳转至

关于netJobAdd: ring buffer overflow

菜鸟
2007-03-13 17:47:00    评分

各位好:

我用ixp425做一个应用网关,现在在板子的一个网口上(ixe0)截获所有的进出数据包,当数据包有网关发往外网时,对数据包的source ip和destnation ip进行修改,当数据包由外网返回时,在将 数据包的ip修改回原样,这类似与NAT功能,但又和NAT有些区别。

当我用ipfilterhook获取数据并修该后,可以通过ixp425上网,但速度很慢,经常出现netJobAdd: ring buffer overflow的提示,着是不是说明我的内存队列以满,出现了丢包现象,网络处理器无法应对大量数据的修改呢?

那我应该怎样才能从根本上解决这个问题呢?我已经查阅了很多帖子但都没有很好的解决方法,望有类似经验的朋友不吝赐教,谢谢!!




关键词: 关于     netJobAdd     buffer     overf    

菜鸟
2007-03-15 01:32:00    评分
2楼

我觉得是你的加入到netjobadd的那个函数有问题,可能这个函数在执行到某些地方没有正确推出,导致netjobadd的最大值(默认好像是85)迅速被占满,导致溢出,你再检查一下那个函数看看,最好是跟踪调试一下那个函数,看看有没有问题


菜鸟
2007-03-15 23:02:00    评分
3楼

我检查了我的函数好象并没有问题,我把NUM_128的参数调整到很大以后,目前没有出现overflow的现象,但我不知道ring buffer overflow和NUM_128参数的调整是否有直接关系?

请问netjobadd 的默认值可以修改吗,在那里修改??谢谢!!


菜鸟
2007-03-16 17:45:00    评分
4楼

哦,我不确定你说的NUM_128是什么,所以不确定他们之间是否有联系。

那个最大值是可以修改的,但需要你有vxworks的源吗,这样你就可以找到那个最大值并修改后重新编译到你的工程中


菜鸟
2007-03-16 18:36:00    评分
5楼

感谢 fxhskwm的热心帮助,

我还在继续努力中,谢谢


菜鸟
2007-03-16 21:54:00    评分
6楼
Problem Description
I get the error message, "panic: netJobAdd: ring buffer overflow!". What does this mean and how can I eliminate it?


Problem Solution
What is netJobAdd()?


The function netJobAdd() is called within an interrupt service routine (ISR) of network related interrupts. netJobAdd() enqueues a job in a ring buffer. Then the task tNetTask processes each job in the ring buffer at normal task level. The advantage of this is that less time is spent in the ISR, with interrupts locked.


What is netJobAdd() used for?


netJobAdd() is called by network interface device drivers to handle interrupts for received packets. It is also used to process network timer interrupts, such as tcp timers and the netif watchdog timer.


What is a "ring buffer overflow!"?


The ring buffer used by netJobAdd() and the tNetTask is of a fixed size, which cannot be changed. It has the capacity to store 85 jobs. If the ring buffer already contains 85 jobs when netJobAdd() is called you will see a "ring buffer overflow".


What can I do to eliminate a "ring buffer overflow"?


To stop ring buffer overflows from occurring, tNetTask needs to be able to process the jobs in the ring buffer. Anything that can prevent tNetTask from running will potentially cause a ring buffer overflow.


One thing that can preempt the tNetTask are tasks at a higher priority then tNetTask, which runs at a priority of 42. The other thing that will preempt tNetTask is an interrupt. Reducing the amount of time spent processing higher priority tasks and interrupt handling will reduce the chance of a ring buffer overflow.


菜鸟
2007-03-20 18:37:00    评分
7楼

thanks a lot

i know what i should do

again thaks


菜鸟
2007-04-26 05:56:00    评分
8楼

woodhead,你好;

我现在已经把tNettask的priority设置成了 10,我程序中使用了ipfilterhook函数,我查看了一下,他的pri是30,按说这样就不应该出现ring buffer overflow的状况了,但是有时还是回出现,尤其是访问大流量的网站时,例如sina等,这有时什么原因呢?出现overflow 一段时间后,板子就无法实现正常的包修改工作了,必须重新启动,这让我很苦恼,有办法根除这个问题吗??

希望得到您的帮助,谢谢!


菜鸟
2007-04-26 07:42:00    评分
9楼

啊,多嘴几句呀,那个什么NUM_128/256/512/1024啊什么的是为以太网收发数据包预留的缓冲,Vxworks中为了避免频繁的动态内存分配,导致碎片,把它做成静态预留的了,,也就是说,所有的网络数据包缓冲内存全部在预置的这些内存里面进行,好像叫做网络缓冲池。。

这些值都有默认设置,能在不占用太多内存的情况下,满足通常的网络通信任务。但也是可以通过工程里面的操作系统配置参数来改的,不需要源代码就可以改。

如果要改这些参数,可以在每次生成VxWorks映象的时候在操作系统组件配置里面改,如果嫌烦,也可以把它写到config.h里面,首先undef,在define就可以了。。

到底设置成多大呢?????不知道,,但可以测试一下:首先将那些缓冲参数设得很大(这时生成的映象运行起来后将占用很大的内存,可以用memShow比较一下),生成映象后,编程使得网络通信达到高峰负荷,再利用VxWorks里面的的网络缓冲的Show命令,定时地输出网络缓冲的使用情况统计(可以做个小程序,把几个Show结合到一起并自动隔2秒输出一次),根据统计情况看哪些类型的包使用多少,,,保留一定的余量后,再把这些参数适度改小就可以了。。。。当然,如果内存很大,,,就不要这么麻烦了,往大里调整就是。。。。。。


菜鸟
2007-04-26 16:44:00    评分
10楼

yaopg,你好;

我一开始也是这么考虑的把buffer调整的大一些,

-> memShow

SUMMARY:

status bytes blocks avg block max block
------ ---------- --------- ---------- ----------
current
free 20188296 209 96594 19350504
alloc 5749368 428 13433 -
cumulative
alloc 6789500 3585 1893 -
value = 0 = 0x0
->
->
->
-> mbufShow
type number
--------- ------
FREE : 129
DATA : 3
HEADER : 868
SOCKET : 0
PCB : 0
RTABLE : 0
HTABLE : 0
ATABLE : 0
SONAME : 0
ZOMBIE : 0
SOOPTS : 0
FTABLE : 0
RIGHTS : 0
IFADDR : 0
CONTROL : 0
OOBDATA : 0
IPMOPTS : 0
IPMADDR : 0
IFMADDR : 0
MRTABLE : 0
TOTAL : 1000
number of mbufs: 1000
number of times failed to find space: 0
number of times waited for space: 0
number of times drained protocols for space: 0
__________________
CLUSTER POOL TABLE
_______________________________________________________________________________
size clusters free usage
-------------------------------------------------------------------------------
64 100 99 5
128 15000 14131 3136
256 256 256 0
512 100 100 0
1024 50 50 0
2048 50 50 0
-------------------------------------------------------------------------------
value = 80 = 0x50 = 'P'

因为128的包站决大部分,所以我吧NUM_128调成15000,但是问题还是回出现ring buffer overflow! 同时tNetTask的priority也调整了(=10),不知道问题在那里?

还有一事不明

size clusters free usage
-------------------------------------------------------------------------------
64 100 99 5
128 15000 14131 3136

这里cluster!=free+usage, 是不是因为usage中有释放了重新使用的?


共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]