问题
- s3流式上传大文件,报错:416 InvalidRange
tar -cP data_150G | s3cmd put - s3://wuyan_test/data_150G
- 经过多次测试,得到结论: 文件大小从150GB~1TB 都会导致416错误
问题表现
s3cmd output:
rgw log:
2018-08-22 21:26:12.854078 7f25e1f7b700 1 civetweb: 0x7f263ee7e000: 172.16.130.156 - - [22/Aug/2018:21:25:55 +0800] "PUT /do-not-delete/1534912813.tar?partNumber=56025&uploadId=2~fTCpM3WICVoCZkISuom-uGhXIvGQ3zg HTTP/1.1" 200 0 - -
2018-08-22 21:26:12.937465 7f25e1f7b700 1 ====== starting new request req=0x7f25e1f75110 =====
2018-08-22 21:26:12.940063 7f25e1f7b700 1 ====== req done req=0x7f25e1f75110 op status=-34 http_status=416 ======
2018-08-22 21:26:12.944497 7f25e1f7b700 1 civetweb: 0x7f263ee7e000: 172.16.130.156 - - [22/Aug/2018:21:25:55 +0800] "POST /do-not-delete/1534912813.tar?uploadId=2~fTCpM3WICVoCZkISuom-uGhXIvGQ3zg HTTP/1.1" 416 0 - -
问题解决
- 配置
rgw_multipart_part_upload_limit = 100000
值. - s3cmd 配置
--multipart-chunk-size-mb=250
rgw_max_put_param_size = 104857600
问题分析
1. Multipart(分片) 数量限制
1.1. Multipart 原理
- Ceph 默认对于单一文件的限制为5GB
- S3在上传大文件时,采用了
multipart
机制,将大文件进行分片。以下是s3cmd上的两个配置:
--multipart-chunk-size-mb
配置分片的大小,默认是15MBmultipart_max_chunks
配置最大分片数量,默认是10000
- Ceph端同样有一个配置,可以限制最大分片数量
rgw_multipart_part_upload_limit
配置最大分片数量,默认10000
1.2 s3cmd:multipart_max_chunks 和 ceph:multipart_max_chunks区别
- 这两个配置,一个是针对客户端,一个是针对服务端,建议两边配置值保持一致
- 在使用s3cmd命令
正常
上传时,会根据文件大小、分片大小计算出分片数量,与multipart_max_chunks
比较,如果超过,则报错 - 但在使用s3cmd 流式上传时,会跳过
multipart_max_chunks
的限制,这个时候,会等所有分片上传完成后,再将分片数量与multipart_max_chunks
比较,超出则报错
1.3. 问题分析
- 在我们的测试环境中,我们使用的是
tar
流式上传的方式,所以会绕过客户端multipart_max_chunks
的检查 - 我们测试环境中, 默认
multipart-chunk-size-mb
15MB,默认rgw_multipart_part_upload_limit
10000 - 在这种配置下,最大文件大小为 15MB * 10000 = 146.5GB, 超过该大小的文件上传,都会失败
1.4. 问题修复
- 根据上面的信息,可以发现,要提升上传的文件大小限制,可以修改
multipart-chunk-size-mb
或者rgw_multipart_part_upload_limit
1.5. 涉及代码
rgw_http_errors rgw_http_s3_errors({
...
{ ERANGE, {
416, "InvalidRange" }},
...
}
void RGWCompleteMultipart::execute()
{
...
if ((int)parts->parts.size() >
s->cct->_conf->rgw_multipart_part_upload_limit) {
op_ret = -ERANGE;
return;
}
...
}
2. Put param size 限制
在修改默认配置解决了分片数量限制的问题后,我们测试了150GB、250GB都成功了。但发现上传1TB大文件时,任然失败,报错信息居然都一样,ERANGE 416.
2.1 Multipart Complete Info
- 如果对S3的协议有所了解,会发现,在分片上传完成之后,还会再发起一次CompleteMultipartUpload 的http post请求, 具体的请求信息,如下所示
- 在这次请求信息中,会描述所有的分片的ETag 和 number 信息
- 所以分片的数量越多,这次post请求的长度就越长
- ceph rgw在处理这个post请求的时候,需要有一个buffer来解析这个信息,这个buffer的长度是有限的,可以通过
rgw_max_put_param_size
参数来配置,默认值:1MB
2.2. CompleteMultipartUpload HTTP POST
- content-length: 11725
POST /wuyan_test/data_1G.tar?uploadId=2~NGeN4ZWO4UvVBSgOX8pz3F7JAy6o5am HTTP/1.1
Host: 10.10.40.111:7480
Accept-Encoding: identity
content-length: 11725
Authorization: AWS VL8X4318L7QBFGQ3W3WB:HD34DLe4Gd2RGkDFWmrWUgiGT5c=
x-amz-date: Wed, 22 Aug 2018 15:18:37 +0000
<CompleteMultipartUpload><Part><PartNumber>1</PartNumber><ETag>d98cbda43b8d12e08db9e38804eb7397</ETag></Part><Part><PartNumber>2</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>3</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>4</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>5</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>6</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>7</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>8</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>9</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>10</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>11</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>12</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>13</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>14</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>15</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>16</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>17</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>18</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>19</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>