flowadm
flowadm show-flow [-P] [[-p] -o field[,...]] [{-l link | flow}]
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 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 以及链路聚合。
流定义为基于层 3 和层 4 头的属性集合,可用于标识协议、服务或虚拟机。
对于什么是有效的流名称,存在一些限制。首先,流名称不能超过 31 个字符。其次,流名称中只能包含以下字符:字母数字字符 (a-z, A-Z, 0-9)、下划线 ('_')、圆点 ('.') 和短划线 ('-'),并且必须以字母开头。
传入和外发包以非常快速的可伸缩方式与流匹配,因此,可以在性能影响最小的情况下执行限制。
flowadm 命令可用于标识流,而无需强加任何带宽资源控制。与 flowstat(1M) 一起使用可以更好地观察流。
可以在全局区域、非全局区域和内核区域中创建、修改和删除流。区域管理员仅可以在其区域(全局或非全局)中创建流。然而,在全局区域中创建的流可以迁移至非全局区域,以下段落中有述。管理员只能从在其中创建流的区域(全局或非全局)修改或删除流。从全局区域,用户可以查看系统上全局区域和任何非全局区域内的所有流。从非全局区域,用户仅可以查看此区域内的那些流。
管理员在全局区域中创建了流之后,与该流关联的数据链接可以分配至非全局区域。在此情况下,关联流也分配至同一非全局区域。当该非全局区域停止后,数据链接及其关联流将返回至全局区域。
不同的区域名区分同一名称的流。例如,用户可以拥有三个名为 fastpak 的流,如果每个 fastpak 位于不同的区域。例如,zone1/fastpak、zone2/fastpak 和 zone3/fastpak 都是有效的区域名。
所有流配置都位于网络配置文件 (Network Configuration Profile, NCP) 中。可以在一个系统上定义任意数量的 NCP,但是始终只能有一个活动 NCP。使用 flowadm 命令所做的更改将应用于当前活动 NCP。
NCP 可以是“固定的”或“反应性的”。有一个固定 NCP,名为 DefaultFixed。有关 NCP 的更多信息,请参阅netcfg(1M)。
flowadm 是作为一组具有相应选项的子命令实现的。选项在每个子命令的上下文中进行了说明。如果在不使用子命令的情况下调用 flowadm,则会显示在系统上配置的所有流。有关更多信息,请参见下文的“示例”。
支持以下子命令:
显示所有流、某个链接上的所有流或指定的 flow 的流配置信息(缺省值)或统计信息。
要显示的输出字段的列表,这些字段不区分大小写,并且由逗号分隔。字段名必须是以下所列字段之一,或为特殊值 all,以显示所有字段。对于找到的每个流,可显示以下字段:
流的名称。
流所在的链接名。
要使用的传输层协议名称。
流的本地 IP 地址。如果未指定,将显示为 '--'。
流的本地服务端口。
流的远程 IP 地址。如果未指定,将显示为 '--'。
流的远程服务端口。
流和掩码的区分服务值,与DSFIELD值结合使用,以指定 IP 数据包头的区分服务字段中受关注的位。
流的 IP 地址。此地址可以是本地的,也可以是远程的,具体取决于流的定义。此字段已过时,提供它只是为了实现向后兼容性。因此,除非使用 –o 选项指定,否则缺省情况下不会显示。鼓励用户改为使用 laddr 和 raddr。
指定创建此流的进程的 PID。此字段只对系统生成的流有意义,对于用户生成的流将显示 '--'。
系统生成的流具有前缀 "<id>.sys.sock",是由应用程序通过使用 SO_FLOW_SLA 选项调用 setsockopt() 而生成的临时流。
使用稳定的可供计算机解析的格式显示。
显示持久流属性信息。
显示指定链接上所有流的信息或指定流的信息。
将流添加到系统。流由其流属性标识。
作为标识特定流的一部分,可以限制它的带宽、资源和优先级。
更改是临时的,在重新引导期间不会持续存在。持续存在是缺省值。
指定备用根目录,其中 flowadm 应应用持久创建。
指定将向其添加流的链接。
要设置为指定值的以逗号分隔的属性列表。
要设置为指定值的以逗号分隔的属性列表。
删除由其链接或名称标识的现有流。
更改是临时的,在重新引导期间不会持续存在。持续存在是缺省值。
指定备用根目录,其中 flowadm 应应用持久删除。
如果指定一个链接,则从该链接删除所有流。如果指定单个流,则仅删除该流。
设置按名称指定的流上的一个或多个属性的值。使用 show-flow 子命令可以检索完整的属性列表。
更改是临时的,在重新引导期间不会持续存在。持续存在是缺省值。
指定备用根目录,其中 flowadm 应应用持久属性设置。
要设置为指定值的以逗号分隔的属性列表。
将指定流上的一个或多个属性重置为其缺省值。如果未指定属性,则重置所有属性。请参见 show-flowprop 子命令了解属性说明,其中包含它们的缺省值。
指定重置为临时重置。临时重置将持续到下一次重新引导。
指定备用根目录,其中 flowadm 应应用持久属性设置。
要重置的以逗号分隔的属性列表。
显示所有流、指定链接上的流或指定流的一个或多个属性的当前值或持久值。
缺省情况下,将显示当前值。如果未指定属性,所有可用流属性都将显示。对于每个属性,将显示下列字段:
流的名称。
属性的名称。
属性的权限。'r-' 表示只读属性,'rw' 表示属性即可读也可写。
当前(或持久性)属性值。如果该值未设置,则显示为 --(双连字符),如果该值未知,则显示为 ?(问号)。尚未设置或尚未重置的持久性值将显示为 --,并且将使用系统的 DEFAULT 值(如果有)。
属性的缺省值。如果属性无缺省值,则显示 --(双连字符)。
属性可具有的值的逗号分隔列表。如果这些值跨越一定的数字范围,最小值和最大值可能会显示为缩写。如果可能值未知或无限制,则显示 --(双连字符)。
流属性在以下“流属性”部分中有述。
使用稳定的可供计算机解析的格式显示。
显示持久流属性信息。
要显示的属性的逗号分隔列表。
显示所有支持的 flowadm 子命令或给定子命令的用法。如果您显示特定子命令的帮助信息,则会显示命令语法和一个示例。使用不带参数的 flowadm help 可以显示所有子命令。
在 flowadm 命令中标识流的流操作数是一个来自以下列表的以逗号分隔的一个或多个关键字、值对列表。
按本地 IP 地址标识网络流。value 必须是采用点分十进制记法的 IPv4 地址或采用冒号分隔记法的 IPv6 地址。prefix_len 是可选项。
如果指定了 prefix_len,它将描述子网地址的网络掩码,并与 ifconfig(1M) 和 route(1M) 地址遵循相同的表示法约定。如果未指定,给定的 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 值和掩码必须为十六进制。
支持以下属性组合:
local_ip=address[/prefix_len] remote_ip=address[/prefix_len] transport={tcp|udp|sctp|icmp|icmpv6} transport={tcp|udp|sctp},local_port=port transport={tcp|udp|sctp},remote_port=port transport={tcp|udp|sctp},local_ip=address[/prefix_len],local_port=port [,remote_ip=address[/prefix_len]][,remote_port=port] dsfield=val[:dsfield_mask ]
在给定链接上,上述组合是互斥的。给定链路上的所有流必须具有相同的组合,只有属性值用来区分流。尝试创建不同组合的流将失败。
此处存在个别流限制与各区域流限制。
个别流限制个别流上的限制无需了解其他已添加至链接的流。
针对每个流,属性只能列一次。例如,以下命令无效:
# flowadm add-flow -l vnic1 -a local_port=80,local_port=8080 httpflow
transport 和 local_port 或者 transport 和 remote_port:
TCP、UDP 或 SCTP 流可通过本地端口或远程端口进行指定。不允许指定端口的 ICMP 或 ICMPv6 流。
如果指定了 local_port 或 remote_port,传输必须是 TCP、UDP 或 SCTP。
以下命令有效:
# 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 remote_port=25 flow25 # 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。高优先级流可能延迟更短,具体取决于可用的系统资源。
只读属性,显示是否将流负载转移到底层 NIC。'on' 表示对流进行负载转移,'off' 表示不进行负载转移。
下面的命令在未使用参数的情况下调用了 flowadm,因此显示了系统中的所有流。
# flowadm FLOW LINK PROTO LADDR LPORT RADDR RPORT DSFLD tcpflow net0 tcp -- -- -- -- -- udpflow net0 udp -- -- -- -- --示例 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 DSFLD https-1 net0 tcp -- 443 -- -- --示例 3 修改现有策略以添加带宽资源控制
以下命令将修改之前示例中的 https-1 策略。该命令可以添加带宽控制。
# flowadm set-flowprop -p maxbw=500M https-1 # flowadm show-flow https-1 FLOW LINK PROTO LADDR LPORT RADDR RPORT DSFLD https-1 net0 tcp -- 443 -- -- --
# 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 hwflow 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 DSFLD my-https net0 tcp 192.168.200.102 443 -- -- --
# 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 hwflow 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 DSFLD my-flow net0 tcp 192.168.200.102 443 192.168.200.104 12785 --
# 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 hwflow 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 DSFLD tcpflow net0 tcp -- -- -- -- -- zone1/tcpflow zone1/net0 tcp -- -- -- -- --示例 9 组合无效的流
给定链路上的所有流必须具有相同的属性组合。请考虑以下序列:
# flowadm add-flow -l net0 -a transport=tcp,local_port=443 httpsflow # flowadm add-flow -l net0 -a local_ip=192.1.168.157 ngzflow
第二个命令将会失败,因为第一个流使用了以下组合:
transport={tcp|udp|sctp},local_port=port
……这与第二个流中使用的组合不兼容:
local_ip=address[/prefix_len]示例 10 显示帮助信息
以下命令列出 flowadm 的子命令。
# flowadm help The following subcommands are supported: Flow : add-flow remove-flow reset-flowprop set-flowprop show-flow show-flowprop For more info, run: flowadm help <subcommand>
以下命令说明了带有特定子命令的 flowadm help 的用法。
# flowadm help add-flow usage: add-flow [-t] [-R <root-dir>] -l <link> -a <attr>=<value>[,...] [-p <prop>=<value>,...] <flow> example: # flowadm add-flow -l net0 -a transport=tcp -p maxbw=100 tcpflow示例 11 获取创建系统流的进程
以下命令显示在给定一个系统流的情况下如何获取 PID 和进程名称。
# flowadm FLOW LINK PROTO LADDR LPORT RADDR RPORT DSFLD 1.sys.sock net5 tcp 10.1.5.100 51204 10.1.5.101 22 --
# 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
所有操作都成功执行。
出现错误。
有关下列属性的说明,请参见 attributes(5):
|
acctadm(1M)、dladm(1M)、flowstat(1M)、ifconfig(1M)、prstat(1M)、route(1M)、attributes(5)、ifconfig(1M)
show-usage 子命令(在以前版本的 flowadm 中存在)已替换为 flowstat(1M) –h 命令。