いつもお世話になっております。村上です。
以前、Moodle2.9でのバックアップの作業ファイルが
残る件で質問させていただきましたが、
今回、Moodle2.6で似た症状が出ました。
日次でコースバックアップをcliで実行して取得しているのですが
1つのコースでバックアップが失敗するようになり、
管理者向けにもエラーが発生している旨のメールが飛び始めました。
エラーの発生原因調査を行っていますが、現状で問題になっているのが
サーバの仕様容量が一気に増加しており確認したところ
moodledata/temp/backup の下にmbzファイルを生成する途中で
使われた作業用のファイルとディレクトリが沢山残っており、
これがディスクを占有しているのがわかりました。
本番環境で発生している事案であり、削除したいところですが
サーバの動作に影響はないでしょうか?
ご存知の方がいらっしゃいましたら、ご教授していただきたいと思います。
ご参考までに下記投稿をご覧ください。
[Moodle in English: Moodledata/temp/backup folder (Moodle 2.6)]
https://moodle.org/mod/forum/discuss.php?d=314625
はい、「moodledata/temp/backup/作業ファイルのディレクトリの有無とステータスとの関連性は直接にはないという認識で問題」ありません。
恐らく、コースに含まれるコースファイルの合計サイズが大きいために生じたエラーだと思いますので、php.iniのディレクティブ「max_execution_time」の値を増やすことにより、解決できるのではないでしょうか。
参考資料:
[[MDL-50255] Backup fail as Backup fail as "unfinished" on course > 4GB - Moodle Tracker]
https://tracker.moodle.org/browse/MDL-50255
[PHP: 実行時設定v(max_execution_time) - Manual]
http://php.net/manual/ja/info.configuration.php#ini.max-execution-time
こちらでも年度またぎのシステム移行で問題になる可能性があったため確認してみました。CentOS 6.4 x64, PHP5.4, Moodle 2.8 での内容になります。
複数の動画を含むコースを手動でバックアップ開始したところ、90%以上進んだバックアップ終了直前と思しき場所で"error/error_zip_packing"を出して止まってしまいました。backup/moodle2/backup_stepslib.phpを確認すると1782行目あたりでバックアップ時に作成したZipファイルの作成やテストして問題があればZipファイルを削除しエラーを表示させるようになっています。ここで一時ファイルを消す処理を行っていないためにバックアップ用のゴミが残ってしまっています。
サイト管理 ► 開発 ► 実験用 ► 実験用設定 で「新しいバックアップフォーマットを有効にする」を有効にして再度手動バックアップを開始すると今度はバックアップに成功しました。8.5GBのmbzが得られたので、Zipの際は2GBまたは4GBの制限に引っかかっていたようです。
なお、php.iniの設定はmemory_limit = 128M, max_execution_time = 300 になっています。Moodleの設定(サイト管理 ► サーバ ► パフォーマンス)はデフォルト設定のままにしています。
バックアップに失敗する件ですが、上記の同様の原因あるいはバックアップ作業に必要なメモリ量が無い、32bit OSを利用しているため2GB以上のメモリが確保できない、作業用ディレクトリのファイルシステムが2GB以上のファイルに対応していない(これは考えにくいですが)などは問題ありませんでしょうか。
テスト環境に本番環境と同じ状態を再現してみました。
サイト管理 ► 開発 ► 実験用 ► 実験用設定 で「新しいバックアップフォーマットを有効にする」
にチェックを入れて、コースバックアップを手動に実施したところ、
96.35%の状態で止まり、
Fatal error: Maximum execution time of 120 seconds exceeded in /var/www/html/2015/lib/filestorage/tgz_extractor.php on line 185
が表示されていました。
max_execution_timeは600で設定をしております。
/var/www/html/2015/lib/filestorage/tgz_extractor.php
[ 2015 ]が今年度利用しているMoodleです。
一番気になっているのが、このコースのバックアップファイルが突然大きくなった事です。
今まで200MBくらいだったのが課題モジュールでファイルをアップロードさせはじめたあたりから
200MB→500MB→700MB→1GB→1.2GBといった感じに日に日に増えていっており
最終的にはバックアップで4GBの壁に当ったような感じになっています。
数GBのファイルなどを置いているわけでなく、バックアップ容量が増えるきっかけとなった
課題も提出物は全部で300MBくらいであり、他のコースでも普通に使われている大きさです。
課題ファイルの中の何かしらの文字列がトリガーとなってループしているのかなとも
思っていましたが、現状では発生原因がわからずに困っています。
うだがわです。
バックアップしているファイルが異常に多いのではないかということであれば、backup.mbzの作成に失敗したtempディレクトリの内容を確認したり、"du -h"でtempディレクトリ中の総ファイルサイズを実行してみれば分かるのではないでしょうか。
気になるのはphp.iniでmax_execution_timeが300秒に設定されているはずなのに、120秒でエラーが出ている所です。エラーそのものはbackup.mbzを少しずつ読んでいる間にタイムアウトしているだけなのですが、max_execution_timeを上書きするような処理は確認出来ませんでした。
.htaccessに"php_value max_execution_time 120"というようなあったり、Moodleのサーバパフォーマンス設定で0以外の数値が設定されている、php.iniを変更した後にhttpdを再起動していないなどがありませんでしょうか。
村上です。返信ありがとうございます。
tempディレクトリの中は以下のようになっていました。
==================================================
14G ./backup/7b7c703115cb31c8808b9b361110a3e6
14G ./backup
228K ./latex
84K ./typo3temp/cs
84K ./typo3temp
0 ./zip
0 ./phpexcel
14G
==================================================
そもそもコースのファイルが1GBも満たないのにバックアップファイルを
作成するためのファイルが14GBになっているのも非常に謎に感じています。
bakucpの中身が以前のバージョンとは異なり、乱数なファイル名になっている為
調査も厳しいですね。
max_execution_timeの値も勿論再起動しています。
作業しているサーバのOSがCentos7ですので以下のコマンドを実行して
php_infoで値の変化を確認しています。
systemctl restart httpd.service
ちなみにエラーが表示されたPHPファイルの最初の部分に実行時間無制限に出来る
set_time_limit(0); の記述をしても同じようなエラーで途中で止まってしまいました。
うだがわです。
Moodleのバージョンによってタイムアウト値が異なるようです。上がMoodle 2.6、下がMoodle 2.8になります。
# find /var/www/moodle/2.6/ -name \*.php | xargs grep TIME_LIMIT_WITHOUT_PROGRESS
/var/www/moodle/2.6/backup/util/progress/core_backup_progress.class.php: const TIME_LIMIT_WITHOUT_PROGRESS = 120;
/var/www/moodle/2.6/backup/util/progress/core_backup_progress.class.php: set_time_limit(self::TIME_LIMIT_WITHOUT_PROGRESS);
# find /var/www/moodle/2.8/ -name \*.php | xargs gr
ep TIME_LIMIT_WITHOUT_PROGRESS
/var/www/moodle/2.8/lib/tests/progress_test.php: $this->assertEquals(array(\core\progress\base::TIME_LIMIT_WITHOUT_PROGRESS),
/var/www/moodle/2.8/lib/classes/progress/base.php: const TIME_LIMIT_WITHOUT_PROGRESS = 3600;
/var/www/moodle/2.8/lib/classes/progress/base.php: \core_php_time_limit::raise(self::TIME_LIMIT_WITHOUT_PROGRESS);
"/var/www/moodle/2.6/backup/util/progress/core_backup_progress.class.php" の "TIME_LIMIT_WITHOUT_PROGRESS = 120" をもっと大きな値に書き換えれば解決するのではないのでしょうか?
また、ファイル名はハッシュ値になっていますが、DBを見てfilesテーブルcontenthashから一致するものを探せばファイル名や所有者を確認する事が可能です。
ちなみに1200に設定してバックアップを流してみると違うzipのエラーが表示されました。
Not a zip archive.: /var/moodledata/temp/backup/0e0b6c58d17f3a03add01db3066ee9c9/backup.mbz
line 133 of /lib/filestorage/zip_archive.php: call to debugging()
line 278 of /lib/filestorage/zip_packer.php: call to zip_archive->open()
line 104 of /lib/filestorage/mbz_packer.php: call to zip_packer->extract_to_pathname()
line 248 of /backup/util/helper/backup_general_helper.class.php: call to mbz_packer->extract_to_pathname()
line 1725 of /backup/moodle2/backup_stepslib.php: call to backup_general_helper::get_backup_information_from_mbz()
line 34 of /backup/util/plan/backup_execution_step.class.php: call to backup_zip_contents->define_execution()
line 181 of /backup/util/plan/base_task.class.php: call to backup_execution_step->execute()
line 177 of /backup/util/plan/base_plan.class.php: call to base_task->execute()
line 120 of /backup/util/plan/backup_plan.class.php: call to base_plan->execute()
line 320 of /backup/controller/backup_controller.class.php: call to backup_plan->execute()
line 111 of /backup/util/ui/backup_ui.class.php: call to backup_controller->execute_plan()
line 131 of /backup/backup.php: call to backup_ui->execute()
error/error_zip_packing
このエラーに関する詳細情報
Debug info:
Error code: error_zip_packing
$a contents:
Stack trace:
line 1728 of /backup/moodle2/backup_stepslib.php: backup_step_exception thrown
line 34 of /backup/util/plan/backup_execution_step.class.php: call to backup_zip_contents->define_execution()
line 181 of /backup/util/plan/base_task.class.php: call to backup_execution_step->execute()
line 177 of /backup/util/plan/base_plan.class.php: call to base_task->execute()
line 120 of /backup/util/plan/backup_plan.class.php: call to base_plan->execute()
line 320 of /backup/controller/backup_controller.class.php: call to backup_plan->execute()
line 111 of /backup/util/ui/backup_ui.class.php: call to backup_controller->execute_plan()
line 131 of /backup/backup.php: call to backup_ui->execute()
うだがわ様、返信ありがとうございます。
仮想環境で本番環境と同じMoodleを動かしていますが
新しいバックアップフォーマットを有効にする前の状態に
スナップショットから戻しましたので、チェックが入っていませんでした。
先日教えていただいた値を
const TIME_LIMIT_WITHOUT_PROGRESS = 800;にした状態で新しいバックアップフォーマットを有効にして
バックアップを手動で流したところ、成功しました。
実行時間が約3時間はかかりましたが、
バックアップファイル11.2GBという大きさでバックアップが
正常終了になりましたので、ご連絡させていただきます。