2010-11-22 2 views
4

저는 Rails 3.0.0과 Ruby 1.9.2를 사용하여 작은 Rails 앱을 개발했습니다. 테스트하는 동안, 개인용 컴퓨터에서 성능이 좋습니다. 나는 제작을 위해 내 VPS에 넣었고, 아파치와 mod_rails를 사용했다. 때로는 성능이 끔찍하다.어떻게 mod_rails를 사용하여 레일 3 앱이 왜 느린 지 알 수 있습니까?

에 의해 2010-11-21 21시 49분 56초 -0500
처리에 XX.XX.XX.XX에 대한 "/ 추적기를"GET 시작일 : 여기

는 production.log에서 예제
이 렌더링 된 HTML
렌더링 레이아웃/_stylesheets.html.haml로 FleetsController # 지수 (0.8ms)
렌더링 레이아웃/_header.html.haml (~ 1.0ms의)
렌더링 레이아웃/_footer.html.haml (0.0ms) layouts/application 내의 pages/about.html.haml (4.5ms)
완료 15ms에서 200 OK (조회수 : 14.3ms | 액티브 : 0.0ms)는

는 HTML
렌더링 된 레이아웃으로 FleetsController # 지수에 의해 2010-11-21 21시 50분 2초 -0500
처리에 XX.XX.XX.XX은 "//추적기"GET 시작 레이아웃 내에서 /_stylesheets.html.haml (0.7ms)
렌더링 레이아웃/_header.html.haml (1.1ms)
렌더링 레이아웃/_footer.html.haml (0.0ms)
렌더링 함대/index.html.haml/응용 프로그램 (7.8ms)
완료 1901ms에서 200 OK (보기 : 7.8ms | 액티브 레코드 : 1.5ms)

{ "ID를 :


매개 변수를 HTML로 FleetsController # 쇼에 의해 2010-11-21 21시 50분 6초 -0500
처리에 XX.XX.XX.XX은"/ 추적/함대/XXXXXXXXX을 "GET 시작 "=>"XXXXXXXXX "}
렌더링 쓸어/_details_inner.html.haml (1.2ms)
렌더링 쓸어/_details.html.haml (2.1ms)
렌더링 쓸어/_summary.html.haml (3.5ms)
렌더링 함대/_scouts_inner.html.haml (1.3ms)
렌더링 함대/_scouts.html.haml (3.5ms)
렌더링 된 보고서/_report.html.haml (를 0.5ms)
개 렌더링 함대/_reports.html.haml (3.0ms)
렌더링 함대/_recon_form.html.haml (39.9ms)
렌더링 함대/_recon.html.haml (40.8ms)
렌더링 사용자/_user.html .haml (1.2ms)
렌더링 쓸어/_pilots.html.haml (1.9ms)
렌더링 된 레이아웃/_stylesheets.html.haml (를 0.5ms)
렌더링 된 레이아웃/_header.html.haml (0.9ms)
렌더링 된 레이아웃/_footer.html.haml (0.0ms)
레이아웃/어플리케이션 (60.2ms) 내 렌더링 된 fleets/show.html.haml
495ms에 200 OK 완료 (조회수 : 59.1ms | 액티브 레코드 : 2.9ms)

첫 번째 히트에는 데이터베이스 액세스 권한이 없습니다. 두 번째는 데이터베이스 액세스 권한이 있지만 뷰를 생성하는 데 평균 7.8ms 밖에 걸리지 않으며 데이터베이스는 1.5ms이지만 페이지가 거의 2 분 동안 완료되지 않았습니다!이것은 꽤 일반적인 예이지만, 페이지 응답을위한 14 초 이상의 로그 항목이 있습니다. 그리고 아니요, 이것은 재부팅 후 초기 레일로드 중에 발생하지 않습니다.

그 시간이 어떻게 될 수 있습니까?

1) ActiveRecord 시간 보고서를 잘못 해석했는데 실제로는 코드 시간이지만 실시간 데이터베이스 시간은 어디로 갈까요?

2) 저는 sqlite를 사용하고 있습니다. 결국 대부분의 페이지 히트가 데이터베이스 쓰기를 유발하기 때문에 동시성 문제가 생길 것이므로 결국에는 MySQL로 전환해야 할 것입니다. 하지만 지금 당장은 교통량이 거의 없습니다. 동시에 사이트의 15 명 정도가 될 수 있습니다. 위의 로그 예제에서 한 번에 한 번에 한 번에 한 번에 한 번에 한 번에 한 번에 4 ~ 6 초 동안 공격했습니다. 나는 sqlite가 그것을 처리 할 수 ​​있다고 생각한다. ...

3) 나는 공유 VPS에있다. 즉, VPS의 다른 사용자가 서버를 느리게하는 원인과 동시에 작업을 수행 할 수도 있습니다. 대부분의 경우, 내 VPS는 CPU 부하가 매우 낮지 만, 이 가능합니다. 나는 불행 해졌으며 정확한 순간에 어떤 일이 벌어지고있었습니다. 그러나 나는 이것이 충분히 자주 일어나는 것을 보아 나는 그것을 대답으로 사지 않는다.

4) VPS에만 512 + 512MB의 메모리가 있습니다. 나는 거기에 150MB의 자유를 보여주는거야,하지만 난 그냥 메모리 제한을 치는 것이 가능합니다 그리고 이것은 페이지 스와핑이나 뭐야?

5) 로그에 몇 가지 BusyException도 있습니다. 나는 database.yml timeout을 5 초에서 15 초로 올려서 도움이되는지 확인했다. 그 이후에 실제로 테스트를하지 않았습니까?

나는 실제로 당신에게 실제로 무슨 일이 일어나고 있는지 말해 줄 수있는 정보를 제공하지 못했을 것입니다. 그래서 진짜 질문은, 어떻게 이것을 추적하려고 노력합니까? 느린 코드를 진단하는 데 도움

+0

모두 동일한 IP 주소입니까? –

+0

예,이 예에서는 동일한 사용자로부터 3 건의 조회가 발생했습니다. 히트 곡 사이에 다른 사용자가 끼어 들지 않았습니다. –

답변

1

그래서 두 가지 ..

  1. 를 사용하여 새로운 유물, 난 당신이 어떤 배열 조작을하고 또는 항목의 큰 배열을 반환하는 내기 것 로깅을 바탕으로
  2. FleetsController # index ... 당신의 어플리케이션 코드가 그곳에있는 것처럼 보입니다. 그 잘못 보인다면

http://www.newrelic.com/

는 FleetsController 번호 지수의 코드를 게시 할 수 있습니다. 그러나 NewRelic은 느린 웹 요청에서 정확한주기를 파악하는 데 도움을 줄 수 있습니다.

+0

New Relic을 살펴 보겠습니다. –

+0

코드는 https://github.com/markpundsack/fleet-tracker/blob/master/app/controllers/fleets_controller.rb의 github에 있습니다. –

+0

FleetsController # index는 실제로 많이하지 않아야합니다. 데이터베이스를 현재 사용자에 대한 정보 (모든보기에서 발생 함)로 업데이트 한 다음 액세스 권한이있는 함대를 조회합니다. 그.보이는 범위는 약간 복잡한 WHERE 절이 있지만 데이터 집합은 전혀 크지 않습니다. 지금까지 한 번에 1-2 개의 함대가 존재하고 데이터베이스 전체에서 40 명의 사용자 만있을 수 있습니다. FleetsController # show는 #index보다 처리하는 데 약 10 배 더 오래 걸리는 뷰를 설명합니다. –

0

SQLite는 동시성을 전혀하지 않습니다. 아마도 연결이 데이터베이스에서 차단되고 있다고 생각합니다. 실제 쿼리는 괜찮지 만 다른 쿼리가 실행되는 동안 SQLite db 파일이 잠긴 것으로 의심됩니다.

정말 MySQL 또는 PostgreSQL과 같은 실제 서버 데이터베이스로 이동해야합니다.

+0

필자는 필요할 때 MySQL로 이동할 준비가되었지만 위의 예제에서는 아직 동시성이 발생하지 않았습니다. 그 시간 동안 한 명의 사용자가 사이트에 접속했습니다. 다른 곳에서는 동시성 문제가 있음을 발견했습니다. 그러나 내 직감은 다른 것이 잘못되었다고 말하면서 고칠 수 있다면 데이터베이스 시간이 너무 짧아서 사이트가 훨씬 더 혼잡해질 때까지 동시성 문제에 대해 부딪히지 않을 것입니다. –