在使用时,我对“字节”和“位”的用法感到困惑linux tc
Linux tc-tbf说它使用“字节”
tbf——令牌桶过滤器
概要
tc qdisc ... tbf rate 速率突发字节数/单元(延迟毫秒 | 限制字节数)[mpu 字节数 [峰值速率速率 mtu 字节数/单元]。突发也称为缓冲区和最大突发。mtu 也称为最小突发。
但我发现它使用“bit”。它使用小写字母“b”
nimdrak@nimdrak-VirtualBox:~/custom/simple_experiment/link_capacity$
sudo tc -s -s -d c ls dev s2-eth3
class htb 1:1 root prio 0 quantum 200000 rate 200000Kbit ceil 200000Kbit
linklayer ethernet burst 65000b/1 mpu 0b overhead 0b cburst 65000b/1 mpu 0b
overhead 0b level 0
Sent 2265264968 bytes 37732 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 37732 borrowed: 0 giants: 0
tokens: 3098 ctokens: 3098
我认为 linux tc 使用“b,bit”作为标准单位,因为它在终端上显示“b”。
但我不确定。
我如何确定字节和位之间的区别?
太感谢了!
答案1
虽然使用了小写的“b”,但它实际上是“Byte”
TC
你可以在源代码中找到使用字节作为基本单位的内容
变量‘buffer’是突发值,由调试命令打印。
https://github.com/shemminger/iproute2/blob/master/tc/q_htb.c https://github.com/shemminger/iproute2/blob/master/tc/tc_util.c
<tc/q_htb.c>
//buffer is from burst argument
...
if (!buffer)
buffer = rate64 / get_hz() + mtu;
if (!cbuffer)
cbuffer = ceil64 / get_hz() + mtu;
<tc_utils.c>
int get_rate64(__u64 *rate, const char *str)
{
char *p;
double bps = strtod(str, &p);
const struct rate_suffix *s;
...
bps /= 8; /* -> bytes per second */
*rate = bps;
return 0;
}
...
static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
{
if (show_details) {
fprintf(f, "burst %s/%u mpu %s ",
sprint_size(buffer, b1),
1<<hopt->rate.cell_log,
sprint_size(hopt->rate.mpu, b2));
fprintf(f, "cburst %s/%u mpu %s ",
sprint_size(cbuffer, b1),
1<<hopt->ceil.cell_log,
sprint_size(hopt->ceil.mpu, b2));
fprintf(f, "level %d ", (int)hopt->level);
...
}
...
static void print_size(char *buf, int len, __u32 sz)
{
double tmp = sz;
if (sz >= 1024*1024 && fabs(1024*1024*rint(tmp/(1024*1024)) - sz) < 1024)
snprintf(buf, len, "%gMb", rint(tmp/(1024*1024)));
else if (sz >= 1024 && fabs(1024*rint(tmp/1024) - sz) < 16)
snprintf(buf, len, "%gKb", rint(tmp/1024));
else
snprintf(buf, len, "%ub", sz);
}
char *sprint_size(__u32 size, char *buf)
{
print_size(buf, SPRINT_BSIZE-1, size);
return buf;
}