Stadiaの灰から生まれたこのリポジトリには、同期のためのツールと Windows から Linux へのファイルのストリーミング。これらは、定義されたコンテンツに基づいています チャンキング(CDC)、特にファストCDC、 をクリックして、ファイルをチャンクに分割します。
Stadiaでは、ゲーム開発者はLinuxクラウドインスタンスにアクセスしてゲームを実行できました。 ただし、ほとんどの開発者はWindowsでゲームを作成しました。したがって、彼らは リモートLinuxインスタンスでそれらを使用できるようにする方法。
開発者はこれらのインスタンスにSSHアクセスできたため、コピーに使用できます ゲームの内容。しかし、これは、特にへの移行では実用的ではありませんでした。 パンデミック時の在宅勤務は、標準以下のインターネット接続です。 常に完全なファイルをコピーし、ものだけをコピーする「デルタモード」はありません 変更された、それは多くの小さなファイルのために遅く、速い圧縮はありません。
scp
scp
この状況を支援するために、私たちは2つのツールを開発しました。 これにより、開発者は繰り返し作業を行わずにゲームをすばやく繰り返すことができます 数十GBを送信するコストが発生します。
cdc_rsync
cdc_stream
cdc_rsyncは、WindowsマシンからLinuxデバイスにファイルを同期するためのツールです。 標準のLinuxのrsyncに似ています。そうです 基本的にはコピーツールですが、すでに古いものがある場合に最適化されています ターゲットディレクトリで使用可能なファイルのバージョン。
リモート差分アルゴリズムは CDC に基づいています。私たちのテストでは、最大30倍です で使用されているものよりも高速です(1500 MB /秒対50 MB /秒)。
rsync
次のグラフは、実行中のLinuxとの比較を示しています。 ウィンドウズ上のCygwinの下で。テスト データは 58 の開発ビルドで構成されています 評価目的で当社に提供されたいくつかのゲームの。ビルドは40〜45GBです 大きい。この実験では、最初のビルドをアップロードしてから、2 番目のビルドを同期しました 2つのツールのそれぞれで構築し、時間を測定しました。たとえば、同期 ビルド1からビルド2まではCygwinで210秒かかりましたが、75秒しかかかりませんでした 秒と。3つの外れ値は、おそらく デルタがはるかに高かった別の開発ブランチ。全体として、ファイルを同期します Cygwinの約3倍の速さ 。
cdc_rsync
rsync
rsync
cdc_rsync
cdc_rsync
rsync
また、ネイティブLinuxで実験を実行しました。 Linux、Cygwinの問題を除外します。Linuxは平均35%のパフォーマンスを達成しました よりも悪い Cygwin 、これはCPUの違いに起因する可能性があります。私たちはやりました このため、図には含めませんが、ここで見つけることができます。
rsync
rsync
rsync
標準のLinuxは、ファイルを固定サイズのチャンクに分割します。 数キロバイト。
rsync
ファイルが途中で変更された場合、たとえば、の後に挿入する場合、 これは通常、変更されたチャンクと 後続のすべてのチャンクが変更されます。
xxxx
567
標準アルゴリズムは、リモートの「古い」ファイルのチャンクをハッシュします ハッシュをローカルデバイスに送信します。次に、ローカルデバイスが 「新しい」ファイルのどの部分が既知のチャンクと一致するか。
rsync
これは単純化です。実際のアルゴリズムはより複雑で、 弱いローリングハッシュと強いハッシュの2つのハッシュは、概要についてはこちらをご覧ください。比較的遅くなるのは、ローリングハッシュが行う「一致しない」状況です。 どのリモートハッシュにも一致せず、アルゴリズムはハッシュをロールフォワードし、 各バイトのハッシュ マップ検索を実行します。 ルックアップの最適化に多大な努力を払っています。
rsync
rsync
cdc_rsync固定サイズのチャンクを使用せず、代わりに可変サイズを使用します。 コンテンツ定義のチャンク。つまり、チャンク境界はファイルのローカルコンテンツ(実際には64バイトのスライディングウィンドウ)によって決まります。さらに詳しく 詳細については、FastCDCの論文を参照するか、実装をご覧ください。
ファイルが途中で変更された場合、変更されたファイルのみ チャンクは変更されますが、後続のチャンクは変更されません (変更から 64 バイト未満離れている場合を除く)。
チャンク境界の計算は安価であり、左シフト、メモリのみが必要です ルックアップ、および各入力バイトの操作。これは安いです 標準アルゴリズムのハッシュマップルックアップよりも。
add
and
rsync
このため、アルゴリズムは標準よりも高速です。また、より簡単です。チャンク境界は挿入とともに移動するので または削除、ローカルハッシュとリモートハッシュを照合するタスクは簡単なセットです 差分操作。バイト単位のハッシュ マップ検索は含まれません。
cdc_rsync
rsync
cdc_streamは、Windowsマシンからファイルにファイルとディレクトリをストリーミングするためのツールです。 リナックスデバイス。概念的には、sshfsに似ています。 ただし、読み取り速度に最適化されています。
ファイルのどの部分が変更されたかを効率的に判断するために、ツールは同じものを使用します CDC ベースの差分アルゴリズムを .Windowsファイルへの変更はほとんどです Linuxにすぐに反映され、約(0.5秒+ 0.7秒x合計)の遅延があります 変更されたファイルのサイズ(GB単位)。
cdc_rsync
このツールは、Linux から Windows へのファイルの書き戻しをサポートしていません。リナックス ディレクトリは読み取り専用です。
次のグラフは、ゲームを開始してからメニューに到達するまでの時間を比較したものです。 あるケースでは、ゲームはを介してストリーミングされます 、他のケースでは を使用します。全体として、2倍から5倍のスピードアップが見られます。
sshfs
cdc_stream
プリコンパイル済みバイナリを最新リリースからダウンロードします。 現在、Githubの最新のUbuntuバージョンでコンパイルされたLinuxバイナリを提供しています。 バイナリが機能する場合は、次の 2 つのセクションをスキップできます。
または、プロジェクトをソースからビルドすることもできます。一部のバイナリは Windows上に構築され、一部はLinux上に構築されています。
ソースからツールをビルドするには、次の手順を Windows と Linux の両方で実行する必要があります。
git clone https://github.com/google/cdc-file-transfer
cd cdc-file-transfer git submodule update --init --recursive
最後に、Windows デバイスに SSH クライアントをインストールします (存在しない場合)。 ファイル転送ツールには、と .
ssh.exe
scp.exe
2 つのツールは、個別に構築して使用できます。
bazel build --config linux --compilation_mode=opt --linkopt=-Wl,--strip-all --copt=-fdata-sections --copt=-ffunction-sections --linkopt=-Wl,--gc-sections //cdc_rsync_server
bazel build --config windows --compilation_mode=opt --copt=/GL //cdc_rsync
cdc_rsync_server
bazel-bin/cdc_rsync_server
bazel-bin\cdc_rsync
bazel build --config linux --compilation_mode=opt --linkopt=-Wl,--strip-all --copt=-fdata-sections --copt=-ffunction-sections --linkopt=-Wl,--gc-sections //cdc_fuse_fs
bazel build --config windows --compilation_mode=opt --copt=/GL //cdc_stream
cdc_fuse_fs
libfuse.so
bazel-bin/cdc_fuse_fs
bazel-bin\cdc_stream
ツールには、WindowsマシンからSSHとSCPを使用できるセットアップが必要です パスワードを入力せずにLinuxデバイスに送信する(例:キーベースを使用) 認証。
デフォルトでは、ツールはパス環境から検索します 変数。Windowsのcmdで次のコマンドを実行できる場合 パスワードを入力すると、すべての設定が完了します。
ssh.exe
scp.exe
ssh user@linux.device.com scp somefile.txt user@linux.device.com:
ここで、 は Linux ユーザーであり、 は Linux ホストです。 SSH でファイルを作成するか、ファイルをコピーします。
user
linux.device.com
追加の引数が必要な場合は、SSH設定を指定することをお勧めします ファイル。デフォルトでは、両方を使用し、ファイルが存在する場合はWindowsでファイルを使用します。可能な設定ファイル ユーザー名、ポート、IDファイル、および既知のホストファイルを設定すると、次のようになります。 次のように:
ssh.exe
scp.exe
%USERPROFILE%\.ssh\config
Host linux_device HostName linux.device.com User user Port 12345 IdentityFile C:\path\to\id_rsa UserKnownHostsFile C:\path\to\known_hosts
見つからない場合は、次の方法でフルパスを指定できます。 コマンドライン引数とforおよび(下記参照)、または環境変数とを設定します。
ssh.exe
scp.exe
--ssh-command
--scp-command
cdc_rsync
cdc_stream start
CDC_SSH_COMMAND
CDC_SCP_COMMAND
set CDC_SSH_COMMAND="C:\path with space\to\ssh.exe" set CDC_SCP_COMMAND="C:\path with space\to\scp.exe"
環境変数を使用してSSH構成を指定することもできます 設定ファイルを使用する代わりに:
set CDC_SSH_COMMAND=C:\path\to\ssh.exe -p 12345 -i C:\path\to\id_rsa -oUserKnownHostsFile=C:\path\to\known_hosts set CDC_SCP_COMMAND=C:\path\to\scp.exe -P 12345 -i C:\path\to\id_rsa -oUserKnownHostsFile=C:\path\to\known_hosts
小さい for と大文字に注意してください。
-p
ssh.exe
-P
scp.exe
Google の内部で使用する場合は、次の環境変数を設定して SSH を有効にします。 Google セキュリティ キーを使用した認証:
set CDC_SSH_COMMAND=C:\gnubby\bin\ssh.exe set CDC_SCP_COMMAND=C:\gnubby\bin\scp.exe
セキュリティキーを複数回タッチする必要があることに注意してください 最初の実行。後続の実行では、1 回のタッチのみが必要です。
cdc_rsyncは、または Linux コマンドと同様に使用されます。同期するには Linux上のホームディレクトリへの単一のWindowsファイル デバイス 、実行
scp
rsync
C:\path\to\file.txt
~
linux.device.com
cdc_rsync C:\path\to\file.txt user@linux.device.com:~
cdc_rsync通常の Windows ワイルドカードと .
*
?
cdc_rsync C:\path\to\*.txt user@linux.device.com:~
Windows ディレクトリの内容を再帰的に Linux デバイス上に同期するには、次のコマンドを実行します。
C:\path\to\assets
~/assets
cdc_rsync C:\path\to\assets\* user@linux.device.com:~/assets -r
ファイルごとの進行状況を取得するには、以下を追加します。
-v
cdc_rsync C:\path\to\assets\* user@linux.device.com:~/assets -vr
Windows ディレクトリを Linux にストリーミングするには デバイス、実行
C:\path\to\assets
~/assets
cdc_stream start C:\path\to\assets user@linux.device.com:~/assets
This makes all files and directories in available on immediately, as if it were a local copy. However, data is streamed from Windows to Linux as files are accessed.
C:\path\to\assets
~/assets
To stop the streaming session, enter
cdc_stream stop user@linux.device.com:~/assets
このコマンドはワイルドカードも受け入れます。例えば
cdc_stream stop user@*:*
特定のユーザーの既存のすべてのストリーミングセッションを停止します。
最初の実行時に、すべての作業を行うバックグラウンド サービスを開始します。 とコマンドは、次のような単なるRPCクライアントです。 サービスに相談してください。
cdc_stream
cdc_stream start
cdc_stream stop
サービスは既定でログに記録します。ログは次のとおりです。 アセットストリーミングの問題を調査するのに役立ちます。カスタム引数を渡すには、または サービスをデバッグするには、コマンドラインフラグを使用してJSON構成ファイルを作成します。 例えば
%APPDATA%\cdc-file-transfer\logs
%APPDATA%\cdc-file-transfer\cdc_stream.json
{ "verbosity":3 }
デバッグ メッセージをログに記録するようにサービスに指示します。使用可能なフラグの一覧を試してください。または、サービスを手動で実行します。
cdc_stream start-service -h
cdc_stream start-service
フラグをコマンドライン引数として渡します。サービスを手動で実行すると、 このフラグは、コンソールにログを記録するので特に便利です ファイルの代わりに。
--log-to-stdout
cdc_rsync常にコンソールにログを記録します。ログの詳細度を上げるには、デバッグ ログまたは詳細ログを渡します。
-vvv
-vvvv
同期とストリームの両方で、デバッグログには、次のようなすべてのSSHおよびSCPコマンドが含まれます。 が実行され、トラブルシューティングに非常に役立ちます。コマンドの場合 予期せず失敗した場合は、コピーして単独で実行します。パスまたは 追加のデバッグ出力。
-vv
-vvv