- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请在问题中告诉我。我正在基于 CentOS x86_64 构建流量整形器,Linux 版本 2.6.32-431.3.1.el6.x86_64。所以,它有大约 10 个 u32 哈希表,所有的除数都是 256。在默认表 800 中,我对第 3 个八位字节进行哈希处理,并将数据包指向其中一个表,然后对第 4 个八位字节进行哈希处理,并将数据包指向描述每个用户带宽限制的类。因此,对于每个 IP 地址,都有一个相应的 tc 类。我们打算创建大约 3000 个 IP 地址。当我的脚本将此 IP 添加到哈希表中时,出现错误:RTNETLINK answers: File exists。更多代码在这里:
tc qdisc add dev $inet root handle 2: htb default 8000
tc class add dev $inet parent 2: classid 2:6000 htb rate 100mbit
#this hash-tables are for subnets
for i in {901..912}; do
tc filter add dev $inet parent 2: handle $i: protocol ip u32 divisor 256
done
#adding filters for packet classifying
tc filter add dev $inet protocol ip parent 2: u32 ht 800:: match ip src 172.16.16.0/20 hashkey mask 0x0000ff00 at 12 link 901:
tc filter add dev $inet protocol ip parent 2: u32 ht 901:11: match ip src 172.16.17.0/24 hashkey mask 0x000000ff at 12 link 902:
tc filter add dev $inet protocol ip parent 2: u32 ht 901:12: match ip src 172.16.18.0/24 hashkey mask 0x000000ff at 12 link 903:
#...
#and so on under "link 912:"
#creating classes for every host, place it under root class 2: (100mb for all)
for i in {1..2815}; do tc class add dev $inet parent 2:6000 classid 2:$i htb rate 1mbit ceil 6mbit; done
#place each host in corresponding u32 table
for i in {1..255}; do printf -v hi "%x" "$i";
tc filter add dev $inet protocol ip parent 2: u32 ht 902:$hi: match ip src 172.16.17.$i flowid 2:$i
done
for i in {256..511}; do let j="i-256"; printf -v hi "%x" "$j";
tc filter add dev $inet protocol ip parent 2: u32 ht 903:$hi: match ip src 172.16.18.$j flowid 2:$i
done
#....
#and so on under 2815 hosts
在命令结束后的某处
tc filter add dev eth0 protocol ip parent 2: u32 ht 909:dc: match ip src 172.16.24.220 flowid 2:2012
RTNETLINK answers: File exists
We have an error talking to the kernel
我无法解决这个问题,我以为Linux内核中有过滤器数量限制,但有人告诉我这不是真的,根本没有限制。没有重用 flowid,也没有哈希表句柄发生超限。还有什么可能导致代码中出现此错误?
最佳答案
我用另外两个内核重现了这个问题;现代的 Ubuntu 12.04 3.5.0-39-generic x86_64 内核和旧的 Fedora 2.6.33.3-85 i686 内核。它们都存在。
这里有一些 u32 过滤器文档:http://ace-host.stuart.id.au/russell/files/tc/doc/cls_u32.txt建议过滤器句柄的最后一部分,过滤器项目,应该上升到十六进制 0xFFF,即 4096(例如 901:0:0 到 901:0:FFF)。当您手动添加过滤器时,情况就是如此。但是,当您使用哈希添加过滤器时,您指定了哈希表和存储桶,但过滤器 ID 是自动创建的。
麻烦的是,自动创建的过滤器项是从 800 开始的,这意味着您实际上只能使用 0x800 到 0xFFE 过滤器(总共 2048 个)。
您会认为您可以为每添加 2048 个过滤器切换哈希表,就像您在示例中所做的那样,但事实并非如此 - 它仍然只允许您在哈希时总共添加 2048 个过滤器。我不确定此行为是错误、限制还是设计使然。
要解决此问题,您可以通过将过滤器项 ID 放在 u32 过滤器声明之前手动指定过滤器项 ID,它必须具有零哈希表和存储桶 ID。这将允许您添加完整的 4096 个过滤器,其中涵盖了您的子网声明。它似乎还允许为每个哈希表添加 4096 个过滤器,因此您可以通过链接到另一个哈希表来添加更多过滤器。脚本的最后一部分需要像这样:
#place each host in corresponding u32 table
for i in {1..255}; do
printf -v hi "%x" "$i";
tc filter add dev $inet protocol ip parent 2: handle ::$hi u32 ht 902:$hi: match ip src 172.16.17.$i flowid 2:$i
done
for i in {256..511}; do
let j="i-256";
printf -v hi "%x" "$i";
printf -v hj "%x" "$j";
tc filter add dev $inet protocol ip parent 2: handle ::$hi u32 ht 903:$hj: match ip src 172.16.18.$j flowid 2:$i
done
#....
#and so on under 2815 hosts
这是我测试过的代码,它与您的代码相同,但我对其进行了重组以仅使用一个哈希表。它应该具有相同的效率。它仅在最后一个八位字节上散列到所需的桶,然后顺序匹配桶内的过滤器,而不是顺序匹配并链接到子网,然后散列到一个桶。
#!/bin/bash
inet='eth0'
# Delete any existing traffic shaping
tc qdisc del dev $inet root
tc qdisc add dev $inet root handle 2: htb default 8000
tc class add dev $inet parent 2: classid 2:6000 htb rate 100mbit
# Create a single hash table (901) with 256 buckets
tc filter add dev $inet parent 2: handle 901: protocol ip u32 divisor 256
# Direct traffic from 172.16.16.0 - 172.16.31.255 to link 901, hash on last octet of src ip
tc filter add dev $inet protocol ip parent 2: u32 ht 800:: match ip src 172.16.16.0/20 hashkey mask 0x000000ff at 12 link 901:
# Create classes for each host, place it under root class 2: (100mb for all)
for i in {1..2815}; do
hex_handle=$(echo "obase=16; $i" | bc)
tc class add dev $inet parent 2:6000 classid 2:$hex_handle htb rate 1mbit ceil 6mbit || exit 1;
done
# Add filters for each possible host
for y in {16..27}; do
for x in {1..255}; do
j=$(( (($y - 16) * 255) + $x ));
hex_bucket=$(echo "obase=16; $x" | bc)
hex_handle=$(echo "obase=16; $j" | bc)
tc filter add dev $inet protocol ip parent 2: handle ::$hex_handle u32 ht 901:$hex_bucket match ip src 172.16.$y.$x flowid 2:$hex_handle || exit 1;
done
done
关于linux tc,u32过滤奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21454155/
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
我有一个表student,其中的列dte_date(日期)具有值(2019-01-01、2019-02-01、2019-03-01)。 .等) 条件: dte_date 列中没有重复值。 但 dte_
我有一些逻辑可以根据不活动的用户创建通知。我正在获取具有以下属性的用户列表。我想做的只是在部门有非 Activity 用户时触发我的创建通知方法。因此,给出下面的列表,基本上会创建 1 个通知,表示部
使用 GPS 开发跟踪应用程序。一切都很好,但有时由于封闭区域或恶劣天气,我得到的分数不准确。当您绘制它们时,它看起来不对,有很多跃点/跳跃。 我应该运行什么算法来过滤掉不良信号对我来说,这看起来像是
我正在尝试按变量类型过滤对象数组。节点是一个具有位置的对象,但以不同的方式定义——作为点、矢量或附件。这是一个代码: class Joint { var position:Position
我想做的是在向量上创建一个过滤器,以便它删除未通过谓词测试的元素;但不太确定我该怎么做。 我根据谓词评估输入向量中的每个元素,例如在我的代码中,is_even 仿函数在 device_vector 向
我是 Gremlin 的新手,我正在使用 Gremlin 3.0.2 和 Stardog 5.0。我编写此查询是为了找出 schema.org 本体中两个实体之间的路径。以下是输出 - gremlin
考虑以下示例数据表, dt 30 的那一行需要去 - 或者如果其中两行 > 30相隔几秒钟,删除所有 3 个。然而 ,当我们有 4 行或更多行时,我们需要删除时间差 > 30 没有另一对 < 30
我正在考虑使用 ZeroMQ,并尝试了一些示例。但是,我无法验证 ZeroMQ 是否支持一些重要的要求。我希望你能帮助我。 我将使用这个简单的场景来问我的问题: 出版商(例如交易所)提供(大量)股票的
我需要从我的查询中过滤掉大量的对象。目前,它正在抓取类中的所有对象,我想将其过滤为查询字符串中的相关对象。我怎样才能做到这一点?当我尝试时,我收到一个属性错误说明 ''QuerySet' object
如何在 Prometheus 查询中添加标签过滤器? kube_pod_info kube_pod_info{created_by_kind="ReplicaSet",created_by_name=
我有包含字符串的列的数据框,并希望过滤掉包含某些字符串以外的任何内容的所有行。考虑下面的简化示例: string % dplyr::filter(stringr::str_detect(string,
我有以下数据框,其中包含多行的角度变化值: 'data.frame': 712801 obs. of 4 variables: $ time_passed: int 1 2 3 4 5 6
我有一个 BehaviorSubject我希望能够filter ,但要保持新订阅者在订阅时始终获得一个值的行为主题式质量,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用 rxjs 的内置函数来
我有一个 RSS 提要,每天输出大约 100 篇文章。我希望过滤它以仅包含更受欢迎的链接,也许将其过滤到 50 个或更少。回到当天,我相信您可以使用“postrank”来做到这一点,但在谷歌收购后现已
我有这样一个重复的xml树- this is a sample xml file yellowred blue greyredblue 如您所见,每个项目可以具有不同数量的颜色标签
我以为我在 Haskell 学习中一帆风顺,直到... 我有一个 [[Int]] tiles = [[1,0,0] ,[0,1,0] ,[0,1,0]
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我在 mongoDB 中有这个架构: var CostSchema = new Schema({ item: String, value: Number }); var Attachm
给定一个数据框“foo”,我如何才能只选择“foo”中的那些行,例如foo$location =“那里”? foo = data.frame(location = c("here", "there",
我是一名优秀的程序员,十分优秀!