2011-01-31 2 views
6

나는 nginx/passenger에서 실행되는 프로덕션 루비 sinatra 앱을 가지고 있으며, 요청이 복잡하게 멈추는 것을 자주 보게됩니다. 나는 10 초마다 기계의 클러스터에서 승객 상태를 호출하고 결과를 그래프로 표시하는 스크립트를 작성했습니다.승객의 모든 실행중인 루비 스레드에 스택 추적을 얻는 방법

enter image description here

파란색 라인이 4 기계에 걸쳐 평균 (60)에 지속적으로 요동 치고 기다리고 글로벌 큐를 보여줍니다, 파란색 선은 60 안타 때, 그것은 모든 기계가 끝나가 의미 : 이것은 내가 무엇을보고있다 아웃. 나는 현재의 passenger_max_pool_size를 20으로 설정 했으므로 최대 풀 크기의 3 배가되고, 이후의 요청은 아마도 삭제 될 것입니다.

내 앱은 Amazon RDS mysql 백엔드와 Redis 인스턴스의 두 가지 주요 외부 리소스에 의존합니다. 아마도 이들 중 하나가 주기적으로 느려지거나 반응하지 않아서 이러한 행동을 유발할 수 있습니까?

여기서 병목 현상이 Amazon RDS, Redis 또는 다른 것인가를 알기 위해 스택 추적을받는 방법에 대해 조언 해 줄 수 있습니까?

감사합니다.

답변

4

나는 그것을 알아 냈다. 나는 1 분에 1 번 발사하는 Redis에서 SAVE 설정 매개 변수를 가지고 있었다. 분명히 redis의 분기/저장 작업이 내 앱을 차단하고 있습니다. 구성 매개 변수를 "3600 1"로 변경합니다. 이는 한 시간에 한 번만 데이터베이스를 저장한다는 것을 의미합니다. 이는 캐시 (데이터가 MYSQL에서 지속되는 데이터)로 사용하고 있기 때문에 OK입니다.

+0

내가 기다리고 있었다 얼마나 알 수 있습니까? AFAIK, 자동 저장은 백그라운드에 있어야하며 메모리 페이지를 복사하는 동안 만 지연되어야합니다. 메모리 페이지는 300ms 위에 있어야합니다. – seppo0010

+0

경험적으로, 내 redis 노드가 몇 초 동안 차단되는 것처럼 보일 것입니다. 나는 주어진 60 초 동안 5 ~ 10 초 정도의 차단을 보았습니다. 나는 노예를 구하기 위해 노예를 사용하려고 노력할 것입니다. – esilver

0

원래의 질문에 답하기 위해, 승객이 목축을하고있는 루비 프로세스의 "모든 스택 트레이스"를 얻을 수 있습니다. 기본적으로 각 사람에게 SIGQUIT 메시지를 보내, 그들은 아파치/nginx를 로그 파일에, 예를 모든 역 추적을 뱉어 것이다 :

https://gist.github.com/rdp/905759f88134229c2969b9f242188615

관련 문제