Nextcloudに先月デビューしました。
お金が無いのでWebHosting(レンタルサーバ)さんでの稼働を試みてます(ご迷惑をおかけいたします)。
("Cheapest mass storage VPS"で検索。6ユーロ(約900円強)、14GB(SSD), 2TB(HDD)ってのが最安だった(2025.01)。最悪それに移ることになりますが、お金/時間なくて、レンタルサーバで使わせて頂けないか試行錯誤。)
問題の発覚
NextCloudが「Some jobs have not been executed since 1ヶ月前. Please consider increasing the execution frequency.」と提示。webcronを実行しているはずなのに原因がわからなかった。
NextCloudのタスクは多すぎ
- 概要: 『uploadしたファイルのmetaデータ抽出もtaskとなる」。しかも、1ファイル/1タスク。
私はNextcloudのタスクが多いことを想像できてなかった。
-
php occ background-job:list
はタスクを一覧できる、実行したら、
下記通り、左TaskIDが万単位のタスクはどうやらUploadしたファイルの検索等用のメタデータを更新する処理みたい。つまり、uploadしたファイル毎にメタデータ生成taskを実施しないといけない。レンタルサーバですので、cron.phpを長時間処理するとKilledされる。処理終わらない。
| 41 | OC\Preview\BackgroundCleanupJob | 2025-01-18T04:51:28+00:00 | null |
| 42 | OC\TextProcessing\RemoveOldTasksBackgroundJob | 2025-01-18T04:51:29+00:00 | null |
| 43 | OC\User\BackgroundJobs\CleanupDeletedUsers | 2025-01-18T04:51:31+00:00 | null |
| 97 | OCA\Money\BackgroundJob\CleanupDatabase | 2025-01-18T02:16:10+00:00 | null |
| 22584 | OC\FilesMetadata\Job\UpdateSingleMetadata | 1970-01-01T00:00:00+00:00 | ["your_id",37335] |
| 22585 | OC\FilesMetadata\Job\UpdateSingleMetadata | 1970-01-01T00:00:00+00:00 | ["your_id",37336] |
| 22586 | OC\FilesMetadata\Job\UpdateSingleMetadata | 1970-01-01T00:00:00+00:00 | ["your_id",37337] |
(ずっと続く....)
つまり、頻繁にcronしないと未Task蓄積してしまう仕様にもかかわらず、レンタルサーバ側はそれをゆるしてくれない(当然である、高負荷は死活問題である。低価格で提供してくださっているのだから仕方ない)。
nice -19
やらタイムアウト時間やら私のレンタルサーバは無意味。
WebCronはシステムcronと同等と思い違いしました
確認不足かなのかもしれないが、NextCloud(現在ver30.0.5)の各cronの挙動
- Ajax: Task1つ処理/ページ読み込み
- WebCron: 同上(と見えた)←←★後述のタスク一覧で1つずつしか減ってないのを確認。
- バックグラウンドジョブに明記されていた、下記に内容を記します。
- 「WebCron が 5 分ごとに呼び出されると、インスタンスは 1 日あたり 288 のバックグラウンド ジョブに制限されますが、これは非常に小さなインスタンスにのみ適しています。」→よほどUploadファイル数が少なくなければ飽和してしまうよね。。。
- (ローカル)cron: 指定間隔を超えた全タスク実行
問題は、WebCronは、1Taskの処理が終わると終了している模様。
別のCMSでは、WebCronを選んでもローカルCronと同等の処理していたので、WebCron==ローカルcronであると思い込んでいた。間違いだった。
しかし、レンタルサーバさんは5分事にローカルcronを実行してくれない、ローカルcronを10までしか登録できない仕様。もっとプロセス存続時間が長寿でないと実行終えない。なのでWebCronを実行してたが、1回の呼び出しで1Taskしか実施されない。これがcron未処理タスクを飽和していた根本原因だった模様。
未整理
- cron.phpは何も標準出力しないので、正しく処理できているか不明、出力する方法ご存知ならお教え願います。
-
php -vvv cron.php
でも無口なcron.phpさん。。。
-
まとめ
- NextCloudはレンタルサーバさんのcron.phpをkilledは想定されてない仕様(みたい)
-
『すべてのcron(Axjx, webcron, local cron)が同時に使えてほしいのに排他的にしか使えない』
- Nextcloudのcronは選択したcronしか実行を受け付けない。モード切り替えが必要
- Uploadしたファイル1つに付き、メタ印加Taskが発生。沢山のファイルアップロードするとレンタルサーバではTask処理が間に合わない
- cron.phpがKillされるとWebインタフェース上(ttps://your_nextcloud/index.php/settings/admin)ではTask処理されたとみなされないみたい。cron.phpを実施してもKillされると、「最終ジョブ実行は ??分前 です。何か問題が発生しています。」と**『cron.phpが未実施のように表示される→心配で調べ時間取られる』**
解決策
[通常]レンタルサーバさんのcronの上限いっぱいにcron.phpの実行を登録させてもらう。
- 毎分実行無理なWebインタフェースなら、10分毎に6個のジョブ作成
[未処理タスク飽和下] 一つひとつTask実施
WebCronの代わりに手動/スクリプトでひたすらhttp(s)経由でcron.phpを実行。
母艦PCからSSHでタスク残量確認して、リモートTask実施、残量一定以下で終了する方法
- 下記処理を実施。Killedを検出して、再実行。処理必要タスクがなくなるまで実施
- (パターン1)SSh+occコマンドでWebCronモードに切り替え。http(s)経由でcron.phpを実行。定期的にTask残り#### 確認して一定以下になったら終了。Webサーバ経由なのでKilledされにくいと思われる。
- (パターン2)パターン1のhttp経由でcron.phpを実行する代わりにoccコマンドでタスク実行。
- (私は未完): SSH経由で
php cron.php
の実行。Killedされたのをうまく検出せずに母艦PCのrunが落ちる。すると、local cronモードへ戻せない、など問題あり。
以上。