2010-06-21 3 views
3

2GHz 및 4GB 메모리 4 코어를 사용하는 VPS에서 레일 앱 (2.3.5)을 실행하고 있습니다. Ruby Enterprise (1.8.7-2010.01)에서 최대 풀 크기가 30으로 설정된 nginx (0.7.61) 및 phusion passenger (2.2.14)를 실행 중입니다. 문제는 마치 실행중인 모든 루비 프로세스 레일 요청은 거의 100 % cpu에서 실행됩니다. TOP를 실행하면 디스플레이가 새로 고침 될 때마다 화면이 매번 내려져서 매달리지 않고 떨어지지 만 여전히 100 %로 실행 중입니다.루비 프로세스가 승객의 CPU 사용률이 100 % 인 이유

내가이 문제를 일으킬 수있는 방법이 있습니까? 또는 적어도 코드의 어떤 부분이 CPU에 영향을 미치는지 파악하십시오. 이것은 정상적인 행동입니까?

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                                  
2427 psadmin 25 0 91904 76m 2696 R 100 1.9 739:05.96 Rails: /var/www/apps/main_rails_app/current                         
3457 psadmin 25 0 98180 82m 2532 R 100 2.0 711:21.91 Rails: /var/www/apps/main_rails_app/current                         
2415 psadmin 25 0 93952 77m 2708 R 99 1.9 727:49.31 Rails: /var/www/apps/main_rails_app/current                         
3455 psadmin 25 0 99204 83m 2528 R 69 2.0 726:04.70 Rails: /var/www/apps/main_rails_app/current                         
2791 psadmin 16 0 98044 81m 2492 S 31 2.0 0:10.16 Rails: /var/www/apps/main_rails_app/current                         
8034 psadmin 15 0 8160 3656 1772 S 1 0.1 0:35.39 nginx: worker process                               
8035 psadmin 15 0 8324 3696 1732 S 0 0.1 0:31.34 nginx: worker process                               
2588 psadmin 15 0 197m 183m 2712 S 0 4.5 1:02.16 Rails: /var/www/apps/main_rails_app/current  

감사 :

다음은 TOP 출력입니다!

편집 : 아래에 언급 된대로 따라 잡은 포크로 스트라이크를 시도하십시오. 이 출력은 계속해서 덤프됩니다.

sudo strace -f -p 3455 

clock_gettime(CLOCK_MONOTONIC, {394577, 508326476}) = 0 
select(0, [], [], [], {0, 0})   = 0 (Timeout) 
--- SIGVTALRM (Virtual timer expired) @ 0 (0) --- 
sigreturn() 
+0

레일즈 2.3.5 승객 2.2.5 루비 1.8.7 (2009-12-24 패치 레벨 248) [x86_64-linux], MBARI 0x6770, 루비 엔터프라이즈 에디션 2010.01 – mazhout

+0

비슷한 문제가있어서 strace 출력을 설명하는 루프 안에 DateTime.now를 호출하는 코드에 몇 가지 버그가 있습니다. 'stat ("/ etc/localtime", {st_mode = S_IFREG | 0644, st_size = 3543, ...}) = 0' 반복 호출을 중지하고 차이가 있는지 확인하기 위해 수정 프로그램을 계획합니다. . –

+0

Ruby는 스레드 간의 컨텍스트 전환에'SIGVTALRM'을 사용합니다. 그것에 대해 이상한 것은 없습니다. 물론 strace의 유일한 출력이며 반복적으로 많이 발생합니다. – Steen

답변

1

로그에 의심스러운 동작이 있는지 확인하십시오. 일반적으로 레일은 CPU의 무리를 빨아 먹는다 ... 당신은 또한 문제가되는 pids에 strace를 가리킬 수도있다.

+0

strace를 시도했지만 모든 출력을 표시하지 않습니다. 단지 해당 PID에 바인딩되어 있습니다. 나는 그것이 매우 오래 동안 존재하지 않기 때문에 그것이 있을지도 모른다라고 생각한다. 그러나 그것이하는 동안 그것은 100 %에있다. – bwizzy

+0

포크 (-f 또는 -F 등)를 따르고 있는지 확인하십시오. 아니면 다른 PID를 시도해보십시오 :) – rogerdpack

관련 문제