字节与位 @ Linux TC

字节与位 @ Linux TC

在使用时,我对“字节”和“位”的用法感到困惑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;
}

相关内容