wiki:TipAndDoc/service/Google/Drive/Comparision

Version 2 (modified by mitty, 6 years ago) (diff)

--

  • Googleドライブ クライアントの仕様比較
  • 検証に用いる一時ファイルなどは以下のように用意した
    dd if=/dev/urandom of=1GiB.0 count=1048576 bs=1024
    for i in {0..9}; do dd if=/dev/urandom of=102.4MiB.$i count=7482 bs=14351; done
    for i in {0..99}; do dd if=/dev/urandom of=10.24MiB.$i count=346 bs=31033; done
    for i in {0..100}; do dd if=/dev/urandom of=1MiB.$i count=1024 bs=1024; done
    for i in {0..1000}; do dd if=/dev/urandom of=100KiB.$i count=100 bs=1024; done
    
    $ du -b
    1073745920      ./1.1Gx1
    1073745916      ./2.102Mx10
    1073745896      ./3.10Mx100
    105910272       ./4.1Mx100
    102539264       ./5.100Kx1000
    
    • 4.1Mx100 は実際には101ファイル、5.100Kx1000も同じく1001ファイル
  • rsync オプションについて
    rsync --times --recursive --links --human-readable --whole-file --delete --stats --inplace --verbose
    
    • ファイルシステムとしてマウント可能なクライアントに対して使用
    • コピー中の一時ファイルを作成させないため、 --inplace オプションを用いた
    • rsync · astrada/google-drive-ocamlfuse Wiki
  • dstat のオプションは次のようにした
    dstat -t -c -m -d -n -o dstat.csv --nocolor 5
    
  • 検証環境
    • QEMU/KVM VM on Core i7-4790 (wiki:TipAndDoc/Hardware#ASUSH97M-PLUS)
    • vCPU: 2cores
    • Mem : 2GB
    • Disk: qcow2 file backend on software RAID1 HDD x2
    • ArchLinux 4.10.x (途中で何度かアップデート)

用語について

  • アップロード
    • ローカルストレージからGoogleドライブへの移動・コピー。もしくはマウントされているFUSEへの書き込み
  • ダウンロード
    • アップロードの逆で、ローカルストレージへの移動・コピー。もしくはマウントされているFUSEからの読み込み
  • キャッシュ
    • FUSEを使ってマウントする場合に、ローカルストレージに作成される一時ファイル
  • ファイルID
    • Googleドライブ上でアイテム(ファイル・ディレクトリ)を一意に指定するID
    • Googleドライブではディレクトリもファイルの一種
    • ブラウザ上ではURLにこれが含まれる

brief overview of comparison

  • 各ツールの設定において、特にチューニング等は行っていない
  • I/Oの速度計測は十分な回数実施し平均をとるべきだが、傾向が見たいだけだったので各1回しか計測していない
名前 アクセス方法 Up Down mtimeの保存 CPU負荷 操作の中断
- - 1.07GB x1102MB x1010MB x1001MB x1011.07GB x1102MB x1010MB x1001MB x101アップロードダウンロード *1 - -
ブラウザWebUI10MB/s~未計測未計測未計測10MB/s~未計測未計測未計測保存されない保存されない低負荷
google-drive-ocamlfuse FUSE mount940.87KB/s828.39KB/s623.52KB/s158.71KB/s14.04MB/s9.72MB/s未計測503.27KB/s保存されない保存される高負荷(IO wait)不可
GDriveFSFUSE mount3.22MB/s *21.95MB/s1.11MB/s197.46KB/s計測不可 *3984.82KB/s *4未計測816.26KB/s *4場合による *5 保存される高負荷(usr)不可
rcloneCUI (rsync like)7.064MB/s9.783MB/s8.532MB/s2.397MB/s16.521MB/s19.585MB/s未計測4.493MB/s保存される保存される低負荷
  1. rsyncコマンドでのみ確認
  2. I/Oエラーが発生したため、dstatでの計測下でない条件での参考値
  3. I/Oエラーが発生したため
  4. 一部のファイルでI/Oエラーが発生した
  5. cpコマンド cp -a では保存されないが、rsyncコマンドでは保存される

copy/move

  • cp, mvなどによるファイルの複製・移動について
  • ブラウザからの操作
    • すべてサーバーサイドで処理される
    • 単純な移動はmtimeが維持されるが、ファイル名変更は維持されない
    • コピーは新しいファイルの作成となるため、mtimeは維持されない
  • rclone
    • Googleドライブはサーバーサイドでの移動・コピーをサポートしているため、rcloneでもサーバーサイドで処理される
    • https://rclone.org/overview/#optional-features Googleドライブを含め、各種クラウドストレージサービスの機能比較
    • 移動先はディレクトリである必要がある
    • mitty@google:~$ rclone move google:/move/rclone/1MiB google:/move/rclone/1MiB.move
      2017/04/23 19:35:35 ERROR : Google drive root 'move/rclone/1MiB.move': can't move files on overlapping remotes
      2017/04/23 19:35:35 ERROR : Attempt 1/3 failed with 0 errors and: can't move files on overlapping remotes
      2017/04/23 19:35:35 ERROR : Google drive root 'move/rclone/1MiB.move': can't move files on overlapping remotes
      2017/04/23 19:35:35 ERROR : Attempt 2/3 failed with 0 errors and: can't move files on overlapping remotes
      2017/04/23 19:35:35 ERROR : Google drive root 'move/rclone/1MiB.move': can't move files on overlapping remotes
      2017/04/23 19:35:35 ERROR : Attempt 3/3 failed with 0 errors and: can't move files on overlapping remotes
      2017/04/23 19:35:35 Failed to move: can't move files on overlapping remotes
      
    • mitty@google:~$ rclone move google:/move/rclone/1MiB google:/move/1MiB.move
    • mitty@google:~$ rclone ls google:/move/1MiB.move
        1048576 1MiB
      
      • 1MiBファイルがリネームされるのではなく、1MiB.moveというディレクトリの中に移動される

move of directory tree

  • ブラウザからの操作と同様、treeディレクトリがdestディレクトリにリネームする(もしくはdestディレクトリに移動する)のと同等のコマンド操作が可能
    • mitty@google:~$ time rclone -v move google:/move/rclone/tree/ google:/move/rclone/dest/
      2017/04/23 22:11:26 INFO  : Google drive root 'move/rclone/dest': Modify window is 1ms
      2017/04/23 22:11:26 INFO  : Google drive root 'move/rclone/dest': Server side directory move succeeded
      2017/04/23 22:11:26 INFO  :
      Transferred:      0 Bytes (0 Bytes/s)
      Errors:                 0
      Checks:                 0
      Transferred:            0
      Elapsed time:        4.6s
      
      real    0m4.606s
      user    0m0.027s
      sys     0m0.000s
      
    • mitty@google:~/mnt/google-drive-ocamlfuse/move/gdo$ date; time mv -v tree dest; date
      Sun Apr 23 22:14:44 JST 2017
      'tree' -> 'dest'
      
      real    0m1.874s
      user    0m0.000s
      sys     0m0.000s
      Sun Apr 23 22:14:46 JST 2017
      
    • mitty@google:~/mnt/gdfs/move/gdfs$ date; time mv -v tree dest; date
      Sun Apr 23 22:17:43 JST 2017
      'tree' -> 'dest'
      
      real    0m1.804s
      user    0m0.000s
      sys     0m0.000s
      Sun Apr 23 22:17:45 JST 2017
      
  • ディレクトリのファイルIDは維持される
  • ツリー以下のファイル数が多くなっても、ディレクトリ自体の移動は一瞬で完了する

google-drive-ocamlfuse

mount/umount

  • mitty@google:~/mnt$ google-drive-ocamlfuse google-drive-ocamlfuse
    Mar 20 16:46:10 google kernel: fuse init (API version 7.26)
    Mar 20 16:46:10 google systemd[1]: Mounting FUSE Control File System...
    Mar 20 16:46:10 google systemd[1]: Mounted FUSE Control File System.
    
  • $ mount
    google-drive-ocamlfuse on /home/mitty/mnt/google-drive-ocamlfuse type fuse.google-drive-ocamlfuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
    
  • fusermount -u /home/mitty/mnt/google-drive-ocamlfuse

features

  • $HOME/.gdfuse/default/cache/ にキャッシュを作成する
    • ファイルIDがファイル名になっている
  • マウントしたローカルディレクトリは、Sambaからアクセスできない(見えなくなる)
    • Googleドライブをローカルにマウントして、その中身をSambaでさらに別のPCからアクセスすることはできない
  • マウントしたディレクトリへアクセスする場合、まずキャッシュファイルが作成される
    • マウントしたディレクトリへのコピー・移動時: キャッシュファイル作成→Googleドライブへネットワーク転送
    • マウントしたディレクトリからの場合: Googleドライブからキャッシュディレクトリへダウンロード→目的のパスにファイル作成
  • rmコマンドによる削除はゴミ箱(.Trash/)への移動となる

mtime

  • cp -a、rsyncのいずれでも、アップロード時は一部のファイルを除いて更新日時は同期時に変更されてしまう
    • mtimeが保存されるファイルとそうでないファイルの違いは不明 。拡張子などによる違いではない模様
  • ダウンロード時はmtimeは保存される

I/O

  • アップロード
    • ネットワーク転送に先立ってディスク上にキャッシュが作成されるが、かなり時間がかかる (10MB/s程度しか出ない)が、アップロード自体は高速(~100Mbps)
    • キャッシュ作成中はCPUがIO waitで高負荷になる(100%)
    • キャッシュ作成のI/Oが完了する前にGoogleドライブ上にはファイルが作成されている
      • ただしサイズが表示されないので、openされただけのような状態でデータにはアクセスできない模様
    • キャッシュの作成完了とともに書き込みプロセスからシェルに制御ぎゃもどるため、writeが終了したとして処理されている模様
      • 実際のネットワークアップロードはその後バックグラウンド処理
  • ダウンロード
    • FUSEからの読み込みによってキャッシュが作成されるが、これもIO waitで高負荷になる(80%~)
    • Googleドライブからのダウンロード自体は高速(~190Mbps)
    • キャッシュへの書き込み終了後の読み込みは高速かつ低IO wait

move/copy

  • マウントしたディレクトリ上でのcp, mvいずれでもmtimeは保存されない
  • cpはサーバーサイドで処理されず、一度キャッシュにダウンロードしたのち改めてアップロードとして処理される
  • mvはサーバーサイドで処理され、ファイルIDも維持される

error handling

  • マウント中に、Googleアカウント側でクレデンシャルを削除するなどして接続を切ると、lsのI/Oがブロックして帰ってこなくなる
    • 割り込み不可のためCtrl+Cなども効かないが、google-drive-ocamlfuseプロセスをkillすることで一応回避可能
  • 書き込み(アップロード)が完了したように見えても、fusermount -uせずGoogleアカウント側でクレデンシャルを削除して切断するとファイルが壊れることがある模様
  • アンマウント中にGoogleアカウント側でクレデンシャルを削除し、google-drive-ocamlfuseで再マウントしてもエラー表示などは表示されない
    • debug表示があるかは未確認
    • ただしアクセスしようとするとI/Oエラーになる
      $ google-drive-ocamlfuse ~/mnt/google-drive-ocamlfuse/
      $ ls -la google-drive-ocamlfuse
      ls: cannot access 'google-drive-ocamlfuse': Input/output error
      

config

  • read onlyにすることが可能
    • $ vim .gdfuse/default/config
      read_only=true
      
    • $ touch google-drive-ocamlfuse/tmp
      touch: cannot touch 'google-drive-ocamlfuse/tmp': Permission denied
      
    • $ mount
      google-drive-ocamlfuse on /home/mitty/mnt/google-drive-ocamlfuse type fuse.google-drive-ocamlfuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
      
      • mount上は区別できない

debug

  • mitty@google:~$ google-drive-ocamlfuse -debug ~/mnt/google-drive-ocamlfuse/
    Starting application setup (label=default, base_dir=/home/mitty/.gdfuse).
    Opening log file: /home/mitty/.gdfuse/default/gdfuse.log
    
    • foregroud で動作する
    • ただし、不安定になるためあまり使いにくそう
  • mitty@google:~$ ls -l mnt/google-drive-ocamlfuse
    ls: cannot access 'mnt/google-drive-ocamlfuse': Software caused connection abort
    
  • mitty@google:~$ google-drive-ocamlfuse -debug ~/mnt/google-drive-ocamlfuse/
    Illegal instruction (core dumped)
    

GDriveFS

mount/umount

  • mitty@google:~$ gdfstool mount ~/.gdfs/cred ~/mnt/gdfs/
  • sudo umount /home/mitty/mnt/gdfs
  • $ gdfstool mount -o big_writes .gdfs/cred ~/mnt/gdfs/
    • はっきりわかるほどの差は発生しなかった

features

  • /tmpにキャッシュを作成する
    • ディストリビューションによってはtmpfs(オンメモリ)になっていることが多いので、巨大なファイルにアクセスしようとすると空き容量が不足してファイルが壊れることがある
      'sample/1GiB' -> 'gdfs/sample/1GiB'
      cp: error writing 'gdfs/sample/1GiB': Input/output error
      
    • export TMPDIR=/var/tmp/等、キャッシュを作成するパスを変更することで回避可能
  • google-drive-ocamlfuse 同様、ファイルへのアクセスは一度tmpにキャッシュファイルが作成される
  • getfattrコマンドにより、Googleドライブ上でのファイルIDや作成日時(ctime)、修正日時(mtime)などの属性を確認できる
  • lnによるsymlinkは作成できない
  • rmはゴミ箱ではなく即座に削除される

mtime

  • google-drive-ocamlfuse 同様、cp -aでもアップロード時はmtimeは保存されない
  • ダウンロードでは保存される

I/O

  • キャッシュ作成時は50MB/s程度、ネットワーク転送はアップロード・ダウンロードとも~30Mbpsほどで低速
  • キャッシュ作成中はCPUがIO waitで高負荷になる(~80%)が、時間はそれほどかからない

move/copy

  • google-drive-ocamlfuseと同様、マウントしたディレクトリ上でのcp, mvいずれでもmtimeは保存されない
  • mvはサーバーサイドで処理されるが、cpはローカルのキャッシュを経由してダウンロード→アップロードされる
  • mvではファイルIDは維持される

error handling

  • 転送途中にCtrl+Cで強制終了ができない
    • psで見るとSTATがDになっている
  • gdfstoolのプロセスをkillするなどして無理に強制終了すると、OSのシャットダウン時にI/Oがブロックされたままになることがある

debug

  • mitty@google:~/.gdfuse/default$ cat curl.log
    [15.400034] curl: info:   Trying 172.217.25.74...
    [15.400053] curl: info: TCP_NODELAY set
    [15.436757] curl: info: Connected to www.googleapis.com (172.217.25.74) port 443 (#0)
    [15.436874] curl: info: ALPN, offering http/1.1
    [15.436914] curl: info: Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
    [15.441081] curl: info: successfully set certificate verify locations:
    [15.441089] curl: info:   CAfile: /etc/ssl/certs/ca-certificates.crt
      CApath: none
    [15.441138] curl: info: TLSv1.2 (OUT), TLS header, Certificate Status (22):
    
  • mitty@google:~/.gdfuse/default$ cat gdfuse.log
    [0.000102] TID=0: Setting up default filesystem...
    [0.000116] TID=0: Loading configuration from /home/mitty/.gdfuse/default/config...done
    [0.000193] TID=0: BEGIN: Saving configuration in /home/mitty/.gdfuse/default/config
    [0.000258] TID=0: END: Saving configuration in /home/mitty/.gdfuse/default/config
    [0.000282] TID=0: Loading application state from /home/mitty/.gdfuse/default/state...done
    Current version: 0.6.7
    Setting up cache db...done
    Setting up CURL...done
    Refresh token already present.
    [0.002030] TID=0: Starting filesystem /home/mitty/mnt/google-drive-ocamlfuse/
    [0.004052] TID=1: init_filesystem
    [15.395620] TID=2: getattr /
    [15.395644] TID=2: BEGIN: Loading metadata from db
    [15.395883] TID=2: BEGIN: Recalculating cache size (old value=213280358)
    [15.396095] TID=2: END: Recalculating cache size (new value=213280358)
    [15.396101] TID=2: END: Getting metadata: Not valid
    [15.396104] TID=2: BEGIN: Refreshing metadata
    

rclone

  • Googleドライブを含め、多数のクラウドストレージに対応している
  • 認証
    • google-drive-ocamlfuse と同様に、ハードコードされたクライアントIDを使うことも、自分で用意したものを設定することもできる

features

  • FUSE mountする機能もあるがまだ実験的 (EXPERIMENTAL)
  • copyコマンドなど多くのコマンドが、引数のパスをディレクトリ名として扱うことが多い点に注意が必要
    • 特に移動・コピー先のパス(dest)はディレクトリして扱われるコマンドが多い
    • このため、あるファイルを別のディレクトリにコピーすることはできるが、コピー先のファイル名を指定してコピーと同時にリネームするようなことはできない
  • 同時並行で複数の処理が行われる。デフォルトでは4並行
    • 当然だが各転送ごとの帯域はその並行数だけ分割される
  • 使用するネットワーク帯域に制限をかけることができる
  • パスワードを設定し透過的に暗号化することができる
  • ログをファイルもしくはsyslogに出力可能

mtime

  • ダウンロード・アップロードとも保存される
  • move, copyコマンドにおいても維持される
  • ディレクトリのmtimeは保存されない

I/O

  • CPU負荷はusr, io waitとも高くなく、制限しなければネットワーク帯域をすべて使い切ることができる

move

  • mitty@google:~$ rclone move google:/mtime/rclone google:/mtime/rclone.test
    • 移動前と移動後で、ファイルのファイルIDは維持される
      $ getfattr -d mnt/gdfs/mtime/rclone/1MiB | grep '\.id'
      user.original.id="0B6fZtAGUBbvtazRXTjR2T19GZzQ\012"
      
      $ getfattr -d mnt/gdfs/mtime/rclone.test/1MiB | grep '\.id'
      user.original.id="0B6fZtAGUBbvtazRXTjR2T19GZzQ\012
      
  • mitty@google:~$ date; time rclone move google:/rclone/1.1Gx1 google:/rclone/dest/1.1Gx1
    Thu Mar 30 01:00:19 JST 2017
    
    real    0m4.700s
    user    0m0.023s
    sys     0m0.000s
    
    • サーバーサイドで処理されるため、ファイルサイズに関わらず数秒で完了する
    • ネットワーク帯域もほぼ使用しない
      $ dstat -t -c -m -d -n -o dstat.csv --nocolor 5
      ----system---- --total-cpu-usage-- ------memory-usage----- -dsk/total- -net/total-
           time     |usr sys idl wai stl| used  free  buff  cach| read  writ| recv  send
      30-03 01:00:13|  3   1  96   0   0| 140M 1671M 36.2M  120M|   0   819B|1357B 3805B
      30-03 01:00:18|  0   0  98   2   0| 140M 1671M 36.2M  120M|   0  9011B| 281B  349B
      30-03 01:00:23|  0   0 100   0   0| 146M 1665M 36.2M  120M|   0   819B|9626B 1965B
      30-03 01:00:28|  0   0  99   1   0| 140M 1671M 36.3M  120M|   0  3277B|1401B  718B
      30-03 01:00:33|  0   0 100   0   0| 140M 1671M 36.3M  120M|   0   819B| 524B  507B
      

copy

  • mitty@google:~$ time rclone copy google:/mtime/rclone/1MiB google:/mtime/rclone/1MiB.copy
    real    0m6.659s
    user    0m0.027s
    sys     0m0.010s
    
    • moveと同じく、サーバーサイドで処理されるため、ファイルサイズに関わらず数秒で完了する
    • 同様にネットワーク帯域もほぼ使用しない
      ----system---- --total-cpu-usage-- ------memory-usage----- -dsk/total- -net/total-
           time     |usr sys idl wai stl| used  free  buff  cach| read  writ| recv  send
      01-04 23:05:47|  1   0  98   1   0| 147M 1720M 18.6M  104M|   0   819B| 721B 1281B
      01-04 23:05:52|  1   1  97   1   0| 142M 1725M 18.6M  104M|   0  4096B|1087B 3182B
      01-04 23:05:57|  0   0  99   1   0| 148M 1718M 18.6M  104M|   0    15k|  13k 1908B
      01-04 23:06:02|  0   0 100   0   0| 141M 1725M 18.6M  104M|   0     0 |7335B 2294B
      
    • コピーの場合は当然ながらファイルIDは異なったものになる
      mitty@google:~$ getfattr -d mnt/gdfs/mtime/rclone/1MiB | grep '\.id'
      user.original.id="0B6fZtAGUBbvtSkVLTzI4YjM3Nm8\012"
      mitty@google:~$ getfattr -d mnt/gdfs/mtime/rclone/1MiB.copy/1MiB | grep '\.id'
      user.original.id="0B6fZtAGUBbvtel93REFhTUpvUkE\012"
      
  • 10MB x100ファイル (約1GB)のコピーであっても短時間で処理できる
    • mitty@google:~$ date; time rclone copy google:/rclone/3.10Mx100 google:/rclone/dest/3.10Mx100.copy
      Sat Apr  1 23:13:24 JST 2017
      
      real    0m25.053s
      user    0m0.083s
      sys     0m0.037s
      
    • $ dstat -t -c -m -d -n -o dstat.csv --nocolor 5
      ----system---- --total-cpu-usage-- ------memory-usage----- -dsk/total- -net/total-
           time     |usr sys idl wai stl| used  free  buff  cach| read  writ| recv  send
      01-04 23:13:17|  0   0 100   0   0| 156M 1710M 18.8M  104M|   0     0 | 627B  547B
      01-04 23:13:22|  0   0  99   1   0| 157M 1710M 18.8M  104M|   0  2458B| 296B  363B
      01-04 23:13:27|  0   0 100   0   0| 161M 1705M 18.8M  104M|  21k    0 |  14k 2225B
      01-04 23:13:32|  0   0  99   1   0| 163M 1704M 18.8M  104M|   0  2458B|  76k 5625B
      01-04 23:13:37|  0   0 100   0   0| 164M 1702M 18.8M  104M|   0     0 |  13k 4202B
      01-04 23:13:42|  0   0  99   1   0| 164M 1702M 18.8M  104M|   0  2458B|  12k 4351B
      01-04 23:13:47|  0   0 100   0   0| 164M 1702M 18.8M  104M|   0   819B|  13k 4506B
      01-04 23:13:52|  0   0  99   1   0| 157M 1709M 18.9M  104M|   0  3277B|4994B 1486B
      01-04 23:13:57|  0   0 100   0   0| 157M 1709M 18.9M  104M|   0     0 | 502B  479B
      
  • 自分がオーナーではないファイルについてもサーバーサイドでコピーが可能
    • mitty@google:~$ rclone -v copy google:/share/shared google:/share/copy
      2017/05/19 01:13:45 INFO  : Google drive root 'share/copy': Modify window is 1ms
      2017/05/19 01:13:47 INFO  : Google drive root 'share/copy': Waiting for checks to finish
      2017/05/19 01:13:47 INFO  : Google drive root 'share/copy': Waiting for transfers to finish
      2017/05/19 01:13:48 INFO  : 10.24MiB.5: Copied (server side copy)
      2017/05/19 01:13:48 INFO  : 1MiB: Copied (server side copy)
      2017/05/19 01:13:49 INFO  : test/10.24MiB: Copied (server side copy)
      2017/05/19 01:13:49 INFO  : test/1MiB.copy: Copied (server side copy)
      2017/05/19 01:13:49 INFO  :
      Transferred:      0 Bytes (0 Bytes/s)
      Errors:                 0
      Checks:                 0
      Transferred:            4
      Elapsed time:        6.6s
      
    • google:/share/shared 以下のファイルは別ユーザーからの共有ファイル

encrypt/decrypt

  • https://rclone.org/crypt/
  • ファイル名の暗号化にも対応
  • nonce を用いる(24バイト、ファイルの先頭に保存される)ため、同じパスワード、同じファイルであっても暗号化後は異なるファイルになる
    • このため、ファイルサイズは若干大きくなる
  • パスワードと別にsaltも指定可能(password2として指定できる)

Attachments (1)

Download all attachments as: .zip