ipfw pipe show 的BKT序号修正
本帖最后由 lsstarboy 于 2013-01-14 22:25 编辑--打算发博客,结果博客正在装修,先发本坛子了:
环境:FreeBSD9.0 ,ipfw pipe限速,客户机大约1000台。
问题:ipfw pipe show 的时候,无论怎么调整buckets值(默认值是:net.inet.ip.dummynet.hash_size,或者pipe config后加bucket参数),BTK总显示小于256,并且有大量的重复值。
如果按照说明,多个ip可以共享一个bucket,那么就有可能多台机器共享同一个流量,那结果就麻烦了。但是根据测试结果,每台机器都是单独的流量,说明不是同一个buckets。
原因:/usr/src/sbin/ipfw/dummynet.c,list_flow函数:printf("%3u%c", (ni->oid.id) & 0xff, id->extra ? '*' : ' ');
一个& 0xff限制了它的显示范围,局域网的机器上千,还是改为 & 0xffff好了,同时%3u也改为%6u:printf("%6u%c", (ni->oid.id) & 0xffff, 解决:
按上面的思路,修改/usr/src/sbin/ipfw/dummynet.c,再make && make install
重新运行ipfw,显示正确的bucket了:ipfw pipe show | more
00040: 2.000 Mbit/s 0 ms burst 0
q13111250 sl. 0 flows (1 buckets) sched 65576 weight 0 lmax 0 pri 0 droptail
sched 65576 type FIFO flags 0x1 4096 buckets 334 active
mask:0x00 0x0000ffff/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
8194 ip 0.0.16.1/0 0.0.0.0/0 129958 1446778120 021
8198 ip 0.0.16.3/0 0.0.0.0/0 30 22800 0 0
8204 ip 0.0.16.6/0 0.0.0.0/0 1 940 0 0
8208 ip 0.0.16.8/0 0.0.0.0/0 197 488680 0 0
8214 ip 0.0.16.11/0 0.0.0.0/0 16 12430 0 0
8216 ip 0.0.16.12/0 0.0.0.0/0 2 3900 0 0
8226 ip 0.0.16.17/0 0.0.0.0/0 32769 416751676 6584 0
8230 ip 0.0.16.19/0 0.0.0.0/0 1183 1633860 0 0
8234 ip 0.0.16.21/0 0.0.0.0/0 3 1560 0 0
8240 ip 0.0.16.24/0 0.0.0.0/0 56 32370 0 0
8242 ip 0.0.16.25/0 0.0.0.0/0 56 137230 0 0
8248 ip 0.0.16.28/0 0.0.0.0/0 1 2290 0 0
8250 ip 0.0.16.29/0 0.0.0.0/0 5 4530 0 0
8252 ip 0.0.16.30/0 0.0.0.0/0 338 320300 0 0
8254 ip 0.0.16.31/0 0.0.0.0/0 5 3900 0 0
8256 ip 0.0.16.32/0 0.0.0.0/0 18 32270 0 0
8258 ip 0.0.16.33/0 0.0.0.0/0 13692 157275510 0 0
8294 ip 0.0.16.51/0 0.0.0.0/0 2 1500 0 0
8328 ip 0.0.16.68/0 0.0.0.0/0 5 2550 0 0
8330 ip 0.0.16.69/0 0.0.0.0/0 245027347270 0 164
8334 ip 0.0.16.71/0 0.0.0.0/0 138 77740 0 0
8348 ip 0.0.16.78/0 0.0.0.0/0 14 15960 0 0
本帖最后由 lsstarboy 于 2013-01-14 16:47 编辑
哪位老大给反映到官方去吧,我英文是自学的,只会阅读不会写,说就更不用提了:((。 感谢版主加精! lsstarboy 发表于 2013-01-14 16:46 static/image/common/back.gif
哪位老大给反映到官方去吧,我英文是自学的,只会阅读不会写,说就更不用提了。
你大致写个稿,大不了我帮你改改,然后发送过去,要是能被接收,也算是咱们社区对系统的贡献。
具体问题我不了解,所以没法帮你写,而且这是你的贡献,我不能给你发送,要不然会误以为是我发现的。 :wink: 我只会写中文!没有老师教的英语很郁闷! 本帖最后由 zeissoctopus 于 2013-01-20 15:25 编辑
lsstarboy 发表于 2013-01-17 23:13 static/image/common/back.gif
我只会写中文!没有老师教的英语很郁闷!
我的英文水平也低,見沒有人幫你,我嘗試以我有限英語水平幫你一把。
我把你的補丁碼轉換為官方認可 diff 格式,預備了 patch.txt 補丁文字檔案如下,請你複制並儲存為 patch.txt 檔案以備上傳用
--- dummynet.c.original 2013-01-20 15:01:11.000000000 +0800
+++ dummynet.c2013-01-20 15:12:43.000000000 +0800
@@ -184,11 +184,11 @@
print_header(&ni->fid);
*print = 0;
}
pe = getprotobynumber(id->proto);
/* XXX: Should check for IPv4 flows */
- printf("%3u%c", (ni->oid.id) & 0xff,
+ printf("%6u%c", (ni->oid.id) & 0xffff,
id->extra ? '*' : ' ');
if (!IS_IP6_FLOW_ID(id)) {
if (pe)
printf("%-4s ", pe->p_name);
else
請你到 官方 send-pr 網頁 ,利用這網頁,提交你的補丁。填寫內容跟著我以下來做
Your Electronic Mail Address:
填入 你的電郵地址
Your Name:
填入 你的大名
Your Organization or Company:
填入 你的組織,可以不填
Synopsis:
填入 ipfw pipe show the buckets value incorrectly
Category:
選 kern
Class:
選 sw-bug
Which FreeBSD Release You Are Using:
填入 你的 FreeBSD 版本
Environment (outpout of "uname -a" on the problem machine):
填入 你的 uname -a 輸出
Full Description:
填入以下這段英文
The buckets value always shows less than 256 of the output of ipfw pipe show no matter you change it.
In function list_flow of /usr/src/sbin/ipfw/dummynet.c. The following statement is not able to show
the correct buckets value in the environment where have over 1000 clients behind ipfw.
printf("%3u%c", (ni->oid.id) & 0xff, id->extra ? '*' : ' ');
How to repeat the problem:
填入以下這段英文
In the environment with over 1000 clients behind ipfw and using ipfw to limit connection brandwidth.
Fix to the problem if known:
填入以下這段英文
apply the patch.txt
And/or patch file (100KB max, .txt extension or shar file required):
用瀏覽器,把 patch.txt 補丁檔案上傳。
最後填入防機器人的認証碼,然後按 submit 上傳。
一經官方審核和批准後,從此 FreeBSD 內有樓主的貢獻,恭喜了。 回复 6# zeissoctopus
非常感谢!您是一位热心人。
我试试,不懂的再向你请教! list_flow->list_u_foreach 论坛有好人啊 谢谢分享!!
页:
[1]
2