Linux下的网络输入输出流量的带宽控制(2015-11-23更新)
Linux下的网络输入输出流量的带宽控制
整理者:赤子玄心
QQ:280604597
Email:280604597@qq.com
大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的
1 概念
Linux中可以对不同网卡的网络输入输出的数据包做复杂的带宽控制,可以做到针对输入或输出的数据包的不同的源发地址、不同的源发端口、不同的目的地址、不同的目的端口做不同的带宽控制。
Linux中的QoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行输入流量的带宽控制,出口部分主要用于进行输出流量的带宽控制。
Linux是通过队列对网络流量进行带宽控制,大多数队列(qdisc)都是用于输出流量的带宽控制,例如HTB队列等,而输入流量只有一个队列,即Ingress队列。HTB队列的可以设置复杂的队列规则,从而灵活的控制输出流量的带宽,而ingress队列的功能很简单,不可指定复杂的队列规则,但可以重定向数据包incoming packets。如果要对输入流量做复杂的带宽控制,可以通过Ingress队列把输入流量重定向到虚拟设备ifb,然后对虚拟设备ifb的输出流量配置HTB队列,就能达到对输入流量设置复杂的队列规则。
Linux的每个网络设备上,默认都会有一个输出队列,默认没有输入队列。添加新的输出队列会覆盖默认的输出队列。
当队列的带宽被占满时,操作系统就会延迟发送数据包,再不行就丢包。
2 HTB队列
2.1 模型
2.2 简介
队列等级划分:一个HTB队列有且只有一个根分类,一个根分类下可以有零至多个主分类,一个主分类下可以有零至多个子分类,一个子分类下还可以有零至多个子分类,……
所有分类的流量统计是在这个分类的入口做的。
所有分类的流量带宽控制是在这个分类的通道里做的。
只有根分类入口上能添加过滤器,其他队列入口只做分流,即使添加过滤器也不会触发。
过滤器只能把数据包扔给最底层的队列,如果该队列有子分类,则数据包不能扔给这个队列,因为有子分类的主分类或子分类是没有队列通道的。注意:如果一定要扔给父队列,这个过滤器能添加成功,且过滤器还能匹配成功,但是数据包就是不走这个队列。
经过测试,发现子分类的带宽不受父分类的带宽控制。
网络设备名:网络设备的名字,一般叫ethX,用ifconfig或ip link命令查看。
虚拟网络设备名:虚拟网络设备的名字,一般叫ifbX,用ifconfig或ip link命令查看。
优先级:优先处理的等级,为整数,数值越低优先级越高。经过测试,发现htb队列的优先级高低没有对数据包产生影响。
队列的优先级由高到低为0、1、2、3、4、5、6、7,最高为0,最低为7。如果过滤器的优先级为0,会导致无法删除此过滤器。
3 输出流量控制
注意:tc命令都是实时生效的。
3.1 查看根分类
Shell命令:tc [-s] qdisc show dev 网络设备名
注意:-s选项表示显示网络流量信息。
例如:tc qdisc show dev eth0
解释:查看eth0设备的队列信息。
例如:tc -s qdisc show dev eth1
解释:查看eth1设备的队列信息,并显示队列的网络流量信息。
3.2 添加根分类
Shell命令:tc qdisc add dev 网络设备名 root [handle 根分类句柄] htb [default 默认分类句柄]
注意:如果指定了默认分类句柄,当数据包在不被任何过滤器匹配成功时候,就走默认分类。如果指定的默认分类不存在或不指定,数据包就走根分类。
注意:如果要指定根分类句柄,那么其范围必须是大于等于1、小于等于ffff的十六进制数值。如果是其他数值或不指定,则会出现随机的句柄。
例如:tc qdisc add dev eth0 root htb
解释:在eth0设备上添加HTB队列的根分类,队列句柄为随机,默认分类为根分类。
例如:tc qdisc add dev eth0 root handle 1: htb
解释:在eth0设备上添加HTB队列的根分类,队列句柄为1:,默认分类为根分类。
例如:tc qdisc add dev eth1 root handle 2: htb default 2:1
解释:在eth1设备上添加HTB队列的根分类,队列句柄为2:,默认分类句柄为2:1的分类。
3.3 删除根分类
Shell命令:tc qdisc del dev 网络设备名 root
3.4 查看主分类或子分类
Shell命令:tc [-s] class show dev 网络设备名
注意:-s选项表示显示网络流量信息。
3.5 添加主分类或子分类
Shell命令:tc class add dev 网络设备名 [parent 父分类句柄] classid 该分类句柄 htb rate 保留带宽{MBps|KBps|Bps|Mbit|Kbit|bit} [ceil 共享带宽{MBps|KBps|Bps|Mbit|Kbit|bit}] [prio 优先级]
注意:如果指定的父队列句柄不存在或不指定时,则父分类就是根分类。
注意:如果不指定共享带宽,则共享带宽和保留带宽一样。
注意:如果指定的优先级为负数,则会导致命令执行失败。如果指定的优先级大于等于8,则优先级实际会设置成7。如果不指定优先级,则优先级实际会设置成0。
bit表示位每秒传输
Bps表示字节每秒传输
KBps表示千字节每秒传输
MBps表示兆字节每秒传输
1MBps=1000KBps
1KBps=1000Bps
使用Mbit、Kbit、bit单位控制输出流量带宽时,会导致控制不准,控制输入流量带宽时没问题。
使用MBps、KBps、Bps单位控制输入输出流量带宽都很准。
例如:tc class add dev eth0 classid 1:1 htb rate 100MBps
解释:在eth0设备上添加主分类,父分类默认为根分类,该分类句柄为1:1,保留带宽为100MBps(800000Kbit),共享带宽默认与保留带宽一样,优先级默认为0。
例如:tc class add dev eth0 parent 1:1 classid 1:2 htb rate 50MBps ceil 100MBps prio 1
解释:在eth0设备上添加子分类,父分类为1:1,该分类句柄为1:2,保留带宽为50MBps(400000Kbit),共享带宽为100MBps(800000Kbit),优先级为1。
3.6 修改主分类或子分类
Shell命令:tc class change dev 网络设备名 classid 分类句柄 htb rate 保留带宽{MBps|KBps|Bps|Mbit|Kbit|bit} [ceil 共享带宽{MBps|KBps|Bps|Mbit|Kbit|bit}] [prio 优先级]
注意:保留带宽是必须要填的,且无法修改父分类。
注意:如果不指定共享带宽,则共享带宽和保留带宽一样。
注意:如果指定的优先级为负数,则会导致命令执行失败。如果指定的优先级大于等于8,则优先级实际会设置成7。如果不指定优先级,则优先级实际会设置成0。
3.7 删除主分类或子分类
Shell命令:tc class del dev 网络设备名 classid 分类句柄
注意:如果有过滤器的与要删除的队列有关联,必须先删除过滤器,然后才能删除该队列。
注意:如果要删除的队列有子队列时,必须先删除子队列,然后才能删除该队列。
3.8 查看过滤器
Shell命令:tc [-s] filter {show|ls} dev 网络设备名
3.9 添加过滤器
Shell命令:tc filter add dev 网络设备名 parent 根分类句柄 protocol ip [prio 优先级] u32 [match ip src 源发IP地址/XX] [match ip sport XXX 0xffff] [match ip dst 目的IP地址/XX] [match ip dport XXX 0xffff] flowid 分类句柄
注意:如果优先级为0或不指定,则优先级实际会设置成很大的一个数,也就是说优先级很低。
3.10 删除过滤器
删除指定优先级的所有过滤器:tc filter del dev 网络设备名 prio 优先级
删除指定句柄的单个过滤器:tc filter del dev 网络设备名 parent 根分类句柄 protocol ip prio 优先级 handle 句柄 u32
4 输入流量控制
加载虚拟网络设备驱动:
modprobe ifb
启用虚拟网络设备:
ip link set dev 虚拟网络设备名 up [txqueuelen 1000]
给网络设备添加ingress队列,ingress队列用于对输入流量控制:
tc qdisc add dev 网络设备名 ingress
注意:ingress队列的句柄默认是ffff:,无法修改。
将网络设备的输入流量重定向到虚拟网络设备的输出流量上:
tc filter add dev 网络设备名 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev 虚拟网络设备名
5 tc命令
tc qdisc
tc class {add | replace | change | del}
tc filter
6 例子
l 一个:
以下eth1为内网网卡地址
tc qdisc del dev eth1 root #删除以前的队列
tc qdisc add dev eth1 root handle 1: htb #开启限速规则为htb(分层令牌桶)
tc class add dev eth1 parent 1: classid 1:1 htb rate 3mbit burst 15k #规划限制带宽为3M峰值15k
tc qdisc add dev eth1 parent 1:1 handle 10: sqf perturb 10 #设定平均分配带宽
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.8.17 flowid 1:1 #限制192.168.8.17速度为3mbit
Linux下的网络输入输出流量的带宽控制(2015-11-23更新)的更多相关文章
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- Linux下的网络远程安装
Linux下的网络远程安装 1.用RHEL6.5光盘安装第一台服务器 2.在第一台服务器上配置YUM服务器 先创建一个挂载 #mount #umount /dev/cdrom #mkdir /mnt/ ...
- 八、Linux下的网络服务器模型
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器,按处理方式来分有循环服务器和并发服务器. 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提 ...
- linux下Python网络编程框架-Twisted安装
Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...
- netstat 在windows下和Linux下查看网络连接和端口占用
假设忽然起个服务,告诉我8080端口被占用了,OK,我要去看一下是什么服务正在占用着,能不能杀 先假设我是在Windows下: 第一列: Proto 协议 第二列: 本地地址[ip+端口] 第三列:远 ...
- linux下python启动第三方程序,并控制关闭
import subprocess import os import signal p = subprocess.Popen("recordmydesktop -o /home/test/t ...
- linux下socket connect 阻塞方式 阻塞时间控制
同事今天问我,如何在linux下的c代码里面控制connect的阻塞时间.应用的背景是:linux下的c程序有两个目标IP需要connect,如果用阻塞方式,当其中一个IP不能连接的情况下,程序将阻塞 ...
- Linux下SVN部署/安全及权限配置,实现web同步更新
转自:http://www.cnblogs.com/me115/archive/2013/04/07/3002058.html 本文包含以下内容: SVN服务器安装 SVN权限管理 SVN使用SASL ...
- linux下如何使用vnstat查看服务器带宽流量统计
因为很多vps或者服务器都是限流量的,但是又很多服务商并没有提供详细的流量表,比如每天的流量表,所以肯定有人很想知道自己服务器到底跑了多少流量. vnstat就是一个很好用的服务器流量统计命令.我截几 ...
- LInux下实时网络流量监控工具nload教程
https://jingyan.baidu.com/article/642c9d340cbef0644a46f72a.html http://blog.csdn.net/u014171641/arti ...
随机推荐
- SQL 查询 总结 【行子查询 ; 列子查询 ; 表子查询 ; 自链接 ; 内连接 ;外连接 ; 无规则链接 ……】
简单介绍一下连接方式: 1.1.使用无连接规则连接两表 无限规则 也就简单的 select * from tableA , tableB 即得到一个笛卡尔积. 什么是 笛卡尔积 在 我的 另外 ...
- WPF入门教程系列三十 ——DataGrid验证
WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...
- SaaS软件工程师成长路径
背景 SaaS软件工程师的成长需要循序渐进,和SaaS业务一样有耐心.SaaS工程师需要在"业务"."技术"."管理"三个维度做好知识储备. ...
- 如何将Maven项目快速改造成一个java web项目(方式一)
因为实际需要,需要将一个maven项目改造成原生的java-web项目,写这边博客 来记录整个改造的过程.原始的maven项目,使用IDEA打开后,目录结构如下所示 直接通过文件夹查看项目结果如下 首 ...
- Centos7中Oracle占用CPU过高(解决方案)
Centos7中Oracle占用CPU过高(解决方案) 前言: 99%的问题几乎都是SQL的问题,一般SQL可能会出现以下几种情况: 相关SQL搜索条件没有加索引 索引失效 联合查询过多 数据量过大 ...
- 压测工具sysbench的使用
前言 sysBench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.sysbench提供如下测试: (1)CPU性能 (2)磁盘IO性能 (3)调度程 ...
- 你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序
目录 说明 设置提醒时间,及休息时间 久坐提醒倒计时 休息提醒倒计时 休息到计时 代码说明 主窗体设置 工作到计时 休息倒计时 源码 久坐提醒桌面小程序: 干这行职业病比较多,之前用爱丽(即:玻璃酸钠 ...
- PHP秒杀面试题
什么是秒杀系统:秒杀系统是一个处理大量并发用户请求的系统,通常用于限时促销或特定活动中,用户可以在特定时间内以抢购的方式购买商品或服务. 秒杀系统可能面临的挑战是什么?秒杀系统可能面临以下挑战: 高并 ...
- JS逆向实战21——某查查webpack密码加密
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 网站 aHR0cHM6Ly ...
- 文心一言 VS 讯飞星火 VS chatgpt (83)-- 算法导论8.1 4题
四.用go语言,假设现有一个包含n个元素的待排序序列.该序列由 n/k 个子序列组成,每个子序列包含k个元素.一个给定子序列中的每个元素都小于其后继子序列中的所有元素,且大于其前驱子序列中的每个元素. ...