%20%E5%91%BC%E5%8F%AB%E4%B8%8A%E6%8E%9B%E8%B5%B7%E4%B8%80%E6%AE%B5%E6%99%82%E9%96%93.png)
所以我有一個奇怪的場景:有一個伺服器這個 apache/passenger/Rails 和一些其他服務。例如 top 指令本身佔用 100% Cpu 時間(iostat 和 ruby 也是如此,其他行程似乎正常)。起初我以為這是著名的 futex bugLinux futex_wait() 錯誤(因為處理器是 Xeon E5),但這是帶有 3.2.13-grsec-xxxx-grs-ipv6-64 核心的 Centos 6.5,這似乎不受 futex bug 的影響。這是 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很有幫助。