cdc-file-transfer - WindowsからLinuxにファイルを同期およびストリーミングするためのツール

(Tools for synching and streaming files from Windows to Linux)

Created at: 2022-11-03 17:05:08
Language: C++
License: Apache-2.0

CDC ファイル転送

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_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

Cygwin で実行されている cdc_rsync と Linux rsync の比較

また、ネイティブLinuxで実験を実行しました。 Linux、Cygwinの問題を除外します。Linuxは平均35%のパフォーマンスを達成しました よりも悪い Cygwin 、これはCPUの違いに起因する可能性があります。私たちはやりました このため、図には含めませんが、ここで見つけることができます。

rsync
rsync
rsync

それはどのように機能し、なぜそれが速いのですか?

標準のLinuxは、ファイルを固定サイズのチャンクに分割します。 数キロバイト。

rsync

Linux rsync は固定サイズのチャンクを使用します

ファイルが途中で変更された場合、たとえば、の後に挿入する場合、 これは通常、変更されたチャンクと 後続のすべてのチャンクが変更されます。

xxxx
567

データ挿入後の固定サイズのチャンク

標準アルゴリズムは、リモートの「古い」ファイルのチャンクをハッシュします ハッシュをローカルデバイスに送信します。次に、ローカルデバイスが 「新しい」ファイルのどの部分が既知のチャンクと一致するか。

rsync

標準の Linux rsync とファイルを同期する
標準の rsync アルゴリズム

これは単純化です。実際のアルゴリズムはより複雑で、 弱いローリングハッシュと強いハッシュの2つのハッシュは、概要についてはこちらをご覧ください。比較的遅くなるのは、ローリングハッシュが行う「一致しない」状況です。 どのリモートハッシュにも一致せず、アルゴリズムはハッシュをロールフォワードし、 各バイトのハッシュ マップ検索を実行します。 ルックアップの最適化に多大な努力を払っています。

rsync
rsync

cdc_rsync
固定サイズのチャンクを使用せず、代わりに可変サイズを使用します。 コンテンツ定義のチャンク。つまり、チャンク境界はファイルのローカルコンテンツ(実際には64バイトのスライディングウィンドウ)によって決まります。さらに詳しく 詳細については、FastCDCの論文を参照するか、実装をご覧ください。

cdc_rsync、コンテンツ定義の可変サイズのチャンクを使用します

ファイルが途中で変更された場合、変更されたファイルのみ チャンクは変更されますが、後続のチャンクは変更されません (変更から 64 バイト未満離れている場合を除く)。

データ挿入後のコンテンツ定義チャンク

チャンク境界の計算は安価であり、左シフト、メモリのみが必要です ルックアップ、および各入力バイトの操作。これは安いです 標準アルゴリズムのハッシュマップルックアップよりも。

add
and
rsync

このため、アルゴリズムは標準よりも高速です。また、より簡単です。チャンク境界は挿入とともに移動するので または削除、ローカルハッシュとリモートハッシュを照合するタスクは簡単なセットです 差分操作。バイト単位のハッシュ マップ検索は含まれません。

cdc_rsync
rsync

ファイルをcdc_rsyncと同期する
cdc_rsyncアルゴリズム

CDC ストリーム

cdc_stream
は、Windowsマシンからファイルにファイルとディレクトリをストリーミングするためのツールです。 リナックスデバイス。概念的には、sshfsに似ています。 ただし、読み取り速度に最適化されています。

  • ストリーミングされたデータをLinuxデバイスにキャッシュします。
  • ファイルが Windows で変更された後に Linux で再読み込みされた場合、 差分が再度ストリーミングされます。残りはキャッシュから読み取られます。
  • ディレクトリメタデータ(ファイル名、 権限など)ストリーミングに適した方法で提供されます。

ファイルのどの部分が変更されたかを効率的に判断するために、ツールは同じものを使用します CDC ベースの差分アルゴリズムを .Windowsファイルへの変更はほとんどです Linuxにすぐに反映され、約(0.5秒+ 0.7秒x合計)の遅延があります 変更されたファイルのサイズ(GB単位)。

cdc_rsync

cdc_streamデモ

このツールは、Linux から Windows へのファイルの書き戻しをサポートしていません。リナックス ディレクトリは読み取り専用です。

次のグラフは、ゲームを開始してからメニューに到達するまでの時間を比較したものです。 あるケースでは、ゲームはを介してストリーミングされます 、他のケースでは を使用します。全体として、2倍から5倍のスピードアップが見られます。

sshfs
cdc_stream

cdc_streamとsshfsの比較

はじめ

プリコンパイル済みバイナリを最新リリースからダウンロードします。 現在、Githubの最新のUbuntuバージョンでコンパイルされたLinuxバイナリを提供しています。 バイナリが機能する場合は、次の 2 つのセクションをスキップできます。

または、プロジェクトをソースからビルドすることもできます。一部のバイナリは Windows上に構築され、一部はLinux上に構築されています。

前提 条件

ソースからツールをビルドするには、次の手順を Windows と Linux の両方で実行する必要があります。

  • ここからBazelをダウンロードしてインストールしますのワークフローログを参照してください。 現在使用されているバージョン。
  • リポジトリをクローンします。
    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 つのツールは、個別に構築して使用できます。

ティッカー

  • Linux コンポーネントを構築する
    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
    
  • Linux ビルド出力ファイルを Linux システムから Windows マシンにコピーします。
    cdc_rsync_server
    bazel-bin/cdc_rsync_server
    bazel-bin\cdc_rsync

CDC ストリーム

  • Linux コンポーネントを構築する
    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
    
  • Linux ビルド出力ファイルをコピーし、Linux システム上から Windows マシンにコピーします。
    cdc_fuse_fs
    libfuse.so
    bazel-bin/cdc_fuse_fs
    bazel-bin\cdc_stream

使い

ツールには、WindowsマシンからSSHとSCPを使用できるセットアップが必要です パスワードを入力せずにLinuxデバイスに送信する(例:キーベースを使用) 認証。

SSH および SCP の設定

デフォルトでは、ツールはパス環境から検索します 変数。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

CDC ストリーム

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