バックアップのzipファイルを高速にコースへコピー

バックアップのzipファイルを高速にコースへコピー

- Tatsuya Shirai の投稿
返信数: 2

提案:コースバックアップ処理時におけるサーバ側の負担低減の可能性
   (ZIPファイルの一時フォルダからコースフォルダへの移動)

 2GBを越えるバックアップファイルの作成に関する以下の2つの議論,

(1)http://moodle.org/mod/forum/discuss.php?d=114838
(2)http://moodle.org/mod/forum/discuss.php?d=115320

この(2)中でUmedaさんが提案したアイディア,copy()ではなくrename()で作業用一時フォルダからコース内のbackupフォルダへのzipファイルを移動する手法,は,実はとても重要な性能UPに繋がるテクニックなのではないかという気がしてきました.

 コース内のさまざまなファイルをバックアップする作業は,まず安全のために対象となる全ファイルをmoodledata/temp/backupフォルダの下に作成したユニークな名前のフォルダにコピーされます.そしてこの一時フォルダ内でzipファイルを作成後,完成した一つのzipファイルのみをコースのbackupフォルダへコピーし,残りのファイルをユニークな名前のフォルダごと削除します.Moodle2.0は知りませんが,Moodle1.9まではこのような手順です.

 それに対して実際のプログラムでは完成したzipファイルをbackup/backuplib.phpのfunction copy_zip_to_course_dir()を使ってコピーします.この関数から呼び出されるファイルコピーのための関数,backup_copy_file ($from_zip_file,$to_zip_file)はサブフォルダに対応した再帰的なファイルコピーを行なう関数ですが,先に述べたようにコピーするのはたった一つのzipファイルのみです.

 (1)中で私が示した改造案は旧来の処理とほぼ等価です.

 PHP標準のcopy()関数は2GBを越えるファイルを正常にコピーできません(integerを32bitとしてコンパイルした環境).つまりOSに処理を単純に丸投げしているのではなく,自身でファイルを読んで複写していると思われます.rename()関数で”移動”させる処理は20GBのファイルであっても正常に処理が完了することが確認されていることから,処理はそのままOSに丸投げされていると予想されます.本件は特に,”複写”後にオリジナルのzipファイルをフォルダごと削除してしまうことから,”複写”ではなく”移動”で問題ないはずです.OSにもよるかも知れませんが,一時フォルダとコースのフォルダが同じパーティション内にあるのであれば,リネームはファイルサイズによらず一瞬で終了するのではないでしょうか.


 まだTrackerを検索して類似の提案が無いか調べていません.もしこの改良がMoodleの定期バックアップ処理のサーバ側の負担を大幅に低減できるものであるならばTrackerに報告しようと思います.皆様の御意見,お待ちしております.

Tatsuya Shirai への返信

Re: バックアップのzipファイルを高速にコースへコピー

- Tatsuya Shirai の投稿

 手元で試してみましたが,やはり同じドライブであるならば19GBのzipファイルであっても一瞬で移動できますね.

 Windowsの場合でフォルダを跨ぐようなコピーが可能かどうか,まだ調べていなかったことにいま気付いたのですが,取り合えずTrackerに提案してしました.(MDL-18156)

Tatsuya Shirai への返信

Re: バックアップのzipファイルを高速にコースへコピー

- Tatsuya Shirai の投稿
 サーバにドライブが一つしか無いので別のドライブにrename()する実験を行えなかったのですが,何気なくネットワーク上のNASへrename()してみたら成功しました.これなら別ドライブへのcopy()ではなくrename()も問題無さそうです.(もちろん,この場合,巨大なファイルを移動するには相応の時間を要しますが)