moodle2.6での自動バックアップの失敗による作業ファイルについて

moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿
返信数: 20

いつもお世話になっております。村上です。
以前、Moodle2.9でのバックアップの作業ファイルが
残る件で質問させていただきましたが、
今回、Moodle2.6で似た症状が出ました。

日次でコースバックアップをcliで実行して取得しているのですが
1つのコースでバックアップが失敗するようになり、
管理者向けにもエラーが発生している旨のメールが飛び始めました。

エラーの発生原因調査を行っていますが、現状で問題になっているのが
サーバの仕様容量が一気に増加しており確認したところ
moodledata/temp/backup の下にmbzファイルを生成する途中で
使われた作業用のファイルとディレクトリが沢山残っており、
これがディスクを占有しているのがわかりました。

本番環境で発生している事案であり、削除したいところですが
サーバの動作に影響はないでしょうか?

ご存知の方がいらっしゃいましたら、ご教授していただきたいと思います。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
moodledata/temp/backupを削除しても「サーバの動作に影響」はありません。

ご参考までに下記投稿をご覧ください。

[Moodle in English: Moodledata/temp/backup folder (Moodle 2.6)]
https://moodle.org/mod/forum/discuss.php?d=314625
Mitsuhiro Yoshida への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

早速のご返答、ありがとうございます。

エラーが出た該当のコースの最後のバックアップログのステータスが
通常の「エラー」ではなく「未了」になっております。

moodledata/temp/backup/作業ファイルのディレクトリ の有無と
ステータスとの関連性は直接にはないという認識で問題ないでしょうか?

該当コースのエラー原因が何かというのがわかれば一番ですが
自動でも手動でも90%くらいまで進んでから失敗しています。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

はい、「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

Mitsuhiro Yoshida への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

Yoshida様、ご返答ありがとうございます。

教えていただいたように
moodledata/temp/backup の下の作業用ディレクトリを
削除しても問題なく動く事を確認しました。

max_execution_timeを現状よりも大きめにして
WEBサーバのリロード後、バックアップを手動実行しましたが
95%くらいまで時間がかかった後でバックアップが途中で止まってしまいました。

moodledata/temp/backupの下には新たにバックアップ用の
作業用ディレクトリが生成されていましたので手動で削除しています。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

ロードアベレージと容量を別のウィンドウで開きながら見ていましたが
恐らくバックアップファイル(.mbz)を圧縮しながら生成している途中で
止まってしまった動きをしていました。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

バックアップファイルを見て、更に追記させていただきます。

moodledata/temp/backupディレクトリの中を覗いてみると
mbz(backup.mbz.4j4wZI)と名前の付く作業中のファイルが2つあり、
いずれも2GB以上の大きさで止まっています。

教えていただいたリンク先に書かれてあった4GBの壁を越えてしまった
事が原因ではないかなとも思い始めました。

数日前まではmbzファイルの容量は500MBだったのが
数日間で一気に膨れ上がってきたようです。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

「管理 > サイト管理 > 開発 > デバッグ」ページで下記のように設定された上で、コース内でのバックアップ実効時にどのようなメッセージが表示されるか確認されてはいかがでしょうか。

  • デバッグメッセージ (debug) = DEVELOPER: 開発者のための特別Moodleデバッグメッセージ
  • デバックメッセージを表示する (debugdisplay) = チェック (有効)



Mitsuhiro Yoshida への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿
Yoshida様、連絡ありがとうございます。

教えていただいた内容を試したい所ですが
本番環境で空き容量的に手動でのバックアップ自体を
行う事が危険なため、行う事が出来ませんでした。

いずれテスト環境にて試してみたいと
思っていますので、今後の参考にさせていただきます。

cliで差分のバックアップをcronで実行していますが
自動バックアップで該当のコースのバックアップが
行われて失敗するとHDDを逼迫してしまうため、
コースを非表示設定にしてコースバックアップが
行われないように変更しました。
Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- udagawa mitsuru の投稿
うだがわです。

こちらでも年度またぎのシステム移行で問題になる可能性があったため確認してみました。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以上のファイルに対応していない(これは考えにくいですが)などは問題ありませんでしょうか。
udagawa mitsuru への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

テスト環境に本番環境と同じ状態を再現してみました。

サイト管理  ► 開発  ► 実験用  ► 実験用設定 で「新しいバックアップフォーマットを有効にする」
にチェックを入れて、コースバックアップを手動に実施したところ、

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で設定をしております。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

/var/www/html/2015/lib/filestorage/tgz_extractor.php
[ 2015 ]が今年度利用しているMoodleです。

一番気になっているのが、このコースのバックアップファイルが突然大きくなった事です。

今まで200MBくらいだったのが課題モジュールでファイルをアップロードさせはじめたあたりから
200MB→500MB→700MB→1GB→1.2GBといった感じに日に日に増えていっており
最終的にはバックアップで4GBの壁に当ったような感じになっています。

数GBのファイルなどを置いているわけでなく、バックアップ容量が増えるきっかけとなった
課題も提出物は全部で300MBくらいであり、他のコースでも普通に使われている大きさです。

課題ファイルの中の何かしらの文字列がトリガーとなってループしているのかなとも
思っていましたが、現状では発生原因がわからずに困っています。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- udagawa mitsuru の投稿

うだがわです。

バックアップしているファイルが異常に多いのではないかということであれば、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を再起動していないなどがありませんでしょうか。

udagawa mitsuru への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

村上です。返信ありがとうございます。

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); の記述をしても同じようなエラーで途中で止まってしまいました。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

色々な値を設定をしてバックアップを実行してみましたが
いずれも同じようなエラーで表示されて止まりますね。

Fatal error: Maximum execution time of 120 seconds exceeded in moodle/lib/filestorage/zip_archive.php on line 218

max_execution_timeは300で設定しています。
120という設定がどこかに入っているのかと調べていますが
.htaccessもありませんし、php.iniの設定がphp_infoにも
反映されています。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- udagawa mitsuru の投稿

うだがわです。

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から一致するものを探せばファイル名や所有者を確認する事が可能です。

udagawa mitsuru への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

うだがわ様、返信ありがとうございます。

教えていただいた様に以下の部分を120から600に変更しました。

const TIME_LIMIT_WITHOUT_PROGRESS = 600;
120秒でタイムアウトしていた時と比べると長く頑張ってくれましたが
結果としては600秒でもタイムアウトしてしまいました。


またハッシュ化されているファイルもmdl_filesと照らし合わせてファイル確認しましたが
特に同じファイルが沢山あってループ状態になっている感じもありませんでした。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

ちなみに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()

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- udagawa mitsuru の投稿

うだがわです。

新しいバックアップフォーマットを有効にしてください。

udagawa mitsuru への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

うだがわ様、返信ありがとうございます。

仮想環境で本番環境と同じMoodleを動かしていますが
新しいバックアップフォーマットを有効にする前の状態に
スナップショットから戻しましたので、チェックが入っていませんでした。

先日教えていただいた値を

const TIME_LIMIT_WITHOUT_PROGRESS = 800;
にした状態で新しいバックアップフォーマットを有効にして
バックアップを手動で流したところ、成功しました。

実行時間が約3時間はかかりましたが、
バックアップファイル11.2GBという大きさでバックアップが
正常終了になりましたので、ご連絡させていただきます。

Yuuki Murakami への返信

Re: moodle2.6での自動バックアップの失敗による作業ファイルについて

- Yuuki Murakami の投稿

更に追記させていただきます。

取得出来たバックアップファイルから別カテゴリにリストアした所、
数十分はかかりましたが、比較的スムーズにリストアを
行う事が出来ました。