作者:张医博
案例一:
OSSBrower "no space left on"
分析:
有明显报错信息的先 Google 一下,看看是操作系统错误还是 OSSBrower 抛出,经过鉴定错误是 Linux 系统底层返回,说明当时系统的 OSSBrower 所在的目录磁盘满了,开源的错误到处可以看到,自行解决即可。
案例二:
分片上传成功,下载 404
分析:
如果分片上传成功,肯定不会出现访问 404 的情况,检查下
- 上传成功后 OSS 有没有返回 requestID ,如果没有返回证明是没有上传成功的。
- 客户端的代码是否判断分片上传成功就去下载文件是有问题的,分片上传成功不代表文件都上传完成。
- 分片上传应该在 complete 合并分片之前进行判断 httpstatu==200 & requestID != None 才是真正的上传成功。
- 如果文件已经合并完成,并且返回 requestID,但还是下载 404 ,需要升级阿里云进行处理。
案例三:
IO error
背景:
客户端上传 OSS 过程中出现 “uploadFile:fail Write error: ssl=0x76d62a40: I/O error during system call, Software caused connection abort ”
分析:
这个是标准的 android 系统的报错,不是 oss 的问题,有很多开源的错误都有描述,建议参考下
参考1
参考2
案例四:
背景:Could not resolve host
2018/10/24 14:03:47 hlg_matting_PreF (pid=15693)(error): parseUrl2Image.hpp(186), read_element: image_url_service connect fail: Could not resolve host: da.oss-cn-hangzhou-internal.aliyuncs.com, url: https://da.oss-cn-hangzhou-internal.aliyuncs.com/mattings/0/images/20181024-135354-f5ee.jpg
上传 OSS 文件解析失败,DNS 无法解析于域名,此问题需要排查下 DNS 是否工作正常,或者主机上的 DNS 服务是否正常。
案例五:
背景:python SDK 分片上传失败
用户通过 python SDK 的分片上传函数上传到 OSS 失败,碎片管理中出现很对碎片。
- 先确认是直接传到 OSS,还是通过其他 proxy 传输到 OSS (类似 CDN),如果经过 CDN 再上传到 OSS 需要在 OSS 上配置跨域的头,Access-Control-Allow-Origin 、Access-Control-Allow-Mehtod 、Access-Control-Allow-header,并且将 Etag 暴露出去。
- 客户端上传失败是因为网络超时,还是捕获到异常上传失败,需要详细看下捕获到的 SDK 异常信息分析,如果是网络超时导致上传失败,建议使用断点续传来替代普通上传。断点续传支持分片,并发,已经弱网的兼容。
- 清理掉上传失败的碎片文件重新上传。
- 当以上操作都解决不了你的问题时,需要提供以下信息升级阿里云便于快速定位:
-
- 提供 SDK 异常时返回的 requestID,这个属性是 response header 中携带的记录了完整的 OSS 请求过程。
-
- 客户端部署 tcpdump ,然后重新运行代码上传,保存抓包。
- -i <网卡出口名称> -s0 host <访问oss的域名> -w faild.pcap
案例六:
C# SDK 分片上传报错
错误 2019/2/13 10:24:28 ServerApi 0 无 "Failed to stop service. System.InvalidOperationException: An unhandled exception was detected ---> System.IO.IOException: Unable to read data from the transport connection: The connection was closed.
at Aliyun.OSS.Util.AsyncResult.WaitForCompletion()
at Aliyun.OSS.Common.Communication.RetryableServiceClient.EndSend(IAsyncResult ar)
at Aliyun.OSS.Util.OssUtils.EndOperationHelper[TResult](IServiceClient serviceClient, IAsyncResult asyncResult)
at SAAS.Common.Aliyun.MultipartUploadSample.UploadPartCallback(IAsyncResult ar)
at Aliyun.OSS.Common.Communication.ServiceClientImpl.<>c__DisplayClass5.<BeginSetRequestContent>b__4(IAsyncResult ar)
at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threadin..."
排查
- 出现类似报错是因为客户设置的分片过小导致,先问题出用的是分片上传 还是断点续传;
- 如果是分片上传,根据文件总大小合理的提升分片 size ,比如客户原来设置的是 50M,现在可以提升到 100M 测试;
- 另外请使用断点续传重新替换下分片上传,此案例在分析过程中通过客户端的抓包发现大量的丢包重传,这种情况下是普通的分片可能直接报错,不会再进行重传了。
案例七:
OSS 上传后,但显示长度为 0
排查
1) 首先排查下客户端上传是用什么方式 (SDK、API、工具)不同的方法可能使用也是不同的。确认好使用 SDK 我们使用客户端的原文件进行上传测试,看问题是否可以复现。
- 可以复现,说明我们自己可以进行排查无需用户配合;
- 我们自己复现不了说明问题是客户个案,肯定不是 工具或者产品的问题;
2) 获取当前问题发生的 OSS requestID - 如果是工具,可以通过增加 log 的方式来获取,比如 ossutil 有时候会在控制台显示,也可以通过当前目录下的隐藏的操作日志来确认;
- 如果是 SDK ,客户可以通过代码返回的结果对象中获取到这个属性,比如 java SDK
3)当获取到 requestID 查询到日志后,先看下用户上传的结果是 200 还是异常的,如果是 200 说明上传成功;
其次看下用户写入的长度是多大?如果客户写入的就是 0 字节,那么和 MD5 没有任何关系,OSS 除了分片、断点续传方法对第一片的大小有限制(100KB)外,其余的普通上传方法均没有对文件最小值做限制,也就是用户可以上传一个空文件。