一部のプロセスが CPU を 100% 使用し、select() 呼び出しでしばらくハングする

一部のプロセスが CPU を 100% 使用し、select() 呼び出しでしばらくハングする

奇妙なシナリオがあります。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役に立ちました。

関連情報