%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A7%E3%81%97%E3%81%B0%E3%82%89%E3%81%8F%E3%83%8F%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B.png)
奇妙なシナリオがあります。apache/passenger/Rails と他のサービスがあるサーバーがあります。たとえば、top コマンド自体が 100% の CPU 時間を消費します (iostat と ruby も、他のプロセスは正常のようです)。最初は、これは有名な futex のバグだと思いました。Linux futex_wait() のバグ(プロセッサは Xeon E5 です)。ただし、これは Centos 6.5 でカーネルは 3.2.13-grsec-xxxx-grs-ipv6-64 なので、futex のバグの影響を受けないようです。以下は top コマンドの出力です。
top - 18:14:46 up 60 days, 6:32, 2 users, load average: 2.15, 1.24, 1.04
Tasks: 180 total, 1 running, 179 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.6%us, 1.0%sy, 0.0%ni, 95.0%id, 1.7%wa, 0.0%hi, 0.7%si, 0.0%st
Mem: 66008460k total, 21226356k used, 44782104k free, 817252k buffers
Swap: 61437944k total, 0k used, 61437944k free, 17404540k cached
Change delay from 3.0 to:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18042 root 20 0 15076 1272 904 S 100.0 0.0 5109402h top
18041 root 20 0 105m 1192 1028 S 100.0 0.0 900776:13 sh
18043 root 20 0 98.6m 808 692 S 100.0 0.0 900776:13 iostat
1 root 20 0 19276 1508 1228 S 0.0 0.0 0:02.40 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 5119411h ksoftirqd/0
5 root 20 0 0 0 0 S 0.0 0.0 10218485h kworker/u:0
6 root RT 0 0 0 0 S 0.0 0.0 986912:21 migration/0
7 root RT 0 0 0 0 S 0.0 0.0 906076:59 migration/1
9 root 20 0 0 0 0 S 0.0 0.0 45038,51 ksoftirqd/1
11 root RT 0 0 0 0 S 0.0 0.0 911444:25 migration/2
13 root 20 0 0 0 0 S 0.0 0.0 120103,33 ksoftirqd/2
14 root RT 0 0 0 0 S 0.0 0.0 941393:43 migration/3
straceはこれらのプロセスがselect()システムコールでハングしていることを示しています
# strace -p 1938
Process 1938 attached - interrupt to quit
select(12, [0 11], NULL, NULL, NULL^C <unfinished ...>
Process 1938 detached
その理由は何でしょうか?
答え1
今日、私は同じような状況に悩まされました。私の友人はgdb
、、rb_backtrace()
そしてでしたrake debug
。そして私の場合は、まれな状況下で無限 while ループが発生しました。
バックトレースを印刷するだけですrb_backtrace()
。私の場合は、Apache のエラー ログ ( /var/log/apache2/error.log
) に印刷されました。
このバックトレースは通常とは逆の順序になっています。最後の行を見て、アプリケーション コードを参照する行を探します。次に、Ruby デバッガーを使用してその行の直前をデバッグします。
この郵便受けhttps://robots.thoughtbot.com/using-gdb-to-inspect-a-running-ruby-process役に立ちました。