免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: xfsoul
打印 上一主题 下一主题

[FreeBSD] 精通polling参数调优的进来帮帮忙吧 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-05-26 09:24 |显示全部楼层
原帖由 mirnshi 于 2006-5-25 15:00 发表
将mbuf的尺寸增大,并不会带来特别显著的提高,系统会根据包的大小,自动分拆的,大家可以看看协议栈的实现。 ...


请教一下,这个分拆体现在哪儿?

扩大mbuf尺寸,不考虑是否真能提高性能,至少可以尽量避免系统使用mbuf链或者cluster。另外,楼主两个网卡mtu一致,而且是二层转发,似乎也涉及不到ip fragmentation的问题。所以请教这个“自动分拆”的含义?

论坛徽章:
0
12 [报告]
发表于 2006-05-26 09:57 |显示全部楼层
原帖由 colddawn 于 2006-5-26 09:47 发表
他的意思是指包在mbuf和cluster的分拆而不是包数据本身分拆,所以跟MTU无关了,使用cluster是有好处的,例如对于同一包的数据处理可以直接通过指向cluster指针,增加引用计数器,避免数据复制等。如果不使用clust ...


不是讨论是否需要使用、当时是否有必要设计cluster。我的意思很简单,系统是否使用mbuf链或者mcluster来存储网络数据都取决于mbuf的尺寸,既然把mbuf尺寸调整到足以存放楼主测试的全部数据,又何来“包在mbuf和cluster的分拆”呢?

论坛徽章:
0
13 [报告]
发表于 2006-05-26 11:41 |显示全部楼层
原帖由 mirnshi 于 2006-5-26 10:30 发表
在协议栈实现中,会根据包的大小,申请不同的mbuf。而且在我的印象中,从网卡上来的包使用不到cluster,或者说承担转发时,是不使用cluster的,只有从会话层下来的时候,由于数据包很大,需要拆成适宜大小并组成cluster。所以我以往的经验,做网关类,不必调整cluster的数量,mbuf的数量倒是很重要,如果有大队列,还要调整内核可使用的内存空间大小。

所以你即便将mbuf调得很大,协议栈还是要判断一下,再去申请。系统缺省已经有2k的了,足够应付链路上的包了,那你说提高最小的mbuf有必要吗?只会浪费内存。 ...


“从网卡上来的包使用不到cluster”,那m_devget()函数中的此段代码何解?


  1.                         if (totlen + off >= MINCLSIZE) {
  2.                                 m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
  3.                                 len = MCLBYTES;
  4.                         } else {
  5.                                 m = m_gethdr(M_DONTWAIT, MT_DATA);
  6.                                 len = MHLEN;
复制代码


“所以你即便将mbuf调得很大,协议栈还是要判断一下,再去申请。”,修改mbuf的大小,就是要影响协议栈的上述“判断”过程。

上面是和你讨论“拆分”的事情,现在回到楼主的测试,修改mbuf的大小只是尝试上述不同的分配策略是否会对此造成影响,这主要是流程性的影响。如你所说,可供mbuf使用的内存数量确实也是一个关键,我们可以在测试过程中关注内存的使用情况,看看这方面是否有瓶颈。

论坛徽章:
0
14 [报告]
发表于 2006-05-26 14:07 |显示全部楼层
原帖由 xie_minix 于 2006-5-26 13:46 发表
不对,还是我错了,向大家解释一下:
if (kern_load > (100 - user_frac)) {
这句的原本意思是:
求软件中断在整个1秒时间所占百分比是否大于减去其他所占用时间.
大于就说明时间够了.poll_burst--;
小于则p ...


原来如此!看来此公编程风格有待改进。
对于polling的算法还不熟,结合你的文章,继续阅读代码。

论坛徽章:
0
15 [报告]
发表于 2006-05-26 16:17 |显示全部楼层
原帖由 colddawn 于 2006-5-26 15:26 发表
cluster不光是用来存贮长度大的数据,同时还有引用计数器之类的设计思路,这样mbuf中可以注入和剥离各层的报头,cluster中存放数据,而不同层传递只需要引用到cluster的指针即可,如果纯粹使用mbuf,在各层中 ...


你说的有道理!

我原来是凭直觉,认为相对于mbuf链或者cluster而言,把数据放在一个mbuf中的效率就要好一些,因为“处理”似乎要简单一些,但好像这种流程上的东西确实也简单不了多少。从mbuf中的数据拷贝来讲,cluster确实比mbuf的效率要高得多:

  1.                 if (m->m_flags & M_EXT) {
  2.                         n->m_data = m->m_data + off;
  3.                         n->m_ext = m->m_ext;
  4.                         n->m_flags |= M_EXT;
  5.                         MEXT_ADD_REF(m);
  6.                         n->m_ext.ref_cnt = m->m_ext.ref_cnt;
  7.                 } else
  8.                         bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t),
  9.                             (u_int)n->m_len);
复制代码

论坛徽章:
0
16 [报告]
发表于 2006-05-31 16:29 |显示全部楼层
原帖由 xfsoul 于 2006-5-31 15:07 发表
我怎么看过去一段时间,两个网卡各收到多少包呢?
我想测试一下没有网桥时候 FreeBSD收包性能。
netstat -w 10 -i em0
看到的结果根本不对!我用smartbit发了大量的包,netstat都没有统计到。


是有网桥的时候不准还是没网桥的时候不准?

论坛徽章:
0
17 [报告]
发表于 2006-06-01 16:38 |显示全部楼层
原帖由 xfsoul 于 2006-5-31 15:07 发表
我怎么看过去一段时间,两个网卡各收到多少包呢?
我想测试一下没有网桥时候 FreeBSD收包性能。
netstat -w 10 -i em0
看到的结果根本不对!我用smartbit发了大量的包,netstat都没有统计到。



有一个疑问请教一下。

看到xfsoul提到netstat对收包数目的统计不对,就去初步看了一下netstat的源码。以入包为例,netstat在每次时间间隔到达的时候,打印的是接口结构ifnet中的if_ipackets字段的变化:

  1.     ....
  2.                         show_stat("lu", 10, ifnet.if_ipackets - ip->ift_ip, 1);
  3.     ....
  4.                 ip->ift_ip = ifnet.if_ipackets;
  5.     ....
复制代码


但接口中的这个字段对于桥转发流程来说,仅在if_bridge.c中的bridge_forward()函数和bridge_input()函数中有增加的操作,但在bridge.c中却看不到对这个字段的赋值。结论似乎是netstat只对if_bridge处理的包进行计数,而不对bridge处理的包进行计数。我对这个流程不熟,不知上述分析是否有误?

论坛徽章:
0
18 [报告]
发表于 2006-06-01 17:35 |显示全部楼层
原帖由 xie_minix 于 2006-6-1 17:08 发表
在驱动程序中会对他进行处理,如:vr_rxeof中
ifp->if_ipackets++;


我也曾怀疑过这个方向,但由于代码不熟,就只能做点简单的“考证”了:

毕竟if_bridge.c中对其加1,bridge.c中没有对其加1。如果if_xxxx.c和桥代码是前后关系,就能解释bridge.c的情况,但不能解释if_bridge.c的情况。如果if_xxxx.c和桥代码是二选一的关系,就能解释if_bridge.c的情况,但不能解释bridge.c的情况。除非if_bridge.c和bridge.c并不是简单的替换关系,它们和驱动的处理接口有所不同?

查看了一下桥代码和以太网代码的接口,是在if_ethersubr.c文件的ether_input()函数中:


  1.         /*
  2.          * Tap the packet off here for a bridge.  bridge_input()
  3.          * will return NULL if it has consumed the packet, otherwise
  4.          * it gets processed as normal.  Note that bridge_input()
  5.          * will always return the original packet if we need to
  6.          * process it locally.
  7.          */
  8.         if (ifp->if_bridge) {
  9.                 BRIDGE_INPUT(ifp, m);
  10.                 if (m == NULL)
  11.                         return;
  12.         }

  13.         /* Check for bridging mode */
  14.         if (BDG_ACTIVE(ifp) )
  15.                 if ((m = bridge_in_ptr(ifp, m)) == NULL)
  16.                         return;
复制代码


其中,后面的bridge_in_ptr()调用就是原来的bridge的处理,而前面的BRIDGE_INPUT()调用则是(2005年6月5号)新加的if_bridge的处理。从这儿看来,bridge和if_bridge的处理代码从以太网处理流程中“截获”的地点是一样的。因此似乎没有道理if_bridge对if_ipackets的加一操作在其自身代码内部进行,而bridge对if_ipackets的加1操作则放到其它地方或是根本就没有进行呢?

[ 本帖最后由 雨丝风片 于 2006-6-1 17:37 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2006-06-01 17:36 |显示全部楼层
原帖由 xie_minix 于 2006-6-1 17:08 发表
你图中的代码部分的IFNET应该是单个桥自己的.
网卡进入的if_ipackets和桥进入的if_ipackets应该是不一样的.


这个我也心存疑虑,就怕两个if_ipackets不是同一个东西,但我暂时还搞不清楚,所以就先拿出来让你指点一下了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP