일부 프로세스가 CPU를 100% 사용하고 select() 호출 시 한동안 중단됩니다.

일부 프로세스가 CPU를 100% 사용하고 select() 호출 시 한동안 중단됩니다.

그래서 이상한 시나리오가 생겼습니다. apache/passenger/Rails 서버와 다른 서비스가 있습니다. 예를 들어 top 명령 자체는 100% Cpu 시간을 사용합니다(iostat 및 ruby도 마찬가지이며 다른 프로세스는 정상인 것 같습니다). 처음에는 이것이 유명한 futex 버그인 줄 알았습니다.리눅스 futex_wait() 버그(프로세서는 Xeon E5이므로) 3.2.13-grsec-xxxx-grs-ipv6-64 커널이 포함된 Centos 6.5이며 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도움이 되었습니다.

관련 정보