Spring WebFlux文件上传性能问题

时间:2020-08-21 15:33:03

标签: spring-mvc file-upload spring-webflux project-reactor

我创建了两个用于测试文件上传的示例应用程序,一个使用MVC,一个使用WebFlux( Spring Boot 2.4.0-M2 ,因为它们已经实现了零拷贝无阻塞{{1 }})。我没有在服务器上配置任何东西(Netty和Tomcat)。

WebFlux代码:

transferTo

MVC代码:

public Mono<Void> uploadFile(Mono<FilePart> filePartMono) {
    return filePartMono.flatMap(
        filePart -> filePart.transferTo(
            STORAGE_PATH.resolve(UUID.randomUUID().toString())
        )
    );
}

我创建了两个JMeter测试,一个测试一个大文件上传(2GB ISO),另一个测试使用1000个线程使用小文件(1MB文档)。

MVC文件上传的速度比WebFlux快10倍左右,并且从未抛出错误。另一方面,WebFlux有时永远不会完成文件上载,但不会引发异常(某种死锁?),或者在其他情况下,我在设备错误上没有剩余空间了。我研究了后者,结果发现文件被复制/临时存储在文件夹public void uploadFile(MultipartFile multipartFile) throws IOException { multipartFile.transferTo( STORAGE_PATH.resolve(UUID.randomUUID().toString()) ); } 中,并且驱动器很快就装满了。即使文件上传成功完成,也不会删除这些文件。谷歌搜索找不到关于此问题的任何信息。 (我也找不到这些文件在Windows中的写入位置,因此我现在缺少30GB的空间。:))

正如我所观察到的那样,MVC一次写入一打文件,而WebFlux一次向所有人写入小块。我应该在其他Scheduler上发布以减少上下文切换,还是会引入其他瓶颈?

我在这里想念什么?我应该期望什么性能是正常的?在本地主机上,我估计(几乎)操作系统复制速度。

编辑:从WebFlux代码片段中删除了publishOn(Schedulers.boundedElastic())。

编辑2:我也尝试使用/tmp/spring-multipart的{​​{1}}方法读取FilePart,它也填满了我的content()文件夹,但是这次临时文件位于DataBuffers中。内存消耗远远超过了MVC。

0 个答案:

没有答案