QoS 最小出站带宽支持

RFE: https://bugs.launchpad.net/neutron/+bug/1560963

问题描述

当前的 QoS API [1] 不提供定义每个端口保证的最小出站带宽的功能。本提案讨论了通过添加保证的最小出站带宽来增强现有的 QoS API。

此功能目前受以下支持:

  • Open vSwitch:支持最小带宽保证,但流量整形仅适用于从交换机角度来看的出站流量。这种出站流量(从交换机角度来看)不应与租户的出站流量混淆,后者是此新功能的目标。

  • Linux Bridge:使用流量控制 HTB [2] 实现。

  • SR-IOV:它将取决于网卡驱动程序和 ip-link [3] 版本,该版本需要具有“min_tx_rate”选项;此选项已合并在 3.16.0 版本中。

提议的变更

拟议的更改是对 QoS API 和上述驱动程序(Open vSwitch、Linux Bridge 和 SR-IOV)的更新,以支持最小出站带宽保证。带宽值将存储为整数值,有效值大于零。单位为 kbps,与 QosBandwidthLimitRule 中使用的单位相同。

此功能的范围是启用对出站最小带宽值的 API 访问,并在前面注释的驱动程序中启用此功能。此功能不提供一种方法来报告后端容量或检查带宽可用性。这些限制将在用户和开发人员指南中记录。

数据模型影响

该模型遵循 QoS 带宽限制功能应用于 QoS 策略的方式,通过添加 QosMinimumBandwidthRule 表格。

QosMinimumBandwidthRule 模型如下所示:

+--------------+-------+----------+--------+-----------------+------------+
|Attribute     |Type   |Access    |Default |Validation/      |Description |
|Name          |       |          |Value   |Conversion       |            |
+==============+=======+==========+========+=================+============+
|id            |string |RO, all   |generat_|uuid             |identity    |
|              |(UUID) |          |ed      |                 |            |
+--------------+-------+----------+--------+-----------------+------------+
|qos_policy_id |string |RO, all   |N/A     |uuid             |QoSPolicy   |
|              |(UUID) |          |        |                 |reference   |
+--------------+-------+----------+--------+-----------------+------------+
|min_kbps      |integer|RW, tenant|N/A     |not negative,    |Minimum     |
|              |       |          |        |<= max_kbps      |bandwidth   |
+--------------+-------+----------+--------+-----------------+------------+
|direction     |enum   |RW, tenant|'egress'|'egress'         |Traffic     |
|              |       |          |        |                 |direction   |
+--------------+-------+----------+--------+-----------------+------------+

如果“max_kbps”为 None,则“min_kbps”的验证检查将不适用。

此 QoS 规则可以与在 Neutron QoS API 模型和扩展 [4] 中定义的 QoS 带宽限制规则结合使用。

“qos_policy_id”和“direction”都将链接为唯一的约束集,因为这两个参数的组合必须是唯一的。

此 QoS 规则将具有一个“direction”参数来定义流量的方向。此新功能将仅实现出站流量整形。“ingress”流量方向暂时不允许。

REST API 影响

拟议属性

SUB_RESOURCE_ATTRIBUTE_MAP = {
   'minimum_bandwidth_rules':{
        'parent': {'collection_name': 'policies',
                   'member_name': 'policy'},
        'parameters': dict(QOS_RULE_COMMON_FIELDS,
            **{'min_kbps': {
                'allow_post': True, 'allow_put': True,
                'convert_to': attr.convert_to_int,
                'is_visible': True, 'default': None,
                'validate': {'type:non_negative': None,
                             'type:values': max_kbps}}
              }),
            **{'direction': {
                'allow_post': True, 'allow_put': True,
                'is_visible': True, 'default': 'egress',
                'validate': {'type:values': common_constants.
                             EGRESS_DIRECTION}}
              }),
        }
}

示例 REST 调用

GET /v2.0/qos/policies

Response:
{
    "policy": {
        "name": "TypeOne",
        "description": "This policy sets a minimum bandwidth for type one users",
        "shared": "False"
     }
}

GET /v2.0/qos/policies/<policy-uuid>

Response:
{
    "policy": {
        "tenant_id": "<tenant-id>",
        "id": "<id>",
        "name": "TypeOne",
        "description": "This policy sets a minimum bandwidth for type one users",
        "shared": False,
        "rules": [{
            "id": "<id>",
            "policy_id": "<policy-uuid>",
            "rule_type": neutron.services.qos.RULE_TYPE_MINIMUM_BANDWIDTH
            "min_kbps": 10000,
            "direction": "egress"
        }]
     }
}

POST /v2.0/qos/policies/<policy-uuid>/minimum_bandwidth_rules/
{
    "minimum_bandwidth_rule": {
        "min_kbps": 20000,
        "direction": "egress"
    }
}

Response:
{
    "minimum_bandwidth_rule":{
        "id": "<id>",
        "policy_id": "<policy-uuid>",
        "min_kbps": 20000,
        "direction": "egress"
    }
}

PUT /v2.0/qos/policies/<policy-uuid>/minimum_bandwidth_rules/<rule-uuid>
{
    "minimum_bandwidth_rule": {
        "min_kbps": 10000,
        "direction": "egress"
    }
}

Response:
{
    "minimum_bandwidth_rule":{
        "id": "<id>",
        "policy_id": "<policy-uuid>",
        "min_egress_kbps": 10000,
        "direction": "egress"
    }
}

命令行客户端影响

  • qos-minimum-bandwidth-rule-create <policy-id> –min-kbps <value> –direction <value>

  • qos-minimum-bandwidth-rule-show <rule-id> <policy-id>

  • qos-minimum-bandwidth-rule-list <policy-id>

  • qos-minimum-bandwidth-rule-update <rule-id> <policy-id> –min-kbps <value> –direction <value>

  • qos-minimum-bandwidth-rule-delete <rule-id> <policy-id>

安全影响

通知影响

性能影响

IPv6 影响

其他部署者影响

部署者可能需要配置特定的 QoS 驱动程序 / ML2 代理扩展。

开发人员影响

社区影响

实现

负责人

  • Rodolfo Alonso Hernandez

  • Miguel Angel Ajo

  • Hirofumi Ichihara

  • Moshe Levi

工作项

  • 新规则类型的版本化 DB 对象

  • 允许修改最小出站带宽的 API 更改

  • 允许设置最小出站带宽值的客户端更改

  • QoS Openflow 集成到 L2 代理扩展中,用于 Open vSwitch 驱动程序,以启用最小出站带宽支持

    • 添加/修改交换流以标记数据包处理队列。

    • 在集成桥接、物理桥接和隧道桥接中添加/修改 QoS 规则和处理队列。

  • QoS 流量控制集成到 L2 代理扩展中,用于 Linux Bridge 驱动程序以启用此功能。

  • QoS ip-link 集成到 L2 代理扩展中,用于 SR-IOV 驱动程序以启用此功能。添加一个健全性检查以检测 ip-link 工具的版本;所需的最低版本是 3.16.0。

Open vSwitch 驱动程序

当前的 Open vSwitch QoS 实现仅整形出站流量。

Linux Bridge 驱动程序

当前的 Linux Bridge QoS 实现使用流量控制 (TC) 仅整形出站流量(从接口角度来看)。要整形从接口角度来看的入站流量(从实例出站),本功能需要以下步骤:

  • 创建一个 IFB [5]

  • 使用 TC 规则将所有入站流量发送到此 IFB,对其进行镜像。此流量将作为出站流量发送到此 IFB。

  • 在此 IFB 中添加一个 qdisc 和一个类,并带有 QoS 过滤器。

此外,所使用的算法 TBF [6] 必须由 HTB [2] 替换,这是一种类算法,允许设置“rate”参数,该参数定义为“此类及其所有子类保证的最大速率”。

未来工作

  • 实现一种将后端容量报告给 Neutron 的方法。可以采用几种方法来实现此功能:

    • 使用代理定期读取后端的容量,使用配置文件、监控系统等。代理状态报告可用于此目的。信息也可以来自系统检查,并启用覆盖代理配置文件中详细信息的选项。带宽映射应为每个物理网络,并且我们必须考虑一个特殊之处:连接到物理网络可以通过几个未绑定的接口发生(例如,SR-IOV 卡具有多个 PF(具有它自己的电缆)连接到交换机)。这实际上会为同一个网络提供不同的连接资源,这些资源会单独耗尽。这是最佳选项。

    • 在部署过程中使用静态文件手动插入后端容量。

    • 启用 API 以手动插入后端容量。API 可用于测试和开发目的,但应避免此选项。

  • 将后端总容量和 QoS 最小出站带宽规则告知 Nova Scheduler,以改进 Scheduler 决策。此功能由 [RFE] 严格的最小带宽支持(出站) [7] 解决。

依赖项

测试

API 测试

  • 创建最小出站带宽值

  • 更新最小出站带宽值

  • 删除最小出站带宽值

  • 列出最小出站带宽值

  • 显示最小出站带宽值

功能测试

将使用功能测试来验证系统交互

  • 设置最小出站带宽值

  • 更新最小出站带宽值

  • 删除最小出站带宽值

  • 列出最小出站带宽值

Fullstack 测试

  • 通过 API 在端口上设置第一个实例的 QoS 策略,用于最小出站带宽,对后端进行查询并检查存储值的正确性。

  • 更新 QoS 策略并再次检查值。

  • 删除 QoS 策略并验证与规则相关的所有值都已删除。

没有基准测试。

文档影响

用户文档

现有的 网络指南 [8] 将针对此功能进行更新。

现有的 CLI 指南 [9] 将针对此功能进行更新。

开发人员文档

现有的 QoS devref 文档 [10] 将针对此功能进行更新。

API 文档

现有的 QoS API 文档 [11] 将针对此功能进行更新。

参考资料