Java 如何在不影响性能的情况下从web服务器的网络中加载一个大文件?

Java 如何在不影响性能的情况下从web服务器的网络中加载一个大文件?,java,performance,amazon-s3,garbage-collection,jooby,Java,Performance,Amazon S3,Garbage Collection,Jooby,我有一个web服务器(Java+Jooby+undertow),它需要定期从AWSS3加载一个大数据模型(大约200MB)。 我也做了我所能做的来避免gc问题:每次大二进制数据被加载到预先分配的bytebuffer,我还使用零拷贝数据模式flatbuffers来序列化模型 但我发现每次加载大模型时,都会出现请求延迟峰值。 我甚至试图禁用模型反序列化,但延迟峰值仍然存在 我的问题是:如何在不影响性能(延迟)的情况下在web服务器中加载大型模型?我发现下载大型s3文件(或下载到本地磁盘或内存)会导致

我有一个web服务器(Java+Jooby+undertow),它需要定期从AWSS3加载一个大数据模型(大约200MB)。 我也做了我所能做的来避免gc问题:每次大二进制数据被加载到预先分配的bytebuffer,我还使用零拷贝数据模式flatbuffers来序列化模型

但我发现每次加载大模型时,都会出现请求延迟峰值。 我甚至试图禁用模型反序列化,但延迟峰值仍然存在


我的问题是:如何在不影响性能(延迟)的情况下在web服务器中加载大型模型?

我发现下载大型s3文件(或下载到本地磁盘或内存)会导致服务延迟峰值。限制下载线程数可以缓解这个问题。
最后,我将下载逻辑转移到另一个进程,这似乎解决了这个问题。但是当CPU消耗较高时,我们仍然可以看到小峰值。

我发现下载大s3文件(无论是本地磁盘还是内存)都会导致服务延迟峰值。限制下载线程数可以缓解这个问题。
最后,我将下载逻辑转移到另一个进程,这似乎解决了这个问题。但是当CPU消耗很高时,我们仍然可以看到小的峰值。

您使用哪种java版本和GC?在服务器环境中,如果您有足够的RAM,我建议使用G1GC(Java9+中的默认GC)@JMax这是我的jvm选项:-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xms8192m-Xmx8192m-XX:+UseG1GC-XX:+AggressiveOpts-XX:+UseLargePages-server,我认为*GRAM对于我的应用程序来说已经足够了。在源系统上以文件格式导出,而不是使用一些文件传输系统进行传输,最终加载到目标系统上做事情需要时间,就是这样。如果不提高延迟,则无法反序列化200MB的数据。但是为什么web服务器需要定期加载这些数据呢?为什么它不能将数据保存在内存中?@Holger因为我的模型一直在训练,所以模型数据需要定期上传到在线服务器。你使用哪种java版本和GC?在服务器环境中,如果您有足够的RAM,我建议使用G1GC(Java9+中的默认GC)@JMax这是我的jvm选项:-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xms8192m-Xmx8192m-XX:+UseG1GC-XX:+AggressiveOpts-XX:+UseLargePages-server,我认为*GRAM对于我的应用程序来说已经足够了。在源系统上以文件格式导出,而不是使用一些文件传输系统进行传输,最终加载到目标系统上做事情需要时间,就是这样。如果不提高延迟,则无法反序列化200MB的数据。但是为什么web服务器需要定期加载这些数据呢?为什么它不能将数据保存在内存中?@Holger因为我的模型一直在训练,所以模型数据需要定期上传到在线服务器。