[英]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.