cgroup子系统net_cls 可以给 packet 打上 classid 的标签,用于过滤分类,这个classid就是用于标记skb所属的 qdisc class 的。有了这个标签,流量控制器(tc)可以对不同的 cgroup 的 packet 起作用,Netfilter(iptables)也可以基于这个标签有对应的动作。创建一个 net_cls cgroup 对应的是创建一个 net_cls.classid 文件,这个文件初始化为 0。可以写 16 进制的 0xAAAABBBB 到这个文件里面,AAAA 是 major 号,BBBB 是 minor 号。读这个文件返回的是十进制的数字。

如下,创建两个cgroup组,每个组分配不同的handle号,指定不同的带宽。

root@ubuntu:/sys/fs/cgroup/net_cls# mkdir client
root@ubuntu:/sys/fs/cgroup/net_cls# cd client/
root@ubuntu:/sys/fs/cgroup/net_cls/client# l
cgroup.clone_children cgroup.procs net_cls.classid net_prio.ifpriomap net_prio.prioidx notify_on_release tasks
root@ubuntu:/sys/fs/cgroup/net_cls/client# echo 0x10010 > net_cls.classid
root@ubuntu:/sys/fs/cgroup/net_cls/client# cat net_cls.classid
65552
root@ubuntu:/sys/fs/cgroup/net_cls# mkdir server
root@ubuntu:/sys/fs/cgroup/net_cls# cd server/
root@ubuntu:/sys/fs/cgroup/net_cls/server# l
cgroup.clone_children cgroup.procs net_cls.classid net_prio.ifpriomap net_prio.prioidx notify_on_release tasks
root@ubuntu:/sys/fs/cgroup/net_cls/server# echo 0x10020 > net_cls.classid
root@ubuntu:/sys/fs/cgroup/net_cls/server# cat net_cls.classid
65568

接下来配置tc,写入到cgroup的net_cls.classid中的handle号,要与tc配置中的classid号相同

tc qdisc add dev ens8 root handle 1:0 htb default 1
tc class add dev ens8 parent 1:0 classid 1:1 htb rate 10000Mbit
tc class add dev ens8 parent 1:1 classid 1:10 htb rate 100Mbit ceil 100Mbit
tc class add dev ens8 parent 1:1 classid 1:20 htb rate 1000Mbit ceil 1000Mbit

设置过滤器:

tc filter add dev ens8 parent 1:1 protocol ip prio 10 handle 1:10 cgroup
tc filter add dev ens8 parent 1:1 protocol ip prio 10 handle 1:20 cgroup

接下来使用cgexec工具,来执行对应的程序,我们可以看到流量控制如我们的预期:

cgexec -g net_cls:server python test.py 129.9.123.89
bandwidth 95.9717340903 MB/s cgexec -g net_cls:client python test.py 129.9.123.89
bandwidth 11.3290806068 MB/s

修改带宽命令如下:

tc class change dev ens8 parent 1:1 classid 1:40 htb rate 512Kbit ceil 512Kbit

原理分析待续

使用cgroup和tc限制带宽的更多相关文章

  1. Linux 流量控制总结(TC)

    TC对带宽的描述:    mbps = 1024 kbps = 1024 * 1024 bps => byte/s    mbit = 1024 kbit => kilo bit/s.   ...

  2. Linux内核配置选项

    http://blog.csdn.net/wdsfup/article/details/52302142 http://www.manew.com/blog-166674-12962.html Gen ...

  3. 深入linux kernel内核配置选项

    ============================================================================== 深入linux kernel内核配置选项 ...

  4. Linux下针对路由功能配置iptables的方法详解

    作为公司上网的路由器需要实现的功能有nat地址转换.dhcp.dns缓存.流量控制.应用程序控制,nat地址转换通过iptables可以直 接实现,dhcp服务需要安装dhcpd,dns缓存功能需要使 ...

  5. 【转】 LINUX中IPTABLES和TC对端口的带宽限制 端口限速

    不管是iptables还是tc(traffic control)功能都很强大,都是与网络相关的工具,那么我们就利用这两个工具来对端口进行带宽的限制. 1.使用命令ifconfig查看服务器上的网卡信息 ...

  6. 使用tc配置后端设备,来限制虚拟机网卡带宽

    如果通过tc来限制虚拟机网卡接收方向带宽呢,实际上使用tc对接收方向限制的不够好,使用tc ingress可以限制接收,但是功能不够多,而且会形成丢包问题.一般是采用将流量重定向到一个虚拟设备ifb上 ...

  7. kubernetes集群pod使用tc进行网络资源限额

    kubernetes集群pod使用tc进行网络资源限额 Docker容器可以实现CPU,内存,磁盘的IO限额,但是没有实现网络IO的限额.主要原因是在实际使用中,构建的网络环境是往超级复杂的大型网络. ...

  8. Docker学习总结(一)—— namespace,cgroup机制

    1.namespace: Linux Namespaces机制提供一种资源隔离方案.PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace.每个 Namespace里 ...

  9. Linux TC 流量控制介绍

    前段时间在做一些测试的时候接触到了Linux tc,因为需要对数据包添加延迟,用到了tc中的netem.添加简单的延迟非常简单,像这样一条命令就搞定了:$ tc qdisc add dev eth0 ...

随机推荐

  1. Spring Boot 2.x基础教程:使用tinylog记录日志

    tinylog简介 tinylog,与其他各种tiny开头的东西一样,是一个轻量级的开源日志解决方案.它本身只包含两个JAR文件(一个用于API,另一个用于实现),没有任何外部依赖关系.两个JAR文件 ...

  2. 基于Xilinx XCKU115的半高PCIe x8 硬件加速卡

    一.板卡概述 本板卡系我公司自主研发,采用Xilinx公司的XCKU115-3-FLVF1924-E芯片作为主处理器,主要用于FPGA硬件加速.板卡设计满足工业级要求.如下图所示: 二.功能和技术指标 ...

  3. opencv笔记---contours

    一 Contour Finding Contours使用 STL-style vector<> 表示,如 vector<cv::Point>, vector<cv::Po ...

  4. Solution -「十二省联考2019」春节十二响

    题目 题意简述   link.   给一棵 \(n\) 个结点的有根树,点带权.把点分为若干组,并要求同组内不存在任何祖先-后代关系.最小化每组内的最大点权之和. 数据规模   \(n\le2\tim ...

  5. Solution -「LOCAL」模板

    \(\mathcal{Description}\)   OurOJ.   给定一棵 \(n\) 个结点树,\(1\) 为根,每个 \(u\) 结点有容量 \(k_u\).\(m\) 次操作,每次操作 ...

  6. 基于myscript.js的web手写板(支持中文识别)

    网上的手写板模板不少,但是支持中文识别的却不多,而且基本上都收费的,毕竟别人的中文库凭什么免费提供给你(说好的开源呢?说好的开源呢? ←_←) 好了,进入主题,myscript.js,在官网其实我并没 ...

  7. Java基于ClassLoder/ InputStream 配合读取配置文件

    阅读java开源框架源码或者自己开发系统时配置文件是一个不能忽略的,在阅读开源代码的过程中尝尝困惑配置文件是如何被读取到内存中的.配置文件本身只是为系统运行提供参数的支持,个人阅读源码时重点不大可能放 ...

  8. QQ表情代码大全,你知道几个??

    很久没有给大家分享代码了,今天趁着有点时间来给大家分享一下QQ空间的表情代码!不用感谢我,大家拿去用吧! [em]e100[/em] 微笑bai[em]e101[/em] 撇嘴[em]e102[/em ...

  9. operator的解释

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

  10. HTTP攻击与防护-函数注入攻击

    实验目的 1.了解eval注入的概念 2.了解eval注入攻击的方式 3.掌握防范攻击的方法 实验原理 1.了解eval注入的概念 2.了解eval注入攻击的方式 3.掌握防范攻击的方法 实验内容 1 ...