[英]GCS slow upload from pod inside kubernetes GKE
从GKE内的Pod上传到GCE需要很长时间。 我希望升级到kubernetes 1.1会有所帮助,但没有帮助。 它速度更快,但没有达到应有的速度。 我做了一些基准测试,使用100MiB上传了一个文件:
docker 1.7.2本地
花了{20m51s240ms},大约是约{0.07993605115907274} MB / s
docker 1.8.3本地
用了{3m51s193ms},大约是约{0.4329004329004329} MB / s
本地1.docker
用了{3m51s424ms},大约是约{0.4329004329004329} MB / s
kubernetes 1.0
用了{1h10s952ms},大约是约{0.027700831024930747} MB / s
kubernetes 1.1.2(泊坞窗1.8.3)
花费了{32m11s359ms},大约约为{0.05178663904712584} MB / s
如您所见,kubernetes 1.1.2的吞吐量增加了一倍,但仍然很慢。 如果要上传1GB,我必须等待约5个小时,这不是预期的行为。 GKE在Google基础架构中运行,因此我希望它应该比从本地上载更快或更慢。
我还注意到上传时CPU负载很高(70%)。 它使用n1-highmem-4
机器类型和单个RC / pod进行了测试,该RC / pod除了上传外什么也不做。
我正在将Java客户端与GAV坐标com.google.appengine.tools:appengine-gcs-client:0.5
相关代码如下:
InputStream inputStream = ...; // 100MB RandomData from RAM
StorageObject so = new StorageObject().setContentType("text/plain").setName(objectName);
AbstractInputStreamContent content = new InputStreamContent("text/plain", inputStream);
Stopwatch watch = Stopwatch.createStarted();
storage.objects().insert(bucket.getName(), so, content).execute();
watch.stop();
使用带有gsutil cp
的手动安装的gcloud复制100MB文件几乎不需要时间(3秒)。 因此,java库可能是一个问题? 问题仍然存在,如何使用java-library提高上传时间?
解决方案是启用“ DirectUpload”,所以不要编写
storage.objects().insert(bucket.getName(), so, content).execute();
你必须写:
Storage.Objects.Insert insert = storage.objects().insert(bucket.getName(), so, content);
insert.getMediaHttpUploader().setDirectUploadEnabled(true);
insert.execute();
使用此解决方案可获得的性能:
Java文档的setDirectUploadEnabled
:
设置是启用还是禁用直接媒体上载。
如果将value设置为true,则将在单个请求中上载整个媒体内容的情况下直接上载。 如果将值设置为false,则上载使用可恢复媒体上载协议上载数据块。
如果内容大小低于某个最小限制,则建议直接上传。 这是因为某些Google API的最小块写入大小,因此,如果可恢复请求在第一个块的空间内失败,则无论如何客户端都必须从头开始重启。
默认为false。
您看到较高的CPU负载,并且速度缓慢只会影响Java而不是Python gsutil
,这一事实与Java 8中的缓慢AES GCM问题是一致的。 使用适当的专用CPU指令在Java 9中解决了该问题。
如果您对此有控制权,则可以使用Java 7或将jdk.tls.disabledAlgorithms=SSLv3,GCM
添加到传递给java -Djava.security.properties
的文件中,如常规通用慢速AES GCM的此答案中所述,应解决慢速问题题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.