😝

gcloud alpha storage を試してみる

2021/12/22に公開

この記事はGoogle Cloud Platform Advent Calendar 2021、21日の記事です。遅れてすみませんm(_ _)m

https://qiita.com/advent-calendar/2021/gcp

まとめ

  • 2021年7月20日に gcloud alpha storage がリリースされたよ
  • gcloud alpha storage は ls、cp、rmしかないよ
  • --format json 未対応です
  • ダウンロードアップロード時の細かい値の設定をよしなにやってくれるので、gsutilをデフォルト設定で使うよりは少なくともダウンロードは明らかに早いよ

2021年7月20日にこのようなリリースが出ていました。

https://cloud.google.com/storage/docs/release-notes#July_20_2021

というわけで、出た時にすぐ試したのですが、それから少し時間も経ったしもう一度試してみるかなというのが今回の趣旨です。
※ 当時の結果は後で貼っておきます
ただ、当時からは多分あんまり変わってない…のかな?という感じです。

gclouda alpha storageコマンドと、gsutilコマンドとでは、以下の記事にある通り、転送速度は改善されています。ただ、cloud shell で試してみると、ダウンロード速度は改善されていますが、アップロードは若干遅いかも?という感じです。
https://cloud.google.com/blog/ja/products/storage-data-transfer/new-gcloud-storage-enables-super-fast-data-transfers

time コマンドでざっくりと試した結果を貼っておきます。

その前にバケット作成します。
現在、cpとlsとrmしかありませんので、バケットの作成は gsutil コマンドで行います。

$ gsutil mb gs://nekochan1729
Creating gs://nekochan1729/...

オプションなんも付けてないので、USでマルチリージョンで作成されています。

$ gcloud alpha storage mb gs://hogehogeaqwewrw
ERROR: (gcloud.alpha.storage) Invalid choice: 'mb'.
Maybe you meant:
  gcloud alpha media
  gcloud alpha storage cp
  gcloud alpha storage ls
  gcloud alpha storage rm

To search the help text of gcloud commands, run:
  gcloud help -- SEARCH_TERMS

もちろんエラーになりました。

そうそう、これを試しておきたかったのです

$ gcloud alpha storage ls -L -b gs://nekochan1729 --format json
gs://nekochan1729/:
  Storage Class:               STANDARD
  Location Type:               multi-region
  Location Constraint:         US
(snip)

jsonなフォーマットでは出力されませんでした。かなしみ。

cloud shell

1Gのファイルのアップロード

gcloud alpha storage

$ time gcloud alpha storage cp testtestfile gs://nekochan1729
Copying file://testtestfile to gs://nekochan1729/testtestfile
  Completed files 1/1 | 1000.0MiB/1000.0MiB | 94.3MiB/s

Average throughput: 93.6MiB/s

real    0m13.157s
user    0m5.337s
sys     0m2.164s

real    0m10.936s
user    0m5.300s
sys     0m2.044s

real    0m15.931s
user    0m5.415s
sys     0m1.574s

real    0m10.891s
user    0m5.722s
sys     0m2.480s

real    0m10.930s
user    0m5.613s
sys     0m2.649s

gsuitl

$ time gsutil cp testtestfile gs://nekochan1729
Copying file://testtestfile [Content-Type=application/octet-stream]...
==> NOTE: You are uploading one or more large file(s), which would run
significantly faster if you enable parallel composite uploads. This
feature can be enabled by editing the
"parallel_composite_upload_threshold" value in your .boto
configuration file. However, note that if you do this large files will
be uploaded as `composite objects
<https://cloud.google.com/storage/docs/composite-objects>`_,which
means that any user who downloads such objects will need to have a
compiled crcmod installed (see "gsutil help crcmod"). This is because
without a compiled crcmod, computing checksums on composite objects is
so slow that gsutil disables downloads of composite objects.

| [1 files][ 1000 MiB/ 1000 MiB]
Operation completed over 1 objects/1000.0 MiB.

real    0m10.320s
user    0m5.593s
sys     0m2.570s

real    0m10.303s
user    0m5.656s
sys     0m2.509s

real    0m10.580s
user    0m5.741s
sys     0m2.231s

1Gのファイルのダウンロード

gcloud alpha storage

$ time gcloud alpha storage cp gs://nekochan1729/testtestfile test02
Copying gs://nekochan1729/testtestfile to file://test02
  Completed files 1/1 | 1000.0MiB/1000.0MiB | 100.2MiB/s

Average throughput: 143.0MiB/s

real    0m9.108s
user    0m4.108s
sys     0m3.427s

real    0m8.143s
user    0m3.955s
sys     0m3.004s

real    0m9.122s
user    0m3.936s
sys     0m3.170s

gsutil

$ time gsutil cp  gs://nekochan1729/testtestfile test01
Copying gs://nekochan1729/testtestfile...
- [1 files][ 1000 MiB/ 1000 MiB]   68.3 MiB/s
Operation completed over 1 objects/1000.0 MiB.

real    0m16.821s
user    0m14.988s
sys     0m8.574s

real    0m17.171s
user    0m15.641s
sys     0m8.667s

real    0m17.171s
user    0m15.641s
sys     0m8.667s

とはいえ、cloud shell はかなり低いスペックのVMのはずですので、若干身銭を切って大きめのサイズのものを試してみることにしましょう。でもヒヨって e2-standard-4 です。

e2-standard-4

1Gのファイルのアップロード

gcloud alpha storage

$ time gcloud alpha storage cp test01 gs://nekochan1729/test11
Copying file://test01 to gs://nekochan1729/test11
  Completed files 1/1 | 1000.0MiB/1000.0MiB | 146.8MiB/s

Average throughput: 160.3MiB/s

real    0m7.639s
user    0m4.747s
sys     0m1.092s

real    0m7.074s
user    0m5.042s
sys     0m1.502s

real    0m7.644s
user    0m4.979s
sys     0m1.499s

gsutil

$ time gsutil cp test01 gs://nekochan1729/test11
Copying file://test01 [Content-Type=application/octet-stream]...
==> NOTE: You are uploading one or more large file(s), which would run
significantly faster if you enable parallel composite uploads. This
feature can be enabled by editing the
"parallel_composite_upload_threshold" value in your .boto
configuration file. However, note that if you do this large files will
be uploaded as `composite objects
<https://cloud.google.com/storage/docs/composite-objects>`_,which
means that any user who downloads such objects will need to have a
compiled crcmod installed (see "gsutil help crcmod"). This is because
without a compiled crcmod, computing checksums on composite objects is
so slow that gsutil disables downloads of composite objects.

- [1 files][ 1000 MiB/ 1000 MiB]
Operation completed over 1 objects/1000.0 MiB.

real    0m6.807s
user    0m4.979s
sys     0m1.592s

real    0m6.630s
user    0m4.872s
sys     0m1.442s

real    0m6.780s
user    0m4.924s
sys     0m1.489s

1Gのファイルのダウンロード

gcloud alpha storage

$ time gcloud alpha storage cp gs://nekochan1729/test11 test02
Copying gs://nekochan1729/test11 to file://test02
ERROR: This download was skipped since the google-crc32c
binary is not installed, and Python hash computation will likely
throttle performance. You can change this by installing the binary
by running "/usr/bin/python3 -m pip install google-crc32c --target /usr/lib/google-cloud-sdk/lib/third_party" or
modifying the "storage/check_hashes" config setting.
  Completed files 0/1 | 0B/1000.0MiB

real    0m1.049s
user    0m0.701s
sys     0m0.105s

エラー出るんで入れますが、pipないのでpipいれるところから

Reading package lists... Done
Building dependency tree       
Reading state information... Done
(snip)

$ sudo /usr/bin/python3 -m pip install google-crc32c --target /usr/lib/google-cloud-sdk/lib/third_party
Collecting google-crc32c
  Downloading https://files.pythonhosted.org/packages/5b/82/f2754137e0e5026065c8b2f32baf69767a2d7e574da2a125f7caeb9ddb96/google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Installing collected packages: google-crc32c
Successfully installed google-crc32c-1.3.0
$ time gcloud alpha storage cp gs://nekochan1729/test11 test02
Copying gs://nekochan1729/test11 to file://test02
  Completed files 1/1 | 1000.0MiB/1000.0MiB

Average throughput: 671.2MiB/s

real    0m2.652s
user    0m3.995s
sys     0m2.795s

real    0m2.656s
user    0m3.805s
sys     0m2.559s

real    0m2.625s
user    0m3.788s
sys     0m2.577s

gsutil

$ time gsutil cp gs://nekochan1729/test11 test02
Copying gs://nekochan1729/test11...
- [1 files][ 1000 MiB/ 1000 MiB]   78.7 MiB/s
Operation completed over 1 objects/1000.0 MiB.

real    0m14.064s
user    0m13.988s
sys     0m7.108s

real    0m14.659s
user    0m14.636s
sys     0m7.554s

real    0m13.827s
user    0m13.648s
sys     0m7.018s

この違いよ!
ただ、これはあくまで デフォルトで の話です。gsutilでも設定を色々とすれば早くはなるはずです(分割ダウンロードするとか)。ただ、その最適な値を見つけるのはかなり大変[1]なので、よしなにやってくれるのは大変にありがたいかなと思いました。

というわけで、今回のようなダウンロード時には gcloud alpha storageを使ったら早くなるということが体感出来たところで、今回は終わりにします。

もっと検証しようと思います。

脚注
  1. マシンのパワーとか回線とか、ファイルサイズや同時に転送したいファイル数などで色々変わるので… ↩︎

Discussion