aws-s3

公孙弘图
2023-12-01

一、参考文档

 v1v2
dependency

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.600</version>
</dependency>

<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.10.71</version>
</dependency>

clientAmazonS3 && TransferManagerS3Client
源码https://github.com/aws/aws-sdk-javahttps://github.com/aws/aws-sdk-java-v2
文档https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/examples-s3.htmlhttps://docs.aws.amazon.com/zh_cn/sdk-for-java/v2/developer-guide/s3-examples.html
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/HLuploadFileJava.html
demohttps://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javahttps://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2

 

二、download测试

注:测试在testcfs的机器11.35.235.206 上进行,相关项目的jar及启动脚本在/opt/app下

版本

方式

关键代码

jconsole-thread

场景1

结果1(耗时单位:毫秒)

分析1

场景2

结果2(耗时单位:毫秒)

分析2

场景3

结果3(耗时单位:毫秒)

分析3

v1v1_
TransferManager方式

v1_transferManager 展开源码

 

244m文件、办公网124789 244m文件、生产网络1261 2.7g文件、生产网络
bucket:ltptest

07-28上午10点:14909

07-28下午4点:10412

07-29上午10点:6185

07-31上午9点:24980(见右图)

07-31上午9点:14236(见右图)

07-31上午10点:5250(见右图)

07-31上午10点:4927(见右图)

 

bucket:flowplayback

07-31上午12点23:13407

07-31上午12点24:13407:7760

07-31上午12点26:13407:6544

 

 

 

 

 

 

 

v1

v1_
RandomAccessFile_8thread同时接收

v1_randomaccessfile 展开源码

 244m文件、办公网555255慢的原因:skip也是读过去的244m文件、生产网络     
v2v2_普通下载

v2_单线程 展开源码

 

250m文件、办公网123649 244m文件、生产网络1156 2.7g文件、生产网络

07-28上午10点:36840

07-28下午4点:28097

07-29上午10点:10080

 

 

三、readline测试

注:测试在testcfs的机器11.35.235.206 上进行,相关项目的jar及启动脚本在/opt/app下

版本

方式

场景1

结果1 (单位毫秒)

备注1

v1

1、将文件以多线程方式下载到本地

2、预读本地文件

3、读取文件的每一行

2.7g文件、生产网络

7-29十点:

文件下载耗时:10412
文件加载耗时:10373
顺序读一遍文件耗时:10770

 

7-30十五点:

文件下载耗时10732
文件加载耗时:8386
读取文件耗时:10634

问题1:多个进程同时将文件下载到同一个位置,对文件内容是否有影响?

答1:transfer的下载逻辑是这样的,一个transfer 的download默认会启动10个线程对一个文件进行下载,每个线程下载不同的part,写到独立的文件中,文件名是独立唯一的,类似这种:bcd7e61c-913a-3563-a14-09665ec109e42456113203890028212.part.1。所有的part下载完之后再进行合并。----->所以如果是多进程进行下载,相互之间不会有影响,只是最后一个完成的进程会把前面进程合并的文件覆盖掉。 answer by@宋德宏

 

问题2:cfs有缓存机制么?为啥我下载文件的时候总是第一次慢,之后就会快很多。测试如下:
下载2g文件第一次:23162ms
下载2g文件第二次:10598ms
下载2g文件第三次:10478ms

下载2.7g文件第一次:24980ms
下载2.7g文件第二次:14236ms
下载2.7g文件第三次:5250ms

答2:因为服务端(cfs)的缓存(pagecache)导致。也就是第一次下载之后,会有部分内容进入pageCache,导致第二次的下载会变快。

注:pagecache的大小与linux的物理内存有关。 answer by@郭卫龙

v1

1、直接加载文件的每行的起始位置

2、用withRange读取每一行

2.7g文件、生产网络

7-30十五点半:

文件加载耗时:21922
读取文件耗时:6264682

问题1:如果文件大的话,用withrange,慢的原因?

答1:每次操作都是个网络消耗(每次都要获取一个IInputSteam),打个比方:从10米远的地方来回搬一箱零食,方式一:每次拿一袋块 方式二:每次拿10袋快

 

四、cfs先关知识

1、生产环境只有一个集群,这个集群的region和endpoint都是一样的。申请bucket需要找运维,bucket中的块大小默认为128m,该参数可以调

2、valume名称就是bucket

3、上传时文件大小最大为5g

 

五、待解决问题

 类似资料: