
私は、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