FileZillaクライアントで大量のファイル転送をする機会があったのでメモしておきます。
FTPはネットワーク上のファイル転送に関しては高速な部類で、SMBやSFTPなどと比べて有利ですが、ファイル数が膨大になるとオーバーヘッド(通信のやり取り部分の)が気になってくるため、サーバのディスクスペースに余裕がある場合はtarで固めてからダウンロードする方が段違いで高速です。
この記事ではFTPについて記述しますが、更新ファイルだけ転送するような用途だとrsyncの方が段違いで速く、全体のファイル数が100万件を超えている場合でも数分で転送完了しますので、同期したいような場合はrsyncがおすすめです。
画像など圧縮してもたいして小さくならないファイルが多い場合は、圧縮の「-z」オプションはつけず「-cvf」で固めると少し速度が早いです。
「-c」が新規アーカイブの作成、「-v」は進行状況を表示、「-f」はアーカイブファイル名を指定するオプションです。
単体で指定する場合は「-c」のようにしますが、複数のオプションを指定する場合は「-c -f」ではなく、「-cf」みたいにハイフン以降はオプションの英字だけを追加して指定します。
tar -cvf ./アーカイブファイル名.tar /対象ディレクトリ
/var/www/html/web ディレクトリをまるごと「backup.tar」へ固める場合は以下のような感じです。
tar -cvf ./backup.tar /var/www/html/web
圧縮する場合は以下のように「-z」オプションも合わせて指定します(オプション指定は順番が変わっても同じ意味です)
tar -cvzf ./backup.tar /var/www/html/web
固めてる最中のロードアベレージはこんな感じでした。
4コアでロードアベレージだと400が限界のサーバーです。
かなり負荷がかかっていますが、圧縮を有効にした場合よりはマシな感じでした。
超過するとWebサーバでは503のエラーが、CGIは強制的に落とされるので「Premature end of script headers」という500のエラーが大量に出はじめます。
Webサーバの設定で限界を超えた指定をしているとサーバごと落ちる場合もあります。
以下はtarで固めた57GBのデータをFileZillaでダウンロードしているところですが、だいたい250Mbps~270Mbps(31MB/s~34MB/s)ほどの速度が出ました。
非常に安定してダウンロードでき、約30分ほどで57GBのデータがダウンロードできました。
1分あたり平均1.9GB、1秒あたり平均31.6MBの転送と非常に優秀で、バスパワーのポータブルHDDといい勝負ですね。
以下がダウンロード先のHDDですが非常に余裕があります。
書き込み速度は33MB/s前後となっており、ネットワークの転送速度がボトルネックになっているのが分かります。
大量のファイルを転送するとPCのCPUにも負担がかかりますが、1件の場合は高速な転送でも負荷は非常に低いです。
FileZilla自体のは5%ほどのCPU使用率でした。
1件の場合は余裕がありますが、ハードディスクは並列での読み書きは苦手なので、同時に他の転送も開始すると途端に怪しくなってきます。
転送速度は2件同時に行っているときで482Mbpsと2倍近い速度になっていますが、
ハードディスクの方がこんな状態になりました。
SSDなら大丈夫だと思いますが、ヘッドが激しく動く音が不安で中止しました。
また、平均応答時間も1秒ほどとなっており、この状態でHDDを開いて操作しようとすると、もたついて何度も待たされます。
劣化したHDDにここまで負荷をかけるとご臨終することもあります。
続いて、圧縮せずに大量のファイルをダウンロードした場合です。
サーバのディスクスペースに余裕がなく、外付けHDDもつけられない場合は仕方ありませんが、非常に効率が悪いです。
FileZillaのCPU使用率は32.5%と、思ったより高くはありませんが、大量のディスクI/Oや画面の描画でPCがカクつく状態になりました。
FileZillaも以下のように転送中のファイルなどが見えなくなったり非常に不安定になります。
これについては画面の描画にも結構なパワーを食われるみたいなので、「最小化」しておくと多少マシになりました。
転送速度もこんな感じです。
たまに大きめのファイルがあると転送速度が上がりますが、1Mbps~2Mbpsと非常に遅いです。
110GBのデータでダウンロード完了まで6時間ほどかかりましたので、1時間あたり平均18.3GB、1分あたり305MB、1秒あたり5.08MBの転送量です。
tarで固めた1ファイルのダウンロードでは、1分あたり平均1.9GB、1秒あたり平均31.6MBの転送ができたので1/6ほどの速度しか出ておらず段違いに遅いですね。
こんな遅い状態ですが、同時転送が一応有効になっており、件数で言うと1時間あたり37万件、1分あたり6166件、1秒あたり102件の転送が行えているのでFileZillaは中々優秀です。
共用サーバでこんな転送をすると迷惑がかかるので、全開でダウンロードするのはプライベートなサーバのみにしておき、レンタルサーバでは同時接続数を「2」くらいまでにしておいた方が無難です。
ダウンロード失敗が多発する場合や、PCの負荷があまりにも高い場合も「同時接続数を制限する」で同時接続数を小さめにすると改善します。
サーバの負荷はtarで固めてる最中よりマシですが、そこそこの負荷が非常に長い時間続いてしまいます。
トラフィックはこんな感じです。
効率が悪いためか、ほとんど上昇しませんでした。
このように大量の転送だとFileZillaが不安定になってきて転送に失敗するファイルもかなりの数になりますが、再度まるごと転送すると「変更がないファイルはスキップ」にしても再び数時間かかってしまいます。
「失敗した転送」タブから失敗した項目だけ再転送できますが、再転送は後回しにしたい場合は「失敗した転送」を「エクスポート」しておくと、失敗した転送だけ後で転送できます。
以下は撮り忘れたので空ですが、FileZilla下部で「失敗した転送」に切り替えます。
右クリックから「エクスポート」します。
「FileZilla.xml」という設定ファイルと同じファイル名でエクスポートされるので紛らわしいですが、FileZillaの失敗したキューだけが含まれたファイルです。
インポートする場合は「ファイル」から「インポート」で先程出力した「FileZilla.xml」を指定します。
以下のように「キュー」だけが含まれています。
「OK」を押すとエクスポートした「失敗した転送」がキューに追加されますので「キューを処理」で転送が開始できます。
「ファイル」メニューから「エクスポート」をすると、以下のようにエクスポートする項目が自由に選べますが、「失敗した転送」からのエクスポートは「キュー」だけエクスポートできるという感じです。
何度も転送するような場合はFTPでなく、rsyncで転送した方が遥かに効率良く転送できます。
「失敗した転送」が一時的なものであれば、上記のように「失敗したキューだけ再転送」すれば成功しますが、キューのリストが以下のように文字化けしている場合は文字コードが合っていないので、設定を変更しないと何度やっても失敗します。
「SJIS」や「EUC-JP」の場合は「自動検出」、「UTF-8」の場合は「UTF-8を強制」で転送すると上手くいきます。
上記で間違った文字コードになっていると、FileZillaのサーバ上のファイル名も文字化けしているのが確認できますので、変更後に再接続して文字化けの有無を確認すると良いです。
長年使っているサーバだと文字コードが混在している事が結構あったりします。
ダウンロードした.tarは必要なデータだけWinRARなどで取り出した方が良いです。
全部展開するとファイル数が膨大なため、再び別のHDDへ移動したい場合に長い時間がかかりますが、固めた状態なら数分でコピーできます。
WinRARでダブルクリックして中を見ようとするとファイルやディレクトリの一覧が表示されるまで10分ほどかかり、ファイル数のカウントが200万を超えたところで以下のような警告が出ましたが、問題なく開けて必要なデータが取り出せました。
32bitの時代はファイル数が多い場合は分割したりと扱いが面倒でしたが、64bitになってからはよほど古いアプリケーションから以外は普通に扱えるので非常に楽になりました。
Comment