cache/*.rel ファイルを削除した後にページを更新すると、httpdの子プロセスに高負荷がかかる可能性がある


メッセージ

cache/*.rel の(自動かつ連鎖的な)再作成を行う links_update() の作りに起因して、特に管理者が *.relファイルを多数削除した後に、誰かが *.rel ファイルが存在しないページを更新したとき、httpdの子プロセスが長時間高負荷となるようです。

処理が完全に終わるまで、徐々に負荷が上がって行きます。また、コンテンツにもよりますが、(PHPの実行時間制限を無視するかのような)長時間この状態が続く可能性があります。

links_update() の処理は改善の余地が非常にあるように思われ、現状はアップデート時のハマリ所になる可能性があります。


Problem Description (概要)

PukiWikiで特定のページを更新したとき、そのページに対応する cache/*.rel ファイルが存在しない場合、PukiWikiはそのページが 新規作成されたとみなし、cache/*.relファイルを生成しようと します。(links_update()関数の内部)

通常は cache/*.rel ファイルは全て存在する前提になって いますので、新しくファイルを作成する場合でも比較的速やかに (1ページ分の処理単位で)処理が終了します。

しかしlinks_update() 関数によるリンクキャッシュの再作成処理は、 現状の実装上「他にも存在しない *.rel ファイルがある事をを 見つけた場合には <連鎖的に> 動作」します。

すなわち、cache/*.rel ファイルが全く無いときは極端に処理が 重くなる事が続く可能性があります。

※一度生成処理を経たページを更新する場合は、この症状は発生 しません

Solution (解決策)

(1) PukiWikiをアップデートする際に、cache以下のファイルも 持ち越している場合は今回の症状は発生しません。

(2) 新しいPukiWikiをローカルに展開して最新の wiki/count/diff/backup/attach ディレクトリに差し替えた後、

http://path/to/pukiwiki/index.php?plugin=links

からlinksプラグインを呼び出して(リンク)キャッシュの更新を 実行し、全てのページに対応する *.refおよび*.relファイルを 生成してください。

この処理は高負荷時の動作を意図的に引き起こします。 また、仮にPHPの実行時間制限や、メモリ制限で links プラグ インの実行が停止する時には、中途半端なファイルが作成され る可能性がありますので、本番環境ではなく、ローカルの作業 環境で(必要であれば実行時間制限やメモリ制限を緩和した上で) 実行する事をお薦めします。

最終的にcacheディレクトリに *.rel および *.ref ファイルが 作成されますので、これらを wiki ファイルと一緒にサイトに アップロードし、他と同様に書き込み権限を追加してください。




トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-07-15 (金) 01:46:45
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.319 sec.

SourceForge