请求速率与性能优化

最近更新时间: 2024-10-17 17:10:00

本文探讨请求速率性能优化在云平台 COS 对象存储上的最佳实践。

云平台对象存储提供的典型工作负载能力为每秒 100 个 PUT/LIST/DELETE 等请求,或者每秒 400 个 GET 请求。如果您的工作负载超过了上述能力,建议您遵循本指南实现请求速率的性能扩展和优化。

注意: 请求负载指的是每秒发起的请求数量,非并发连接数。即您在保持数千连接数的同时,仍可以在 1s 时间内发送数百个新连接请求。

云平台对象存储支持性能扩展,以支持更高的请求速率。如果预计存储桶的请求速率会超过每秒 500 个 PUT/LIST/DELETE 请求,建议您联系我们,以便于为工作负载做好准备,避免遇到请求的限制。

注意: 如果您的混合请求负载只是偶尔达到每秒 500 个,并在突发时不超过每秒 800 个,您可无需遵循本指南。

混合请求负载

当需要上传大量对象的时候,您选择的对象键可能会引发性能问题,以下将简述云平台对象存储对 Object 键值的存储方法。

云平台在对象存储的每一个服务地域都维护了存储桶 (Bucket) 和对象 (Object) 的键值作为索引,对象键以 UTF-8 二进制顺序保存在索引的多个分区中。对于大量的键值,例如使用时间戳或者字母顺序可能会耗尽键值所在分区的读写性能,以存储桶路径 testbucket-123454321.cos.ap-beijing.myqcloud.com 为例,以下列出了可能会耗尽索引性能的一些案例:

20170701/log120000.tar.gz
20170701/log120500.tar.gz
20170701/log121000.tar.gz
20170701/log121500.tar.gz
...
image001/indexpage1.jpg
image002/indexpage2.jpg
image003/indexpage3.jpg
...

如果您的业务典型负载超过每秒 500 个请求,则应避免使用上述案例中的顺序键值。当您的业务必须使用顺序编号或日期时间等字符作为对象键时,您可以使用一些方法向对象键名称添加随机前缀,即可实现在多个索引分区实现键值管理,提升集中负载的性能。以下提供了一些在键值中增加随机性的方法。

以下提供的所有方法,均是有可能提升单个存储桶访问性能的方法,如果您的业务典型负载超过每秒 500 个请求,在执行以下方法的同时,您仍需联系我们以便于为您的业务负载提前做好准备。

添加十六进制哈希前缀

最直接的增加对象键随机性的方式,就是在对象键名称的最前面添加哈希字符串作为前缀,例如可以在上传对象时,对路径键值进行 SHA1 或 MD5 哈希计算,并选取几位字符作为前缀添加到键值名称,通常 2~4 位的字符哈希前缀可以满足需要。

faf1-20170701/log120000.tar.gz
e073-20170701/log120500.tar.gz
333c-20170701/log121000.tar.gz
2c32-20170701/log121500.tar.gz

注意: 由于云平台对象存储的键值索引是以 UTF-8 二进制顺序作为索引的,因此在执行列出对象(GET Bucket)操作时,您可能需要发起 65536 次列出对象操作,才能得到原来完整的 20170701 前缀结构。

添加枚举值前缀

如果您仍想要保留对象键的检索易用性,您可以针对您的文件类型枚举出一些前缀,实现对象分组,相同枚举值的前缀将共享所在索引分区的性能。

logs/20170701/log120000.tar.gz
logs/20170701/log120500.tar.gz
logs/20170701/log121000.tar.gz
...
images/image001/indexpage1.jpg
images/image002/indexpage2.jpg
images/image003/indexpage3.jpg
...

如果您在相同枚举前缀下,仍然有较高的访问负载,持续超过每秒 500 个请求,您可以参照上述添加十六进制哈希前缀的方式,在枚举值后继续添加哈希前缀执行多个索引分区,以实现更高性能的读写。

logs/faf1-20170701/log120000.tar.gz
logs/e073-20170701/log120500.tar.gz
logs/333c-20170701/log121000.tar.gz
...
images/0165-image001/indexpage1.jpg
images/a349-image002/indexpage2.jpg
images/ac00-image003/indexpage3.jpg
...

反转键值名称字符串

当您的业务不得不使用连续递增的 ID 或日期,或需要一次性上传大量的连续前缀对象时,如下述典型用法:

20170701/log0701A.tar.gz
20170701/log0701B.tar.gz
20170702/log0702A.tar.gz
20170702/log0702B.tar.gz
...
id16777216/album/hongkong/img20170701121314.jpg
id16777216/music/artist/tony/anythinggoes.mp3
id16777217/video/record20170701121314.mov
id16777218/live/show/date/20170701121314.mp4
...

如上的键值命名方式极易耗尽 2017id 为前缀的键值所在的索引分区,此时将键值前缀的一部分反转后,则实现了一定的随机性。

10707102/log0701A.tar.gz
10707102/log0701B.tar.gz
20707102/log0702A.tar.gz
20707102/log0702B.tar.gz
...
61277761di/album/hongkong/img20170701121314.jpg
61277761di/music/artist/tony/anythinggoes.mp3
71277761di/video/record20170701121314.mov
81277761di/live/show/date/20170701121314.mp4
...