默认情况下,阿里云账号下同一地域的所有Bucket共享带宽。当多个Bucket并发传输大量数据时,可能因带宽争抢导致关键业务传输延迟。通过配置资源池QoS流控可解决此问题:阈值流控防止某个Bucket占用过多带宽,优先级流控保障核心业务最小带宽,两种方案互补使用,确保重要业务稳定运行。
工作原理
阈值流控
为各层级对象(Bucket、BucketGroup)设置带宽上限,防止资源过度占用。
层级关系说明
资源池层级结构:资源池内部可以形成多层级的包含关系,实际场景中可能有以下几种层级结构。
请求者流控维度(独立维度):请求者不是资源池的层级结构成员,而是一个独立的流控维度。
流控生效原则
基本原则
资源池: 最大100Gbps
├─ Bucket A: 最大40Gbps ← 即使空闲,也不能超过40Gbps
├─ Bucket B: 最大30Gbps
└─ Bucket C: 不限制 ← 可使用全部剩余带宽约束规则
多层级限制同时生效:实际带宽取所有生效规则的最小值
下层带宽之和不能超过上层总带宽
请求者维度独立约束:与资源池层级约束同时生效,取最小值
示例
RAM用户访问Bucket时,同时受:
请求者限制(20Gbps)← 独立维度
Bucket限制(30Gbps)← 资源池层级
实际最大带宽 = min(20Gbps, 30Gbps) = 20Gbps
优先级流控
在资源池层面配置3-10个优先级等级。优先级等级越大,优先级越高。为不同优先级的对象分配保底带宽,确保高优先级业务在资源竞争时优先获得带宽。如果没有为对象配置优先级等级,则使用默认优先级等级。如果没有为优先级等级配置保底带宽,则使用默认保底带宽。
核心机制
保底保障:每个优先级都有保底带宽,硬性保证一定可以达到该保底带宽
抢占机制:高优先级可以抢占低优先级超出保底带宽部分的带宽,且更高优先级优先抢占
空闲利用:低优先级也可以使用高优先级空闲的保底带宽,但较高优先级优先使用
配置约束:所有优先级保底带宽之和 ≤ 资源池总带宽
典型场景
以下场景资源池总限制100Gbps,优先级1到优先级3。
两种流控配合使用
对每个流控资源需要同时考虑阈值流控上限、优先级流控保底和实际需求的多维度影响。
生效原则
阈值流控上限是硬限制:无论保底多高,最终不能超过阈值上限
优先级保底是软保障:在阈值上限范围内尽量满足保底
配置示例
正常配置
Bucket A 同时配置:
优先级流控:保底50Gbps ← 优先级维度
阈值流控:最大80Gbps ← 资源池层级
结果:Bucket A 可用带宽为 50-80Gbps(至少50,最多80)
配置冲突
Bucket A 同时配置:
优先级流控:保底80Gbps ← 优先级维度
阈值流控:最大50Gbps ← 资源池层级
结果:Bucket A 实际可用带宽为 50Gbps(阈值流控上限优先,而不是80Gbps)
申请资源池
当阿里云账号下某个地域的带宽达到400 Gbps或以上时,可联系技术支持申请创建资源池。
提交工单时需提供以下信息:
地域:华东1(杭州)
资源池名称:qos-resource-pool-1
Bucket列表:qos-examplebucket-1, qos-examplebucket-2
总上传带宽:300 Gbps
内网上传带宽:100 Gbps
外网上传带宽:200 Gbps
总下载带宽:100 Gbps
内网下载带宽:50 Gbps
外网下载带宽:50 Gbps配置阈值流控
适合需要限制带宽上限,防止某个对象占用过多资源的场景。
配置Bucket带宽上限
防止某个Bucket流量过大影响其他Bucket。
控制台
在资源池QoS页面,单击目标资源池名称,然后单击资源池内目标Bucket右侧的修改流控配置,按照以上要求设置Bucket带宽。
ossutil
使用前,需安装ossutil。
通过本地XML配置文件(qos.xml)配置指定Bucket的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth> </QoSConfiguration>为指定Bucket(示例值为examplebucket)添加以上带宽配置。
ossutil api invoke-operation --op-name put-bucket-qos-info --method PUT --bucket examplebucket --parameters qosInfo --body=file://qos.xml查看Bucket的带宽配置。
ossutil api invoke-operation --op-name get-bucket-qos-info --method GET --bucket examplebucket --parameters qosInfo
SDK
目前仅支持通过Python SDK V2和Go SDK V2为Bucket设置带宽上限。
通过本地qos.xml文件配置Bucket的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth> </QoSConfiguration>为指定Bucket设置以上带宽配置。
import alibabacloud_oss_v2 as oss def PutBucketQoSInfo(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载默认配置并获取配置对象 cfg = oss.config.load_default() # 设置凭证提供者 cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = "cn-hangzhou" # 使用配置对象初始化OSS客户端 client = oss.Client(cfg) # 初始化qos_xml_body为空字符串 qos_xml_body = "" # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中 with open('qos.xml', 'r') as qos_file: qos_xml_body = qos_file.read() # 构造一个操作输入请求对象,用于设置存储空间的QoS信息 req = oss.OperationInput( op_name = 'PutBucketQoSInfo', # 操作名称,这里是指定设置存储空间QoS信息的操作 method = 'PUT', # HTTP方法类型,此处为PUT,表示更新资源 parameters = { 'qosInfo': '', # 这里是参数列表,指定要设置的是QoS信息 }, headers = None, # 请求头信息,如果不需要特殊设置则可以为None body = qos_xml_body, # 请求体,包含之前从'qos.xml'文件读取的内容 bucket = 'examplebucket', # 目标存储空间的名称 ) # 调用客户端的invoke_operation方法执行请求,并接收响应 resp = client.invoke_operation(req) # 打印响应的状态码 print(resp.status_code) # 打印响应的头部信息 print(resp.headers) if __name__ == "__main__": PutBucketQoSInfo()
API
调用PutBucketQoSInfo按以下示例限制Bucket带宽。
<QoSConfiguration>
<TotalUploadBandwidth>100</TotalUploadBandwidth>
<IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
<ExtranetUploadBandwidth>20</ExtranetUploadBandwidth>
<TotalDownloadBandwidth>100</TotalDownloadBandwidth>
<IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
<ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
</QoSConfiguration>配置Bucket请求者带宽上限
RAM用户
多个业务共享同一个Bucket,需要限制某个RAM用户的带宽,避免其过度占用。
控制台
ossutil
使用前,需安装ossutil。
以下示例用于限制RAM用户访问资源池内某个Bucket的带宽:
通过本地XML配置文件(qos.xml)配置指定RAM用户访问资源池内某个Bucket的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>-1</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>-1</ExtranetDownloadBandwidth> </QoSConfiguration>查看RAM用户ID。
为访问Bucket(示例值为examplebucket)的RAM用户(UID为266xxxx)添加以上带宽配置。
ossutil api invoke-operation --op-name put-bucket-requester-qos-info --method PUT --bucket=examplebucket --parameters requesterQosInfo --parameters qosRequester=266xxxx --body file://qos.xml(可选)获取该RAM用户访问资源池内某个Bucket的带宽配置。
ossutil api invoke-operation --op-name get-bucket-requester-qos-info --method GET --bucket=examplebucket --parameters requesterQosInfo --parameters qosRequester=266xxxx
SDK
目前仅支持通过Python SDK V2和Go SDK V2限制RAM用户访问Bucket的带宽上限。
通过本地qos.xml文件配置指定RAM用户访问资源池内某个Bucket的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>-1</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>-1</ExtranetDownloadBandwidth> </QoSConfiguration>查看RAM用户ID。
为访问Bucket的RAM用户设置以上带宽配置。
import alibabacloud_oss_v2 as oss def PutBucketRequesterQoSInfo(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载默认配置并获取配置对象 cfg = oss.config.load_default() # 设置凭证提供者 cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = "cn-hangzhou" # 使用配置对象初始化OSS客户端 client = oss.Client(cfg) # 初始化qos_xml_body为空字符串 qos_xml_body = "" # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中 with open('qos.xml', 'r') as qos_file: qos_xml_body = qos_file.read() # 构造一个操作输入请求对象,用于设置存储空间的请求者QoS信息 req = oss.OperationInput( op_name = 'PutBucketRequesterQoSInfo', # 操作名称,这里是指定设置存储空间请求者QoS信息的操作 method = 'PUT', # HTTP方法类型,此处为PUT,表示更新资源 parameters = { 'requesterQosInfo': '', # 参数列表,指定要设置的是请求者QoS信息 'qosRequester': '2598732222222xxxx', # 请求者的唯一标识符,用于区分不同的请求者 }, headers = None, # 请求头信息,如果不需要特殊设置则可以为None body = qos_xml_body, # 请求体,包含之前从'qos.xml'文件读取的内容 bucket = 'examplebucket', # 目标存储空间的名称 ) # 调用客户端的invoke_operation方法执行请求,并接收响应 resp = client.invoke_operation(req) # 打印响应的状态码 print(resp.status_code) # 打印响应的头部信息 print(resp.headers) # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据 print(resp.http_response.content) if __name__ == "__main__": PutBucketRequesterQoSInfo()
API
查看RAM用户ID。
调用PutBucketRequesterQoSInfo按以下示例限制RAM用户访问Bucket的带宽。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>-1</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>-1</ExtranetDownloadBandwidth> </QoSConfiguration>
RAM角色
使用Bucket存储静态资源并启用CDN加速。为使CDN能从私有Bucket获取文件,需开启私有Bucket回源。CDN通过RAM角色AliyunCDNAccessingPrivateOSSRole访问Bucket,需要限制其回源带宽。
控制台
ossutil
使用前,需安装ossutil。
通过本地XML配置文件(qos.xml)配置该角色访问指定Bucket的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>40</ExtranetDownloadBandwidth> </QoSConfiguration>查看RAM角色ID。
为该角色(角色ID为362xxxx)添加访问指定Bucket(示例值为examplebucket)带宽配置。
ossutil api invoke-operation --op-name put-bucket-requester-qos-info --method PUT --bucket=examplebucket --parameters requesterQosInfo --parameters qosRequester=362xxxx --body file://qos.xml(可选)列举资源池所有RAM角色的带宽配置。
ossutil api invoke-operation --op-name list-resource-pool-requester-qos-infos --method GET --parameters resourcePool=examplePool --parameters requesterQosInfo
SDK
目前仅支持通过Python SDK V2和Go SDK V2限制RAM角色访问Bucket的带宽上限。
通过本地qos.xml文件配置指定RAM用户访问资源池内某个Bucket的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>40</ExtranetDownloadBandwidth> </QoSConfiguration>查看RAM角色ID。
为RAM角色设置以上带宽配置。
import alibabacloud_oss_v2 as oss def PutBucketRequesterQoSInfo(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载默认配置并获取配置对象 cfg = oss.config.load_default() # 设置凭证提供者 cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = "cn-hangzhou" # 使用配置对象初始化OSS客户端 client = oss.Client(cfg) # 初始化qos_xml_body为空字符串 qos_xml_body = "" # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中 with open('qos.xml', 'r') as qos_file: qos_xml_body = qos_file.read() # 构造一个操作输入请求对象,用于设置存储空间的请求者QoS信息 req = oss.OperationInput( op_name = 'PutBucketRequesterQoSInfo', # 操作名称,这里是指定设置存储空间请求者QoS信息的操作 method = 'PUT', # HTTP方法类型,此处为PUT,表示更新资源 parameters = { 'requesterQosInfo': '', # 参数列表,指定要设置的是请求者QoS信息 'qosRequester': '2598732222222xxxx', # 请求者的唯一标识符,用于区分不同的请求者 }, headers = None, # 请求头信息,如果不需要特殊设置则可以为None body = qos_xml_body, # 请求体,包含之前从'qos.xml'文件读取的内容 bucket = 'examplebucket', # 目标存储空间的名称 ) # 调用客户端的invoke_operation方法执行请求,并接收响应 resp = client.invoke_operation(req) # 打印响应的状态码 print(resp.status_code) # 打印响应的头部信息 print(resp.headers) # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据 print(resp.http_response.content) if __name__ == "__main__": PutBucketRequesterQoSInfo()
API
查看RAM角色ID。
调用PutBucketRequesterQoSInfo按以下示例限制RAM角色访问Bucket的带宽。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>40</ExtranetDownloadBandwidth> </QoSConfiguration>
配置BucketGroup带宽上限
将低优先级Bucket加入BucketGroup统一管理,限制其总带宽。
控制台
在资源池QoS页面,单击目标资源池名称,然后单击创建BucketGroup,定义BucketGroup名称并按照要求设置BucketGroup带宽。
在目标资源池页面,单击目标Bucket右侧的配置BucketGroup,将低优先级Bucket加入BucketGroup。
ossutil
使用前,需安装ossutil。
将
scheduled-posts和archived-comments两个Bucket加入BucketGroup。将
scheduled-posts加入BucketGroup。ossutil api invoke-operation --op-name put-bucket-resource-pool-bucket-group --method PUT --bucket scheduled-posts --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup=test-group将
archived-comments加入BucketGroup。ossutil api invoke-operation --op-name put-bucket-resource-pool-bucket-group --method PUT --bucket archived-comments --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup=test-group(可选)获取BucketGroup中添加的Bucket列表。
ossutil api invoke-operation --op-name list-resource-pool-bucket-groups --method GET --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup
通过本地XML配置文件(qos.xml)配置资源池内指定BucketGroup的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>20</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>10</ExtranetUploadBandwidth> <TotalDownloadBandwidth>30</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth> </QoSConfiguration>为BucketGroup配置带宽。
ossutil api invoke-operation --op-name put-resource-pool-bucket-group-qos-info --method PUT --parameters resourcePoolBucketGroupQosInfo --parameters resourcePool pool-for-ai --parameters resourcePoolBucketGroup offline-group --body=file://qos.xml(可选)获取BucketGroup的带宽配置。
ossutil api invoke-operation --op-name get-resource-pool-bucket-group-qos-info --method GET --parameters resourcePool=pool-for-ai --parameters resourcePoolBucketGroup=offline-group --parameters resourcePoolBucketGroupQoSInfo
SDK
目前仅支持通过Python SDK V2和Go SDK V2限制BucketGroup的带宽上限。
将资源池内的两个Bucket分别加入BucketGroup。
import alibabacloud_oss_v2 as oss def PutBucketResourcePoolBucketGroup(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载默认配置并获取配置对象 cfg = oss.config.load_default() # 设置凭证提供者 cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = "cn-hangzhou" # 使用配置对象初始化OSS客户端 client = oss.Client(cfg) # 构造一个操作输入请求对象,用于将存储空间添加到指定的资源池存储空间组 req = oss.OperationInput( op_name = 'PutBucketResourcePoolBucketGroup', # 操作名称,这里是指定将存储空间添加到资源池存储空间组的操作 method = 'PUT', # HTTP方法类型,此处为PUT,表示更新资源 parameters = { 'resourcePoolBucketGroup': 'example-group', # 存储空间组的唯一标识符,用于区分不同的存储空间组 'resourcePool': 'example-resource-pool', # 资源池的唯一标识符,用于区分不同的资源池 }, headers = None, # 请求头信息,如果不需要特殊设置则可以为None body = None, # 请求体,由于是PUT请求且无需传递额外数据,因此为None bucket = 'examplebucket', # 目标存储空间的名称,表示要将该存储空间添加到指定的资源池存储空间组 ) # 调用客户端的invoke_operation方法执行请求,并接收响应 resp = client.invoke_operation(req) # 打印响应的状态码 print(resp.status_code) # 打印响应的头部信息 print(resp.headers) # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据 print(resp.http_response.content) if __name__ == "__main__": PutBucketResourcePoolBucketGroup()通过本地XML配置文件(qos.xml)配置资源池内指定BucketGroup的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>20</TotalUploadBandwidth> <IntranetUploadBandwidth>-1</IntranetUploadBandwidth> <ExtranetUploadBandwidth>10</ExtranetUploadBandwidth> <TotalDownloadBandwidth>30</TotalDownloadBandwidth> <IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth> </QoSConfiguration>为BucketGroup配置带宽。
import alibabacloud_oss_v2 as oss def PutResourcePoolBucketGroupQoSInfo(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载默认配置并获取配置对象 cfg = oss.config.load_default() # 设置凭证提供者 cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = "cn-hangzhou" # 使用配置对象初始化OSS客户端 client = oss.Client(cfg) # 初始化qos_xml_body为空字符串 qos_xml_body = "" # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中 with open('qos.xml', 'r') as qos_file: qos_xml_body = qos_file.read() # 构造一个操作输入请求对象,用于设置资源池存储空间组的QoS信息 req = oss.OperationInput( op_name = 'PutResourcePoolBucketGroupQoSInfo', # 操作名称,这里是指定设置资源池存储空间组QoS信息的操作 method = 'PUT', # HTTP方法类型,此处为PUT,表示更新资源 parameters = { 'resourcePoolBucketGroupQosInfo': '', # 参数列表,指定要设置的是资源池存储空间组QoS信息 'resourcePool': 'example-resource-pool', # 资源池的唯一标识符,用于区分不同的资源池 'resourcePoolBucketGroup': 'example-group', # 存储空间组的唯一标识符,用于区分不同的存储空间组 }, headers = None, # 请求头信息,如果不需要特殊设置则可以为None body = qos_xml_body, # 请求体,包含之前从'qos.xml'文件读取的内容 bucket = None, # 目标存储空间的名称,这里不需要指定具体的存储空间,因此为None ) # 调用客户端的invoke_operation方法执行请求,并接收响应 resp = client.invoke_operation(req) # 打印响应的状态码 print(resp.status_code) # 打印响应的头部信息 print(resp.headers) # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据 print(resp.http_response.content) if __name__ == "__main__": PutResourcePoolBucketGroupQoSInfo()
API
调用PutResourcePoolBucketGroupQoSInfo按以下示例限制BucketGroup的带宽。
<QoSConfiguration>
<TotalUploadBandwidth>20</TotalUploadBandwidth>
<IntranetUploadBandwidth>-1</IntranetUploadBandwidth>
<ExtranetUploadBandwidth>10</ExtranetUploadBandwidth>
<TotalDownloadBandwidth>30</TotalDownloadBandwidth>
<IntranetDownloadBandwidth>-1</IntranetDownloadBandwidth>
<ExtranetDownloadBandwidth>20</ExtranetDownloadBandwidth>
</QoSConfiguration>配置资源池请求者带宽上限
多个RAM用户访问同一资源池的不同Bucket,需要限制各自带宽上限,防止某用户独占资源池带宽。
控制台
ossutil
使用前,需安装ossutil。
通过本地XML配置文件(qos.xml)为RAM用户或者RAM角色配置访问资源池的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>50</IntranetUploadBandwidth> <ExtranetUploadBandwidth>50</ExtranetUploadBandwidth> <TotalDownloadBandwidth>200</TotalDownloadBandwidth> <IntranetDownloadBandwidth>150</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth> </QoSConfiguration>为RAM用户(UID为266xxxx)添加以上带宽配置。
ossutil api invoke-operation --op-name put-resource-pool-requester-qos-info --method PUT --parameters resourcePool=examplepool --parameters qosRequester=266xxxx --parameters requesterQosInfo --body=file://qos.xml(可选)列举资源池所有RAM用户的带宽配置。
ossutil api invoke-operation --op-name list-resource-pool-requester-qos-infos --method GET --parameters resourcePool=examplePool --parameters requesterQosInfo
SDK
目前仅支持通过Python SDK V2和Go SDK V2限制RAM用户或RAM角色访问资源池的带宽上限。
通过本地qos.xml文件配置指定RAM用户或RAM角色访问资源池的带宽上限。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>50</IntranetUploadBandwidth> <ExtranetUploadBandwidth>50</ExtranetUploadBandwidth> <TotalDownloadBandwidth>200</TotalDownloadBandwidth> <IntranetDownloadBandwidth>150</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth> </QoSConfiguration>为RAM用户或RAM角色设置以上带宽配置。
import alibabacloud_oss_v2 as oss def PutResourcePoolRequesterQoSInfo(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载默认配置并获取配置对象 cfg = oss.config.load_default() # 设置凭证提供者 cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = "cn-hangzhou" # 使用配置对象初始化OSS客户端 client = oss.Client(cfg) # 初始化qos_xml_body为空字符串 qos_xml_body = "" # 打开名为'qos.xml'的文件,并读取其中的内容到qos_xml_body变量中 with open('qos.xml', 'r') as qos_file: qos_xml_body = qos_file.read() # 构造一个操作输入请求对象,用于设置资源池请求者的QoS信息 req = oss.OperationInput( op_name = 'PutResourcePoolRequesterQoSInfo', # 操作名称,这里是指定设置资源池请求者QoS信息的操作 method = 'PUT', # HTTP方法类型,此处为PUT,表示更新资源 parameters = { 'requesterQosInfo': '', # 参数列表,指定要设置的是请求者QoS信息 'resourcePool': 'example-resource-pool', # 资源池的唯一标识符,用于区分不同的资源池 'qosRequester': '2598732222222xxxx', # 请求者的唯一标识符,用于区分不同的请求者 }, headers = None, # 请求头信息,如果不需要特殊设置则可以为None body = qos_xml_body, # 请求体,包含之前从'qos.xml'文件读取的内容 bucket = None, # 目标存储空间的名称,这里不需要指定具体的存储空间,因此为None ) # 调用客户端的invoke_operation方法执行请求,并接收响应 resp = client.invoke_operation(req) # 打印响应的状态码 print(resp.status_code) # 打印响应的头部信息 print(resp.headers) # 打印响应的内容(HTTP响应体),通常包含请求返回的具体数据 print(resp.http_response.content) if __name__ == "__main__": PutResourcePoolRequesterQoSInfo()
API
调用PutResourcePoolRequesterQoSInfo按以下示例限制RAM用户或RAM角色访问资源池的带宽。
<QoSConfiguration> <TotalUploadBandwidth>100</TotalUploadBandwidth> <IntranetUploadBandwidth>50</IntranetUploadBandwidth> <ExtranetUploadBandwidth>50</ExtranetUploadBandwidth> <TotalDownloadBandwidth>200</TotalDownloadBandwidth> <IntranetDownloadBandwidth>150</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth> </QoSConfiguration>
配置优先级流控
适合需要保障核心业务最小带宽,在资源竞争时优先满足高优先级对象的场景。
配置资源池优先级
资源池中有多个Bucket,需要确保核心业务Bucket在带宽紧张时仍能获得足够带宽。
ossutil
创建优先级配置文件
priority-qos.xml。<PriorityQosConfiguration> <PriorityCount>3</PriorityCount> <DefaultPriorityLevel>1</DefaultPriorityLevel> <DefaultGuaranteedQosConfiguration> <TotalUploadBandwidth>10</TotalUploadBandwidth> <IntranetUploadBandwidth>5</IntranetUploadBandwidth> <ExtranetUploadBandwidth>5</ExtranetUploadBandwidth> <TotalDownloadBandwidth>20</TotalDownloadBandwidth> <IntranetDownloadBandwidth>10</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>10</ExtranetDownloadBandwidth> </DefaultGuaranteedQosConfiguration> <QosPriorityLevelConfiguration> <PriorityLevel>3</PriorityLevel> <GuaranteedQosConfiguration> <TotalUploadBandwidth>50</TotalUploadBandwidth> <TotalDownloadBandwidth>80</TotalDownloadBandwidth> <ExtranetUploadBandwidth>30</ExtranetUploadBandwidth> <IntranetUploadBandwidth>20</IntranetUploadBandwidth> <ExtranetDownloadBandwidth>50</ExtranetDownloadBandwidth> <IntranetDownloadBandwidth>30</IntranetDownloadBandwidth> </GuaranteedQosConfiguration> <Subjects> <Bucket>critical-bucket</Bucket> <BucketGroup>core-group</BucketGroup> </Subjects> </QosPriorityLevelConfiguration> <QosPriorityLevelConfiguration> <PriorityLevel>2</PriorityLevel> <GuaranteedQosConfiguration> <TotalUploadBandwidth>30</TotalUploadBandwidth> <TotalDownloadBandwidth>50</TotalDownloadBandwidth> <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth> <IntranetUploadBandwidth>10</IntranetUploadBandwidth> <ExtranetDownloadBandwidth>30</ExtranetDownloadBandwidth> <IntranetDownloadBandwidth>20</IntranetDownloadBandwidth> </GuaranteedQosConfiguration> <Subjects> <Bucket>important-bucket</Bucket> </Subjects> </QosPriorityLevelConfiguration> </PriorityQosConfiguration>应用配置。
ossutil api invoke-operation --op-name put-resource-pool-priority-qos-configuration --method PUT --parameters resourcePool=hz-rp-03 --parameters priorityQos --body=file://priority-qos.xml获取并验证配置。
ossutil api invoke-operation --op-name get-resource-pool-priority-qos-configuration --method GET --parameters resourcePool=hz-rp-03 --parameters priorityQos
SDK
package main
import (
"bytes"
"context"
"crypto/md5"
"encoding/base64"
"fmt"
"os"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func PutResourcePoolPriorityQosConfiguration() {
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
var region = "cn-hangzhou"
// 加载默认配置并设置凭证提供者和区域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 创建OSS客户端
client := oss.NewClient(cfg)
// 定义资源池名称
resourcePool := "hz-rp-01"
// 读取优先级QoS配置文件内容
qosConf, err := os.ReadFile("priority-qos.xml")
if err != nil {
// 如果读取QoS配置文件时发生错误,则打印错误信息并退出程序
fmt.Printf("failed to read qos.xml: %v\n", err)
os.Exit(1)
}
// 计算输入数据的MD5值,并将其转换为Base64编码字符串
calcMd5 := func(input []byte) string {
if len(input) == 0 {
return "1B2M2Y8AsgTpgAmY7PhCfg=="
}
h := md5.New()
h.Write(input)
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}
// 创建操作输入参数,包括操作名称、方法类型、参数等
input := &oss.OperationInput{
OpName: "PutResourcePoolPriorityQoSConfiguration", // 操作名称
Method: "PUT", // HTTP方法类型
Parameters: map[string]string{
"priorityQos": "", // 优先级QoS信息相关参数
"resourcePool": resourcePool, // 资源池名称
},
Headers: map[string]string{
"Content-MD5": calcMd5(qosConf), // 设置请求体的MD5校验码,用于验证数据完整性
},
Body: bytes.NewReader(qosConf), // 请求体,包含QoS配置内容
Bucket: nil, // 此操作不针对特定存储空间
}
// 执行操作请求,并接收响应结果或错误
res, err := client.InvokeOperation(context.TODO(), input)
if err != nil {
// 如果发生错误,则打印错误信息并退出程序
fmt.Printf("invoke operation got error: %v\n", err)
os.Exit(1)
}
// 打印操作结果
fmt.Println("The result of PutResourcePoolPriorityQoSConfiguration:", res.Status)
}API
配置资源池请求者优先级
多租户SaaS平台,不同等级的客户访问同一资源池,需要为VIP客户保障带宽,普通客户共享剩余资源。
ossutil
创建请求者优先级配置文件
requester-priority-qos.xml。<PriorityQosConfiguration> <PriorityCount>3</PriorityCount> <DefaultPriorityLevel>1</DefaultPriorityLevel> <DefaultGuaranteedQosConfiguration> <TotalUploadBandwidth>10</TotalUploadBandwidth> <IntranetUploadBandwidth>5</IntranetUploadBandwidth> <ExtranetUploadBandwidth>5</ExtranetUploadBandwidth> <TotalDownloadBandwidth>20</TotalDownloadBandwidth> <IntranetDownloadBandwidth>10</IntranetDownloadBandwidth> <ExtranetDownloadBandwidth>10</ExtranetDownloadBandwidth> </DefaultGuaranteedQosConfiguration> <QosPriorityLevelConfiguration> <PriorityLevel>3</PriorityLevel> <GuaranteedQosConfiguration> <TotalUploadBandwidth>60</TotalUploadBandwidth> <TotalDownloadBandwidth>100</TotalDownloadBandwidth> <ExtranetUploadBandwidth>40</ExtranetUploadBandwidth> <IntranetUploadBandwidth>20</IntranetUploadBandwidth> <ExtranetDownloadBandwidth>60</ExtranetDownloadBandwidth> <IntranetDownloadBandwidth>40</IntranetDownloadBandwidth> </GuaranteedQosConfiguration> <Subjects> <Requester>123456789012****</Requester> <Requester>234567890123****</Requester> </Subjects> </QosPriorityLevelConfiguration> <QosPriorityLevelConfiguration> <PriorityLevel>2</PriorityLevel> <GuaranteedQosConfiguration> <TotalUploadBandwidth>30</TotalUploadBandwidth> <TotalDownloadBandwidth>50</TotalDownloadBandwidth> <ExtranetUploadBandwidth>20</ExtranetUploadBandwidth> <IntranetUploadBandwidth>10</IntranetUploadBandwidth> <ExtranetDownloadBandwidth>30</ExtranetDownloadBandwidth> <IntranetDownloadBandwidth>20</IntranetDownloadBandwidth> </GuaranteedQosConfiguration> <Subjects> <Requester>345678901234****</Requester> </Subjects> </QosPriorityLevelConfiguration> </PriorityQosConfiguration>应用配置
ossutil api invoke-operation --op-name put-resource-pool-requester-priority-qos-configuration --method PUT --parameters resourcePool=hz-rp-03 --parameters requesterPriorityQos --body=file://requester-priority-qos.xml(可选)获取并验证配置。
ossutil api invoke-operation --op-name get-resource-pool-requester-priority-qos-configuration --method GET --parameters resourcePool=hz-rp-03 --parameters requesterPriorityQos
SDK
package main
import (
"bytes"
"context"
"crypto/md5"
"encoding/base64"
"fmt"
"os"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func PutResourcePoolRequesterPriorityQosConfiguration() {
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
var region = "cn-hangzhou"
// 加载默认配置并设置凭证提供者和区域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 创建OSS客户端
client := oss.NewClient(cfg)
// 定义资源池名称
resourcePool := "hz-rp-01"
// 读取请求者优先级QoS配置文件内容
qosConf, err := os.ReadFile("requester-priority-qos.xml")
if err != nil {
// 如果读取QoS配置文件时发生错误,则打印错误信息并退出程序
fmt.Printf("failed to read qos.xml: %v\n", err)
os.Exit(1)
}
// 计算输入数据的MD5值,并将其转换为Base64编码字符串
calcMd5 := func(input []byte) string {
if len(input) == 0 {
return "1B2M2Y8AsgTpgAmY7PhCfg=="
}
h := md5.New()
h.Write(input)
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}
// 创建操作输入参数,包括操作名称、方法类型、参数等
input := &oss.OperationInput{
OpName: "PutResourcePoolRequesterPriorityQoSConfiguration", // 操作名称
Method: "PUT", // HTTP方法类型
Parameters: map[string]string{
"requesterPriorityQos": "", // 请求者优先级QoS信息相关参数
"resourcePool": resourcePool, // 资源池名称
},
Headers: map[string]string{
"Content-MD5": calcMd5(qosConf), // 设置请求体的MD5校验码,用于验证数据完整性
},
Body: bytes.NewReader(qosConf), // 请求体,包含QoS配置内容
Bucket: nil, // 此操作不针对特定存储空间
}
// 执行操作请求,并接收响应结果或错误
res, err := client.InvokeOperation(context.TODO(), input)
if err != nil {
// 如果发生错误,则打印错误信息并退出程序
fmt.Printf("invoke operation got error: %v\n", err)
os.Exit(1)
}
// 打印操作结果
fmt.Println("The result of PutResourcePoolRequesterPriorityQoSConfiguration:", res.Status)
}API
监控与告警
监控带宽使用
在业务运行期间,可以在云监控-对象存储OSS资源池,实时查看资源池内关键业务的带宽使用情况,确保资源分配合理且业务运行稳定。
设置带宽告警
为确保关键业务稳定运行,可以通过云监控服务创建告警规则,当带宽使用率超过 80% 时自动触发告警,便于及时调整带宽配置应对业务高峰。
应用于生产环境
容量规划建议
1. 保底带宽之和建议小于资源池总带宽的50%。
预留50%以上的弹性空间用于动态调度,可有效提升资源池整体带宽利用率。
推荐配置:
资源池总带宽:100Gbps
优先级3保底:20Gbps
优先级2保底:20Gbps
优先级1保底:10Gbps
总计:50Gbps(预留50Gbps弹性空间)2. 优先级数量建议3-5个
过多优先级增加管理复杂度,建议根据业务重要性分为3-5级:
核心业务(优先级1-2)
重要业务(优先级3)
普通业务(优先级4-5)
3. 阈值流控上限应高于优先级保底
确保高优先级对象在资源充足时能够使用更多带宽:
建议配置:
优先级流控:Bucket A 保底50Gbps
阈值流控:Bucket A 最大80Gbps
实际可用:50-80Gbps(至少50,最多80)最佳实践
场景1:视频点播平台
直播流:优先级3,保底50Gbps
点播内容:优先级1,保底20Gbps
CDN回源:阈值流控限制最大100Gbps
场景2:多租户SaaS平台
企业版客户:优先级3,分配保底带宽
免费版客户:优先级1,共享剩余资源
单租户上限:阈值流控防止单租户过度占用
场景3:数据湖分析
实时分析:优先级2,保底30Gbps
离线分析:优先级1,保底20Gbps
归档数据:阈值流控限制最大10Gbps
风险防范
1. 定期审查配额使用情况
通过云监控查看各对象的带宽使用趋势,及时调整配额:
高优先级对象保底带宽满足率持续<95%,考虑增加保底或降低低优先级保底
低优先级对象长期无法使用,考虑降低高优先级保底或扩容资源池
2. 设置多级告警
警告级(80%):提前预警,准备扩容方案
严重级(90%):立即处理,启动应急预案
3. 避免配置冲突
保底带宽之和不能超过资源池总带宽
阈值流控上限应高于优先级保底
Bucket同属BucketGroup时,按BucketGroup优先级生效
4. 变更与回滚
重要变更前,在测试环境验证配置
保存当前配置,便于快速回滚
业务低峰期执行变更操作
配额与限制
限制项 | 配额/限制 |
资源池 | 单个地域最多100个资源池 |
单个资源池最多100个Bucket | |
单个资源池最多100个BucketGroup | |
单个资源池最多为300个请求者配置流控 | |
BucketGroup | 名称限制3-30个字符 |
只支持小写字母、数字和短横线 | |
优先级流控 | 优先级数量:3-10个 |
优先级等级:正整数,≥1且≤优先级总数 | |
保底带宽之和≤资源池总带宽 | |
若无默认保底,则每个优先级都必须配置保底带宽 | |
带宽参数 | 正整数:具体限制值(单位Gbps) |
-1:不限制(共享资源池带宽) | |
0:禁止该类型流量(谨慎使用) | |
配置后生效延迟 | 5分钟内 |