flowadm - 针对连接、协议、服务、容器和虚拟机管理带宽资源控制和优先级
flowadm
flowadm show-flow [-P] [[ -p] -o field[,...]] [-v] [{ -l link | flow}]
flowadm match-flow [-P] [[-p] -o field[,...]] [-v] [-l link] -a attr=value[,...]
flowadm add-flow [-t] [-R root-dir] -l link -a attr= value[,...] [-p prop=value[,...]] flow flowadm remove-flow [-t] [-R root-dir] {-l link | flow}
flowadm show-filter [-P] [[-p] -o <field>,...] [{-l <link> | <flow>}] flowadm match-filter [-P] [[-p] -o <field>,...] [-l <link>] -a <attr>=<value>[,...] flowadm add-filter -t -a <attr>=<value>[,...] <flow> flowadm remove-filter [-t] {<filter> | -a <attr>=<value>[,...] <flow>}
flowadm set-flowprop [-t] [ -R root-dir] -p prop=value[,...] flow flowadm reset-flowprop [-t] [-R root-dir] [-p prop[,...]] flow flowadm show-flowprop [-P] [[-c] -o field[,...]] [-l link] [-p prop[,...]] [ flow]
flowadm help [subcommand-name]
flowadm 命令用于为特定链路上的某类通信创建、修改、删除和显示网络带宽、优先级以及关联资源。
flowadm 命令允许用户针对传输、服务或子网管理网络带宽资源。可以以以下全部或部分属性的组合来指定服务:传输、本地端口、远程端口、本地 IP 地址和远程 IP 地址。子网由其 IP 地址和子网掩码指定。该命令可在任何类型的数据链接上使用,包括物理链接、虚拟 NIC 以及链路聚合。flowadm 命令不可在 Open vSwitch 管理的数据链路上使用。有关更多信息,请参见 dladm(8) 手册页。
流定义为基于第 3 层和第 4 层标头的属性集合,可用于标识协议、服务、单个连接或虚拟机。
流过滤器定义为 L3/L4 属性的元组。一个流可以包含多个流过滤器、统计信息和可选的资源控制属性。所有元组必须具有相同的签名(属性的组合)。
对于什么是有效的流名称,存在一些限制。流名称的长度不能超过 95 个字符,只能包含字母数字字符(a-z、A-Z 和 0-9)、下划线 ('_')、句点 ('.') 和短划线 ('-'),并且必须以字母字符开头。
flowadm 命令可用于标识流,而无需强加任何带宽资源控制。与 flowstat(8) 一起使用可以更好地观察流。
在全局区域、非全局区域和内核区域中都能创建、修改和删除流。区域管理员仅可以在其区域(全局或非全局)中创建流。然而,在全局区域中创建的流可以迁移至非全局区域,以下段落中有述。管理员可以仅从其中创建流的区域(全局或非全局)内修改或删除流。从全局区域,用户可以查看系统上全局区域和任何非全局区域内的所有流。从非全局区域,用户仅可以查看此区域内的那些流。
管理员在全局区域中创建了流之后,与该流关联的数据链接可以分配至非全局区域。在此情况下,关联流也分配至同一非全局区域。当该非全局区域停止后,数据链接及其关联流将返回至全局区域。
不同的区域名区分同一名称的流。例如,用户可以拥有三个名为 fastpak 的流,如果每个 fastpak 位于不同的区域。例如,zone1/fastpak、zone2/fastpak 和 zone3/fastpak 都是有效的区域名称。
flowadm 是作为一组具有相应选项的子命令实现的。选项在每个子命令的上下文中进行了说明。如果在不使用子命令的情况下调用 flowadm,则会显示在系统上配置的所有流。有关更多信息,请参见下文的“示例”。
支持以下子命令:
为所有流(一个链路上的所有流)或者为指定的流显示流配置信息。输出按排位顺序显示,也就是说,将首先在输出中的第一个流中搜索给定的包,依此类推。
要显示的输出字段的列表,这些字段不区分大小写,并且由逗号分隔。字段名必须是以下所列字段之一,或为特殊值 all,以显示所有字段。对于找到的每个流,可显示以下字段:
流的名称。
流所在的链接名。
要使用的传输层协议名称。
流的本地 IP 地址。如果未指定,将显示为 '--'。
流的本地服务端口。
流的远程 IP 地址。如果未指定,将显示为 '--'。
流的远程服务端口。
流方向。值为 in 表示仅入站,值为 out 表示仅出站,值为 bi 表示双向。
流和掩码的区分服务值,与 DSFLD 值结合使用,用以指定 IP 数据包头的区分服务字段中受关注的位。此字段在缺省的 flowadm 输出中不会显示,但可以通过以下命令来显示:
flowadm show-flow -o all or flowadm show-flow -o flow,dsfld
流的 IP 地址。此地址可以是本地的,也可以是远程的,具体取决于流的定义。此字段已过时,提供它只是为了实现向后兼容性。因此,除非使用 –o 选项指定,否则缺省情况下不会显示。鼓励用户改为使用 laddr 和 raddr。
指定创建此流的进程的 PID。此字段只对系统生成的流有意义,对于用户生成的流将显示 '--'。
系统生成的流具有前缀 "<id>.sys.sock",是由应用程序通过使用 SO_FLOW_SLA 选项调用 setsockopt() 而生成的临时流。
使用稳定的可供计算机解析的格式显示。
显示持久流属性信息。
显示指定链接上所有流的信息或指定流的信息。
显示流及其所有流过滤器的输出。与 –p 选项不兼容。
在系统上的现有流中查找可能与指定的流属性列表匹配的项。如果返回了多个流,则它们会按照在查找包的流分类时的顺序显示。
使用稳定的可供计算机解析的格式显示。
显示持久流属性信息。
请参见上文中 show-flow 子命令的 –o 字段说明。
将匹配项限制为指定链路上的流。如果未指定链路,则使用所有链路上的流。
以逗号分隔的属性列表,用作查找匹配流的键。
显示匹配流及其所有匹配流过滤器的输出。与 –p 选项不兼容。
将流添加到系统。流由其流属性标识。
作为标识特定流的一部分,可以限制它的带宽资源和优先级。
更改是临时的,在重新引导期间不会持续存在。持续存在是缺省值。
指定备用根目录,其中 flowadm 应应用持久创建。
指定将向其添加流的链接。
要设置为指定值的以逗号分隔的属性列表。
要设置为指定值的以逗号分隔的属性列表。
删除由其链接或名称标识的现有流。
更改是临时的,在重新引导期间不会持续存在。持续存在是缺省值。
指定备用根目录,其中 flowadm 应应用持久删除。
如果指定一个链接,则从该链接删除所有流。如果指定单个流,则仅删除该流。
显示所有流(一个链路上的所有流)或指定流的流过滤器信息。输出按排位顺序显示,也就是说,将首先在输出中的第一个流过滤器中搜索给定的包,依此类推。
请参见 show-flow 部分。
使用稳定的可供计算机解析的格式显示。
显示指定链路上的所有流过滤器或指定流的流过滤器的信息。
在系统上的现有流中查找可能与指定的流属性列表匹配的过滤器。如果返回了多个流过滤器,则它们会按照在查找包的流分类时的顺序显示。
使用稳定的可供计算机解析的格式显示。
显示持久流属性信息。
请参见上文中 show-flow 子命令的 –o field 说明。
将匹配项限制为指定链路上的流。如果未指定链路,则使用所有链路上的流。
以逗号分隔的属性列表,用作查找匹配过滤器的键。
将过滤器添加到指定的流。一个流的所有过滤器必须具有相同的签名。当前,只能添加临时流过滤器,并且必须指定 –t 选项。
要设置为指定值的以逗号分隔的属性列表。
从指定的流中删除过滤器。可以通过指定过滤器名称或其属性以及流名称来删除过滤器。
请注意,过滤器的名称由系统生成,其格式是一个专用接口。只能保证 show-filter 输出中的过滤器名称可与 remove-filter 一起使用。
要设置为指定值的以逗号分隔的属性列表。
设置按名称指定的流上的一个或多个属性的值。使用 show-flow 子命令可以检索完整的属性列表。
更改是临时的,在重新引导期间不会持续存在。持续存在是缺省值。
指定备用根目录,其中 flowadm 应应用持久属性设置。
要设置为指定值的以逗号分隔的属性列表。
将指定流上的一个或多个属性重置为其缺省值。如果未指定属性,则重置所有属性。请参见 show-flowprop 子命令了解属性说明,其中包含它们的缺省值。
指定重置为临时重置。临时重置将持续到下一次重新引导。
指定备用根目录,其中 flowadm 应应用持久属性设置。
要重置的以逗号分隔的属性列表。
显示所有流、指定链接上的流或指定流的一个或多个属性的当前值或持久值。
缺省情况下,将显示当前值。如果未指定属性,所有可用流属性都将显示。对于每个属性,将显示下列字段:
流的名称。
属性的名称。
属性的权限。'r-' 表示只读属性,'rw' 表示属性即可读也可写。
当前(或持久性)属性值。如果该值未设置,则显示为 --(双连字符),如果该值未知,则显示为 ?(问号)。尚未设置或尚未重置的持久性值将显示为 --,并且将使用系统的 DEFAULT 值(如果有)。
系统设置的有效属性值。如果该值未设置,则显示为 --(双连字符),如果该值未知,则显示为 ?(问号)。
属性的缺省值。如果属性无缺省值,则显示 --(双连字符)。
属性可具有的值的逗号分隔列表。如果这些值跨越一定的数字范围,最小值和最大值可能会显示为缩写。如果可能值未知或无限制,则显示 --(双连字符)。
流属性在以下“流属性”部分中有述。
使用稳定的可供计算机解析的格式显示。
显示持久流属性信息。
要显示的属性的逗号分隔列表。
显示所有支持的 flowadm 子命令或给定子命令的用法。如果您显示特定子命令的帮助信息,则会显示命令语法和一个示例。使用不带参数的 flowadm help 可以显示所有子命令。
在 flowadm 命令中标识流的流操作数是一个来自以下列表的以逗号分隔的一个或多个关键字、值对列表。
按本地 IP 地址标识网络流。value 必须是采用点分十进制记法的 IPv4 地址或采用冒号分隔记法的 IPv6 地址。prefix_len 是可选项。
如果指定了 prefix_len,它会说明子网地址的网络掩码,然后按照相同的命名约定说明 ifconfig(8) 和 route(8) 地址。如果未指定,给定的 IP 地址将被视为主机地址,其 IPv4 地址的缺省前缀长度是 /32,对于 IPv6,为 /128。
按远程 IP 地址标识网络流。语法与 local_ip 属性相同
标识要使用的层 4 协议。通常结合 local_port 或 remote_port 使用,以标识需要特别关注的本地或远程服务。
标识由本地端口指定的服务。
标识由远程端口指定的服务。
表示流方向为仅入站、仅出站或双向。如果未指定这些属性,则会将流视为双向。
标识 8 位区分服务字段(如 RFC 2474 中所定义)。
可选的 dsfield_mask 用于在与 dsfield 值比较时,指定区分服务字段中受关注的位。位位置中的 0 表示该位值需要忽略,1 则表示不要忽略。掩码范围可以是从 0x01 到 0xff。 如果未指定 dsfield_mask,将使用缺省掩码 0xff。dsfield 值和掩码必须为十六进制。
允许使用属性的所有组合。这去除了早期发行版中的限制,在早期发行版中仅允许使用某些组合。
可以在一个链路上创建具有不同的属性组合的流。这去除了早期发行版中的限制,在早期发行版中,一个给定链路上的所有流都必须具有相同的流属性组合。请注意,当创建具有不同属性组合的流时,它们可以是互斥的,也可以是重叠的(非独占)。
在后一种情况下,各个流将根据在创建流时指定的属性数目进行排位。具有相同属性数的流将根据系统缺省策略进行排位。flowadm show-flow 命令的输出按照排位顺序列出给定链路上的流,也就是说,将首先在输出中的第一个流中搜索给定的包,依此类推。
请注意,流的重叠并不意味着存在任何嵌套流。每个流都是独立的,并且诸如 maxbw 等流属性和流统计信息的范围始终限制为一个流。例如,分类为具有 5 个属性的 TCP 套接字级别流的包不会进一步分类为具有 1 个属性的 TCP 传输流。
此处存在个别流限制与各区域流限制。
个别流限制针对每个流,属性只能列一次。例如,以下命令无效:
# flowadm add-flow -l vnic1 -a local_port=80,local_port=8080 httpflow
transport 和 local_port 或者 transport 和 remote_port:
TCP、UDP 或 SCTP 流可通过 local_address、local_port、remote_address 和/或 remote_port 进行指定。不允许指定端口的 ICMP 或 ICMPv6 流。
以下命令有效:
# flowadm add-flow -l e1000g0 -a transport=udp udpflow # flowadm add-flow -l e1000g0 -a transport=tcp,local_port=80 \ udp80flow
以下命令无效:
# flowadm add-flow -l e1000g0 -a transport=icmpv6,remote_port=16 \ flow16各区域流限制
在一个区域内,两个流不能具有相同的名称。添加具有指定链接的流后,显示、修改或删除该流时无需此链接。
以下流属性均受支持。请注意,将给定属性设置为给定值的功能取决于驱动程序和硬件。
设置流的全双工带宽。此带宽指定为一个带有某个容量级后缀(分别表示 Kbps、Mbps 和 Gbps 的 K、 M 或 G)的整数。如果未指定单位,输入值将以 Mbps 为单位进行读取。缺省值是无带宽限制。
设置流的优先级。priority 值可以是 'high'、'medium' 和 'low' 之一。priority 的缺省值为 'medium'。
将流的该标记设置为 'high' 具有以下效果:归类给该流的包将优先于同一链路上的常规流中的包进行处理。此外,如果 NIC 具有流负载转移功能,该流还将负载转移到 NIC。高优先级流可能延迟更短,具体取决于可用的系统资源。
流的带宽份额是同一数据链路上存在来自其他流的竞争时该流将获得的最小带宽份额。请注意,在所有活动的流中分配带宽。分配量与其份额成比例。例如,
# flowadm set-flowprop -p bw-share=40 flow1 # flowadm set-flowprop -p bw-share=10 flow2
假定 1Gbps 链路并且假定 flow1 和 flow2 这两个流是唯一的流,则 flow1 最多可以具有 800 Mbps (1Gbps * 40/(40+10)),flow2 最多可以具有 200 Mbps (1Gbps * 10/(40+10))。
以上示例假定两个流都具有通信来使用其带宽份额。但是,如果 flow1 仅使用 100Mbps,则 flow2 可高达 900 Mbps。带宽份额的目的是当存在使用带宽的流时不浪费带宽,同时当存在来自其他流的竞争时确保分配的份额。
当前仅在某些 NIC 上支持此属性。dladm show-linkprop -H -p bw-share 命令用于确定给定链路上是否支持 bw-share 属性。值范围可以从 1 到 100。该值是相对份额值,不指示带宽的百分比。有效值列显为物理链路带宽的百分比。这是存在竞争时确保分配给流的最小带宽百分比。有效值可以根据链路上的其他流不同而保持更改。
其他流可以是环组 VNIC,即具有专用环组硬件资源的 VF-VNIC。例如,数据链路具有独占环组 vnic1、硬件流量 tcpflow1 和 udpflow1。
#dladm show-linkprop -pbw-share vnic1 LINK PROPERTY PERM VALUE EFFECTIVE DEFAULT POSSIBLE vnic1 bw-share rw 10 33.33% -- 1-100 #flowadm show-flowprop -pbw-share FLOW PROPERTY PERM VALUE EFFECTIVE DEFAULT POSSIBLE tcpflow1 bw-share rw 10 33.33% -- 1-100 udpflow1 bw-share rw 10 33.33% -- 1-100
在流的所有传出 IP 包上设置指定的 DSCP 值。有效值为 0 到 63。必须以十进制形式指定该值。对于 IPV4,在 DSCP 字段中设置六个 DSCP 位,对于 IPv6,在流量类字段中设置 6 个 DSCP 位。两个 ECN 位保持不变。这符合 RFC 2474。
请注意,如果在流上设置 'dscp' 属性并且包分类为该流,将覆盖应用程序使用 setsockopt(3C) 设置的任何 IP_TOS 值。
显示/指定是否将流负载转移到底层 NIC。有效值为 "auto"、"on" 和 "off",缺省值为 "auto"。如果 NIC 能够进行负载转移,则可能的值字段显示 "on",值 "auto" 表示由系统确定。有效值字段显示 NIC 负载转移的当前值。值 "on" 表示将对流进行负载转移或者 flowadm 将失败,值 "off" 表示不会对流进行负载转移。
可以在任何时间(包括创建流时)指定 hw-flow 属性。强烈建议将 hw-flow 值留为 "auto"(缺省值)而非将其设置为 "on"。在某些情况下(例如,目标端口不支持流负载转移时 DLMP 聚合上的 VNIC 迁移或 VNIC 故障转移),将 hw-flow 属性设置为 "on" 会导致失败。请注意,在任何情况下均可设置为 hw-flow=off。
对于支持独占环组资源的底层链路,hw-flow 意味着请求底层链路为流分配专用硬件环组资源。
使用专用环组时,流分类可以由底层硬件来完成。这将提高数据路径性能并节省流的 CPU 使用率。除了改善资源隔离,具有专用环组的流还将从硬件 SLA 实施中获益。
priority 和 rank 仅适用于共享环组流,因此,这两个属性不会针对硬件环组流显示。
示例:
#dladm show-linkprop -pring-group net5 LINK PROPERTY PERM VALUE EFFECTIVE DEFAULT POSSIBLE net5 ring-group r- exclusive exclusive -- --
特定底层链路只能支持具体流属性获取硬件网络流。有关更多详细信息,请参见底层链路驱动程序手册页。
例如,i40e 驱动程序仅支持以下流属性。
# flowadm add-flow -lnet3 -a transport=udp,local_ip=19.0.0.2,local_port=8888 -phw-flow=on udpflow1 # flowadm add-flow -lnet3 -a transport=tcp,local_ip=19.0.0.2,local_port=5000, remote_ip=19.0.0.1,remote_port=5001 -phw-flow=on tcpflow1
指定流的排位。rank 的有效值为 1 到 65535。
不要求在所有流上设置 rank 属性。指定了 rank 属性的流在查找顺序中始终位于未指定 rank 属性的流之前。
排位值较低的流在查找顺序中位于排位值较高的流之前。可以存在具有相同排位的两个流。在这种情况下,根据缺省的系统策略,将会中断任何关联。
下面的命令在未使用参数的情况下调用了 flowadm,因此显示了系统中的所有流。
# flowadm FLOW LINK PROTO LADDR LPORT RADDR RPORT DIR tcpflow net0 tcp -- -- -- -- bi udpflow net0 udp -- -- -- -- bi示例 2 围绕重点端口创建策略
以下命令将围绕 HTTPS 服务器上的传入 HTTPS 通信流量创建策略,以便 HTTPS 获取专用 NIC 硬件和内核 TCP/IP 资源。稍后可使用指定的名称 https-1 修改或删除该策略。
# flowadm add-flow -l net0 -a transport=TCP,local_port=443 https-1 # flowadm show-flow -l net0 FLOW LINK PROTO LADDR LPORT RADDR RPORT DIR https-1 net0 tcp -- 443 -- -- bi示例 3 修改现有策略以添加带宽资源控制
以下命令将修改之前示例中的 https-1 策略。该命令可以添加带宽控制。
# flowadm set-flowprop -p maxbw=500M https-1 # flowadm show-flow https-1 FLOW LINK PROTO LADDR LPORT RADDR RPORT DIR https-1 net0 tcp -- 443 -- -- bi
# flowadm show-flowprop https-1 FLOW PROPERTY PERM VALUE DEFAULT POSSIBLE https-1 maxbw rw 500 -- -- https-1 priority rw medium medium low,medium,high https-1 dscp rw -- -- 0-63 https-1 rank rw -- -- 1-65535 https-1 hw-flow r- off -- on,off示例 4 限制 UDP 带宽使用
以下命令将针对 UDP 协议创建策略,以便其无法使用超过 100Mbps 的可用带宽。将流命名为 limit-udp-1。
# flowadm add-flow -l net0 -a transport=UDP -p maxbw=100M \ limit-udp-1示例 5 为通过本地地址/端口定义的流设置策略
以下命令将为本地 IP 端口为 192.168.200.102:443 的 TCP 流创建策略。即,我们希望对 HTTPS 包进行特殊处理,以便这些包以高优先级进行传送,并且最大带宽为 800 Mbps。
# flowadm add-flow -l net0 -a transport=tcp,\ local_ip=192.168.200.102,local_port=443 \ -p priority=high,maxbw=800M my-https
# flowadm show-flow FLOW LINK PROTO LADDR LPORT RADDR RPORT DIR my-https net0 tcp 192.168.200.102 443 -- -- bi
# flowadm show-flowprop FLOW PROPERTY PERM VALUE DEFAULT POSSIBLE my-https maxbw rw 800 -- -- my-https priority rw high medium low,medium,high my-https dscp rw -- -- 0-63 my-https rank rw -- -- 1-65535 my-https hw-flow r- off -- on,off示例 6 为通过本地/远程地址/端口定义的流设置策略
以下命令将为本地 IP 端口为 192.168.200.102:443、远程 IP 端口为 192.168.200.104:12785 的 TCP 流创建策略。即,我们希望对通过特定远程 IP 端口通信的 HTTPS 包进行特殊处理。属于此流的所有包都将以高优先级进行传送。同时,此流不能使用超过 800 Mbps 的可用带宽。
# flowadm add-flow -l net0 -a transport=tcp,\ local_ip=192.168.200.102,local_port=443,\ remote_ip=192.168.200.104,remote_port=12785 \ -p priority=high,maxbw=800M my-flow
# flowadm show-flow FLOW LINK PROTO LADDR LPORT RADDR RPORT DIR my-flow net0 tcp 192.168.200.102 443 192.168.200.104 12785 bi
# flowadm show-flowprop FLOW PROPERTY PERM VALUE DEFAULT POSSIBLE my-flow maxbw rw 800 -- -- my-flow priority rw high medium low,medium,high my-flow dscp rw -- -- 0-63 my-flow rank rw -- -- 1-65535 my-flow hw-flow r- off -- on,off示例 7 设置策略,利用 dsfield 属性
以下命令将针对具有 500 Mbps 的带宽的 EF PHB(101110 的 DSCP 值来自 RFC 2598)设置策略。该流的 dsfield 值将是 0x2e (101110) ,而 dsfield_mask 为 0xfc(因为我们希望忽略两个最低有效位)。
# flowadm add-flow -l net0 -a dsfield=0x2e:0xfc -p maxbw=500M efphb-flow示例 8 查看多个区域中的流
以下命令将显示具有相同名称的两个流。第一个流位于全局区域中,第二个位于区域 zone1 中。 该命令从全局区域调用,使用户能够查看系统上的所有流。
# flowadm FLOW LINK PROTO LADDR LPORT RADDR RPORT DIR tcpflow net0 tcp -- -- -- -- bi zone1/tcpflow zone1/net0 tcp -- -- -- -- bi示例 9 获取创建系统流的进程
以下命令显示在给定一个系统流的情况下如何获取 PID 和进程名称。
# flowadm FLOW LINK PROTO LADDR LPORT RADDR RPORT DIR 1.sys.sock net5 tcp 10.1.5.100 51204 10.1.5.101 22 bi
# ps `flowadm show-flow -p -o pid 5.sys.sock` PID TT S TIME COMMAND 1581 pts/1 T 0:00 ssh 10.1.5.101
以下命令显示如何查找某个 PID 所创建的所有流。
# flowadm show-flow -p -o pid,flow | grep 1581 1581:1.sys.sock示例 10 为仅出站流设置带宽限制
以下命令显示如何创建出站流并为其设置一定的带宽限制。
# flowadm add-flow -l net4 -a remote_ip=10.1.5.101,direction=out backup # flowadm set-flowprop -p maxbw=500M backup
所有操作都成功执行。
出现错误。
有关下列属性的说明,请参见 attributes(7):
|
ifconfig(8)、attributes(7)、acctadm(8)、dladm(8)、flowstat(8)、ifconfig(8)、prstat(8)、route(8)
show-usage 子命令(在以前版本的 flowadm 中存在)已替换为 flowstat(8) –h 命令。