阿里云OSS上传文件的.net sdk问题分析

本文阅读 5 分钟
首页 信息技术 正文

由于工作需求,需要将文件上传至 OSS(对象存储服务)。起初,我们找来了.net sdk 来实现这一功能。实际上,完全可以依据 API 自行进行开发实现。在此之前,一直使用的是 2.4.0 版本的.net sdk,在日常使用过程中,虽然没有出现什么特别重大的问题,然而,在服务器上进行大文件上传时,会发现 CPU 和内存的占用率都相当高。
在实际应用场景中,最近期望能够显示文件上传的进度和速度。最初的实现方法是采用 System.Threading.Timer,即每秒根据上传流的 Position 来进行判断。在上传单个大文件的情况下,这种方法没有什么问题,能够较为准确地显示进度和速度。但是,当面临多个零碎小文件的上传任务时,就出现了问题。由于一个文件可能不到 1 秒钟就上传完成了,这种情况下,按照之前的方法判断就不准确了。如果采用更小的时间单位来计算速度,又会因为时间过短而导致计算结果不够精确。经过一番思考和尝试,找到了解决方法,那就是不考虑文件的个数,而是记录所有已经上传的字节数。通过用当前的字节数减去上一秒记录的字节数,就可以得到较为准确的上传速度。
当使用大于 2G 的文件进行测试时,出现了报错信息,提示算术运算发生溢出。一开始,以为是 Math.Round 这个方法出现了问题。然而,经过深入查找,最终发现问题出在 Aliyun.Oss 里面的 Util 目录下的 OssUtils.cs 文件的第 203 行。代码中 “int readSize = (int) partSize;” 这一行,其中 partSize 是 long 类型的。由于 2G 的字节数实在太大,无法转换为 Int 类型。而且后面还有 “byte [] buffer = new byte [readSize];”,这种一次性读完 2G 文件并计算 MD5 的方法显然是不可取的。于是,前往官网下载了最新版的 2.8.0 版本。发现这个版本中已经没有了上述有问题的代码。但是,这个新版本的 SDK 与 2.4.0 版本相比,改动相当多。使用之前的方法,速度和进度都无法正常显示了。经过进一步查找原因,发现是上传流的 Position 始终为 0,这表明在新版本中,SDK 在内部进行了另外的处理。既然之前的方法无法实现需求,那就去官网查看一下 SDK 文档。果然,在文档中找到了显示进度的方法。
在服务器上运行新版本的 SDK 时,发现了新的问题。虽然内存占用确实比之前小了,但是 CPU 占用率却非常高,这仍然导致服务器运行十分卡顿。我们的服务器是单核的。经过初步猜测,是不是在计算 MD5 的过程中导致了如此高的 CPU 占用率呢?但是经过一番查找,发现并没有调用 MD5 计算。于是,通过 VS 进行性能分析,最终发现是在进行 CRC64 计算的时候出现了问题。目前,对于这个问题还在进一步探查当中。森尧爱吃糖

本文来自投稿,不代表本站立场,如若转载,请注明出处:
解决项目引用本地局域网 Nuget 服务器
« 上一篇 11-05
用 Ionic 来生成 Android 平台的项目问题分析
下一篇 » 11-06