minio下载文件速度很慢的原因分析与说明

这篇具有很好参考价值的文章主要介绍了minio下载文件速度很慢的原因分析与说明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.实战背景

最近在做一个项目,需要用到minio来搭建文件系统,先简单说一下我在项目中设置的上传文件流程:

  1. 前端将分块文件逐一传给后端,后端再存储到 linux服务器的minio 当中。
  2. 所有分块文件存储完毕,后端从 minio 下载所有的分块文件到本地磁盘中。
  3. 后端进行合并文件处理,将合并后的文件通过上传到minio(SDK-Minio Java Client有自带分块上传方法)

我在当前的项目开发阶段,java后端服务是直接在本地进行运行,而minio服务则是在购买的轻量服务器中运行

2.问题描述

在上传文件流程的过程二中,我发现一个2MB的分块文件下载到本地磁盘需要两到三秒,而一个大文件肯定会有许多分块文件,这就导致了当前端向后端发送合并文件请求,后端需要花费大量的时间来处理,主要就是花费在了从Minio下载分块文件到本地磁盘上。

  • 一方面导致前端请求超时,无法获取到后端的处理后结果。
  • 另一方面长时间的等待后端处理,严重影响了用户的体验。

minio下载文件速度很慢的原因分析与说明

3.问题分析

1️⃣ 首先我怀疑是使用的服务器本身性能的问题,于是又换了一个新的服务器(6Mbps宽带)用来只运行minio服务,然后发现没卵用,分块文件下载到本地速度还是一样慢。

2️⃣ 然后我做了许多的demo来进行下载测试,在这里我给出比较有代表性的测试案例:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.3</version>
</dependency>
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.3.0</version>
</dependency>
<dependency>
    <groupId>me.tongfei</groupId>
    <artifactId>progressbar</artifactId>
    <version>0.5.3</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.8.1</version>
</dependency>
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import org.apache.tomcat.util.http.fileupload.IOUtils;

import java.io.FileOutputStream;
import java.io.InputStream;

/**
 * @author 狐狸半面添
 * @create 2023-02-11 3:47
 */
public class MinioFileDownLoadTest {
    private final static MinioClient minioClient;

    static {
        minioClient = MinioClient.builder()
                // 指定连接的ip和端口(轻量服务器)
                .endpoint("http://1.14.94.100:9000")
                // 指定 访问秘钥(也称用户id) 和 私有秘钥(也称密码)
                .credentials("admin", "12345678")
                .build();
    }

    public static void main(String[] args) throws Exception {
        // 平均用时:14036ms
        test01();
    }

    public static void test01() throws Exception {
        Long start = System.currentTimeMillis();
        // 拿到输入流,我存放在minio的该文件为 10.1 MB 大小
        InputStream inputStream = minioClient.getObject(
                GetObjectArgs.builder()
                        .bucket("waveedu")
                        .object("林屿森LIN - 小幸运【吉他】 (伴奏).mp3")
                        .build()
        );
        // 拿到输出流,用于下载到本地,命名为 lucky.mp3
        FileOutputStream outputStream = new FileOutputStream("D:\\lucky.mp3");
        // 用于拷贝流
        IOUtils.copy(inputStream, outputStream);
        Long end = System.currentTimeMillis();
        System.out.println("用时:" + (end - start) + "ms");
    }
}

test01()就是我在项目中使用的下载分块文件的方式。我进行了多次测试执行该方法,可以看出确实很慢,10.1MB的文件也要14秒左右。

于是小可爱的我换了一种下载方式:

    public static void test02() throws Exception {
        Long start = System.currentTimeMillis();
        // 使用minio客户端提供的downloadObject方法进行下载
        minioClient.downloadObject(
                DownloadObjectArgs.builder()
                        // 指定 bucket 存储桶
                        .bucket("waveedu")
                        // 指定 哪个文件
                        .object("林屿森LIN - 小幸运【吉他】 (伴奏).mp3")
                        // 指定存放位置与名称
                        .filename("D:\\lucky.mp3")
                        .build());
        Long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

我发现第一次执行该test02()方法下载的耗时和test01()的耗时一样,但之后再执行test02()时发现都只需要0.2秒!

于是我天真的以为就是不应该使用流拷贝的方式,而是应该使用test02()的方式。但修改项目中的下载方式后,几番折腾下来下载分块代码的时间和原来还是一样,依旧2MB的分块文件下载到本地磁盘需要两到三秒。我真哭醉了😭😭😭。

3️⃣ 于是又几番demo测试和源码分析后,我发现了为什么test02()第一次执行的耗时和test01()一样。

我们先看看 downloadObject 方法的对我们而言的关键源码:

minio下载文件速度很慢的原因分析与说明

简单点说,实际上就是 downloadObject 方法中也是使用流拷贝方式进行下载,但在下载之前先会去判断 D:\lucky.mp3 是否已经在本地磁盘存在,如果存在并且与minio中 waveedu 桶的文件 林屿森LIN - 小幸运【吉他】 (伴奏).mp3 所占字节大小一致,就认为是相同文件,没必要再从minio下载。因此第一次执行完test02()方法后之后再执行都是会直接判断出 fileSize == stat.size()为true ,就return了,不会再流拷贝。

而我的test01()是没有走这个判断的,不管本地指定位置存不存在,都会进行流拷贝从minio下载文件。

4️⃣ 发现了不是项目所用的下载方法的原因后,我开始思考是不是人品的问题,于是进行反复无脑愚蠢的重启服务器和重启项目,很显然,没得屁用。

5️⃣ 再到最后,我开始考虑是不是由于对轻量服务器是外网访问,而导致传输速度很慢,因此我依旧使用test01()的方法,在我本地linux虚拟机中启动minio服务,来测试下载速度:

import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import org.apache.tomcat.util.http.fileupload.IOUtils;

import java.io.FileOutputStream;
import java.io.InputStream;

/**
 * @author 狐狸半面添
 * @create 2023-02-11 15:10
 */
public class NativeLinuxTest {
    public static void main(String[] args) throws Exception {
        MinioClient minioClient = MinioClient.builder()
                // 指定连接的ip和端口(该ip是本地虚拟机的虚拟Ip)
                .endpoint("http://192.168.65.130:9000")
                // 指定 访问秘钥(也称用户id) 和 私有秘钥(也称密码)
                .credentials("minioadmin", "minioadmin")
                .build();
        Long start = System.currentTimeMillis();
        // 拿到输入流,我存放在minio的该文件为 10.1 MB 大小
        InputStream inputStream = minioClient.getObject(
                GetObjectArgs.builder()
                        .bucket("waveedu")
                        .object("林屿森LIN - 小幸运【吉他】 (伴奏).mp3")
                        .build()
        );
        // 拿到输出流,用于下载到本地,命名为 lucky.mp3
        FileOutputStream outputStream = new FileOutputStream("D:\\lucky.mmp3");
        // 用于拷贝流
        IOUtils.copy(inputStream, outputStream);
        Long end = System.currentTimeMillis();
        // 平均用时 0.2 到 0.3 秒
        System.out.println("用时:" + (end - start) + "ms");
    }
}

可以看到每次调用该拷贝流的方法都是只需要 0.2 到 0.3 秒左右,因此这也就证明了是由于后端项目启动在本地,而minio服务放在了轻量服务器,后端项目从minio下载文件必须外网访问的缘故。

4.问题解决

但这个问题在我们项目部署后肯定不存在的,因为我们的项目,也包括数据库、minio服务、redis服务肯定都是部署在同一局域网中(如果项目不大的话,简单点操作就是将所有服务放在一台服务器上)。这样的好处就是可以极大的加快数据传输速率。文章来源地址https://www.toymoban.com/news/detail-461720.html

到了这里,关于minio下载文件速度很慢的原因分析与说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决GitHub的速度很慢的几种方式

    这里提供两个最常用的镜像地址: https://hub.njuu.cf/search https://www.gitclone.com/gogs/search/clonesearch 也就是说上面的镜像就是一个克隆版的 GitHub,你可以访问上面的镜像网站,网站的内容跟 GitHub 是完整同步的镜像,然后在这个网站里面进行下载克隆等操作。 利用 Cloudflare Workers 对

    2024年02月13日
    浏览(34)
  • MySQL SQL性能分析,快速排查SQL执行慢的原因(SQL优化 一)

    在开发和维护数据库应用程序时,优化SQL查询的性能是至关重要的。MySQL提供了一些强大的工具和技术,帮助我们进行SQL性能分析,找出潜在的瓶颈并进行相应的优化。 查看SQL的执行频率 show [ session| global ] status 命令查看服务器状态信息,可以查看当前数据库的INSERT、UPDATE、

    2024年02月07日
    浏览(44)
  • 第49篇:域环境中部分员工电脑开机速度缓慢原因分析

    大家好,我是ABC_123,本期分享一个应急响应分析案例。有一家公司自从进行网络改造之后,把所有员工的个人电脑都加入到域环境之中,但是频繁出现部分用户电脑开机速度缓慢问题,而有的用户电脑开机却一直是正常的,一时不知道问题出在哪里。 经过仔细询问,发现出

    2024年02月15日
    浏览(21)
  • [Android Studio]新手向,安装创建项目构建很慢,下载依赖很慢的问题

    一点废话,可以直接跳过:         我是没用过Android Studio,也没学过,几乎零基础使用这个软件,很多原理的知识可能我不是很清楚,只能说,这么弄了,是对的、或者能用的,第一次写博客,也不太会,大佬们口下留情。还没看到运行的示例模板,在最开始导入项目这

    2024年02月05日
    浏览(36)
  • flink cdc初始全量速度很慢原因和优化点

    link cdc初始全量速度很慢的原因之一是,它需要先读取所有的数据,然后再写入到目标端,这样可以保证数据的一致性和顺序。但是这样也会导致数据的延迟和资源的浪费。 flink cdc初始全量速度很慢的原因之二是,它使用了Debezium作为捕获数据变化的引擎,而Debezium在读取数据

    2024年02月11日
    浏览(25)
  • 部分地区解析速度慢的原因和解决方法

    大家都知道,域名解析跟网站是密切相关的。但是在实际上网中,大家会发现有些网站上网速度很快,但是有些网页打开速度非常慢。为什么会出现部分地区解析速度慢,网站打不开? 网页打开快慢问题 特别是在海外上网的朋友,经常会碰到这种情况,大部分网站都能打开,

    2024年02月10日
    浏览(25)
  • android gradle-8.0-bin-zip下载失败、下载很慢的解决方法

    如果你的studio下载gradle很慢或下载失败,你可以去 gradle官网 自己下载,然后按照下面的方法导入即可。 创建一个项目后,先看Settings里的gradle本地存放路径。默认是在C盘自动创建一个“.gradle”的文件夹,可以改到其他盘,但不建议,可能会导致AS下载文件失败或奇怪的问题

    2024年02月04日
    浏览(49)
  • 手机链接WiFi 网络速度慢的5个原因及解决方法

    由于 WiFi 是智能手机连接到互联网的主要方式,因此在你的移动设备上,获得尽可能快的互联网速度比以往任何时候都更加重要。 但是,有很多问题会降低手机上的 WiFi 速度,让我们来了解一下,手机上 WiFi 网络速度慢的5个原因及解决方法: 1、路由器位置不佳 你的手机

    2024年02月09日
    浏览(33)
  • mac磁盘工具显示未装载 磁盘读写速度慢的原因

    Mac电脑在发生过电脑死机、突然断电、直接拔插外置硬盘等事情后,重新开机可能会发现电脑无法正常开机,或者是开机后无法进入系统,在磁盘工具下,磁盘显示未装载。本文将通过一篇简短文章,为大家介绍mac磁盘工具显示未装载,磁盘读写速度慢的原因,如果大家也遇

    2024年02月06日
    浏览(29)
  • SQL Server数据库查询速度慢的原因和解决方法

    SQL Server数据库查询速度慢的原因和解决方法 SQL Server 数据库 查询速度慢的原因有很多,常见的有以下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包