Railsサイトでバグを追跡しようとしていますが、CPUを占有して実行されないRubyプロセスが繰り返し発生していることに気付きました。何が彼らを始めているのか、そして彼らを止める方法、または彼らが完了して彼らの仕事を成し遂げるために必要なリソースを彼らに与える方法を議論したいと思います。
背景:サーバーはUbuntu 10.04LTSです。 Rubyは1.9.2-p290です。サイトはRails 3.1.4で、Passenger3.0.9はNginx1.0.8にあります。
サイトコードはsite-runner
という名前の非ホイールユーザーによってデプロイおよび所有されているため、Passengerプロセスはそのユーザーとして実行されている必要があります。そのユーザーにはcrontabファイルがありません。
これが私を疑わせるものです:
トップ-13:41:05アップ73日、20:26、2ユーザー、平均負荷:2.11、2.06、2.28 メモリ:合計508272k、使用済み295660k、空き212612k、バッファ12608k スワップ:合計1048572k、使用済み32020k、空き1016552k、キャッシュされた42580k PIDユーザーPRNI VIRT RES SHR S%CPU%MEM TIME +コマンド 26911サイト実行20 0 227m 116m 2656 R 101 23.4 18:08.55 Ruby 26919サイト実行200 227m 116m 2656 R 100 23.4 18:08.50 Ruby = [...]
これが乗客ではないことを確認したかったので、pstree
を使用しました。
$ pstree -apu init、1 | -PassengerWatchd、17903 | | -PassengerHelper、17908 | | | -Ruby、17912 ... | | | |-{ルビー}、17938 | | | `-{ルビー}、26888 | | |-{PassengerHelpe}、17913 [一連のPassengerプロセスを折りたたんだ] | | `-{PassengerHelpe}、17926 | | -PassengerLoggin、17915、nobody | | `-{PassengerLoggi}、17928 | |-{PassengerWatch}、17907 | |-{PassengerWatch}、17929 | `-{PassengerWatch}、17930 | -cron、2331 | -getty、7533 -8 38400 tty1 | -master、2536 | | -pickup、26864、postfix -l -t fifo -u -c | | -qmgr、2543、postfix -l -t fifo -u | `-tlsmgr、19889、postfix -l -t unix -u -c | -mysqld、23916、mysql | |-{mysqld}、23922 [一連のmysqlプロセスが折りたたまれました] | `-{mysqld}、15541 | -nginx、17931 | `-nginx、17932、site-runner | -rsyslogd、2297、syslog -c4 | |-{rsyslogd}、2303 | `-{rsyslogd}、2304 | -Ruby、26911、site-runner ... | `-{Ruby}、26913 | -Ruby、26919、site-runner ... | `-{Ruby}、26921 | -sshd、2329 | `-sshd、27099 | `-sshd、27110、parker | `-bash、27111 | `-pstree、27218 -apu | -udevd、2108 --daemon | | -udevd、2139 --daemon | `-udevd、2142 --daemon ` -upstart-udev-br、2066 --daemon
...そしてそれらのRubyプロセス、26911および26919があり、NginxまたはPassengerの子ではありません。
プロセスを強制終了しましたが、再起動します。
これらのプロセスが何をしているのかを理解し、完了するように促すか、離れて離れるようにするにはどうすればよいですか?
top
では、「c」キーを押すことにより、コマンド全体の表示を切り替えることができます。
top
が不足している場合は、いくつかのps
オプションを使用して完全なコマンドを取得することもできます。
ps -fp 26911
したがって、完全なコマンドの場合は「f」、関心のあるプロセスIDを指定する場合は「p」です。
Linuxのprocファイルシステムも見ることができます。 cat /proc/26911/cmdline
は、プロセス26911に使用されるコマンドラインを表示します。