mod_perl スクリプトはしばらくするとファイルシステムを認識しなくなります

mod_perl スクリプトはしばらくするとファイルシステムを認識しなくなります

私は、Ubuntu 16.04 の VPS 上の Apache 2.4.18 で mod_perl スクリプトを使用しています。スクリプトはディスクからファイル (Web ページ テンプレート) を開きます。時々、これらのファイルが表示されなくなり、サーバー エラー ログに次のエラーがいっぱいになります。

[TIME] [:error] [pid PID:tid TID] ファイル エラー - FILENAME: 見つかりません\n

これらのメッセージは、Perl 関数が false を返したときにテンプレート パッケージによって生成されますopen()。Apache を再起動すると、ファイルは再び表示されますが、しばらくの間だけです。しばらくすると、問題が再発します。

このような行動の理由は何でしょうか?

答え1

おそらく、mod_perl/apache はファイルハンドルを適切に閉じていません。しばらくすると、開いているファイルの最大数 (1024 ソフト/4096 ハード シーulimit -Sn;ulimit -Hn) に達すると、Apache を再起動すると、古いハンドルがすべて閉じられます。

次回エラーが発生したときは、apache/perl から pid を取得してこの理論を調査できます。

# ps aux | grep apache

または

# pidof apache

または、独自のプロセスがある場合は perl モジュール。

サンプル出力:

28294

PID によって開かれたファイルのリスト

# lsof -p 28294
# lsof -a -p 28294
# counting
# lsof -a -p 28294| wc -l

または

# cd /proc/28294/fd
# ls -l | less
# count open files with
# ls -l | wc -l

関連情報