Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Rails 앱 성능을 이해하는 새로운 방법

Rails 앱이 느린가요?

간단한 보기여야 하는 것을 로드하는 데 몇 초가 걸린다면 파고들 가치가 있는 문제가 있는 것입니다.

데이터베이스 호출이 너무 많거나 일부 느린 방법이 있을 수 있습니다. 아니면 누군가가 귀하의 코드에 넣고 잊어버린 속도 향상 루프일 수도 있습니다.

앱 속도를 저하시키는 원인을 찾는 데 도움이 되는 많은 도구를 찾을 수 있습니다. 몇 주 전에 rbtrace에 대해 이야기했습니다. . New Relic의 rpm gem은 또한 앱 속도를 높이는 데 도움이 되었습니다.

하지만 내가 가장 좋아하는 성능 문제 탐색 도구는 훨씬 더 많은 일을 합니다. 기본적으로 코드가 수행하는 작업을 보여줍니다. 그러나 플러그인을 추가하면 더욱 강력해집니다. 보는 데 도움이 됩니다. 시각적으로 앱의 성능 문제. 그러면 느린 앱을 더 빨리 찾고 수정하는 데 도움이 됩니다.

내가 가장 좋아하는 Rails 프로파일러

내가 가장 좋아하는 Rails 성능 도구는 rack-mini-profiler입니다. . 해당 보석을 앱에 추가하면 각 페이지에 작은 표시기가 나타납니다. 다음과 같습니다.

Rails 앱 성능을 이해하는 새로운 방법

해당 상자를 클릭하면 상자가 확장되고 모든 종류의 멋진 항목을 볼 수 있습니다. 실행된 SQL 문, 부분 렌더링에 걸린 시간 등:

Rails 앱 성능을 이해하는 새로운 방법

MiniProfiler는 각 페이지를 로드하는 데 걸리는 시간을 지속적으로 알려줍니다. 그러면 앱이 어떻게 작동하는지 자세히 알 수 있습니다. 어떤 페이지가 느리고 어떤 페이지가 빠른지 직관적으로 파악할 수 있습니다. 페이지를 렌더링하는 데 놀라울 정도로 시간이 오래 걸리는 것을 알게 될 것입니다. 그리고 마음속에 남아 있는 동안 바로 수정을 시작할 수 있습니다.

MiniProfiler는 더 많은 작업을 수행할 수 있습니다. 하지만 먼저 flamegraph를 설치해야 합니다. 보석.

그렇게 하면 앱의 성능을 볼 수 있는 새로운 방법이 열립니다.

Flamegraphs:소리만큼 재미있습니다.

화염 그래프는 다음과 같습니다.

Rails 앱 성능을 이해하는 새로운 방법

이름이 어디에서 왔는지 명확하지 않습니까?

rack-mini-profiler를 설치한 후 gem 및 flamegraph gem을 사용하면 모든 요청에 ​​대한 화염 그래프를 볼 수 있습니다. pp=flamegraph를 추가하기만 하면 됩니다. 다음과 같은 HTTP 매개변수로:

https://www.example.com/restaurants?pp=flamegraph

화염 그래프가 나타나면 확대/축소, 스크롤, 탐색할 흥미로운 항목을 찾을 수 있습니다.

플레임그래프의 각 '레이어'는 스택 추적의 한 줄입니다.

Rails 앱 성능을 이해하는 새로운 방법

가로축은 시간입니다. 따라서 그래프의 맨 왼쪽은 요청이 시작된 시점이고 맨 오른쪽은 요청이 완료된 시점입니다.

그래서 확실히 멋져 보입니다. 하지만 화염 그래프로 무엇을 할 수 있습니까?

플레임그래프 사용 방법

X축은 시간을 나타내기 때문에 앱이 정체되는 위치를 명확하게 파악할 수 있습니다. 가장 넓은 레이어를 실행하는 데 시간이 가장 오래 걸립니다. 속도를 높이는 것이 가장 큰 영향을 미칠 수 있으므로 가장 먼저 살펴봐야 하는 영역입니다.

앱이 보기를 렌더링하는 데 얼마나 많은 시간을 소비합니까? 컨트롤러 작업에서? 데이터베이스에 타격? 부분 렌더링?

이 모든 것이 시각적으로 정말 보기 쉽습니다.

Rails 앱 성능을 이해하는 새로운 방법

Flamegraph가 보여줄 수 있는 또 다른 유용한 정보가 있습니다.

이렇게 높이가 거의 같은 스파이크 뭉치가 보이시나요?

Rails 앱 성능을 이해하는 새로운 방법

즉, N+1 쿼리가 있는 경우가 많습니다. includes이 누락되었습니다. 어딘가에, 또는 API에 대한 많은 호출을 할 수 있습니다. includes을 추가한 경우 , 다음과 같은 화염 그래프를 얻을 수 있습니다.

Rails 앱 성능을 이해하는 새로운 방법

N+1 SQL 쿼리는 대부분의 성능 도구에서 매우 쉽게 볼 수 있습니다. 비슷한 모양의 SQL 호출만 찾으면 됩니다. 하지만 API를 너무 많이 사용하는 것과 같은 비 SQL N+1 문제는 알아차리기가 훨씬 더 어렵습니다. 특히 로깅이 좋지 않다면.

하지만 플레임그래프를 사용하면 이러한 문제가 훨씬 더 눈에 띄게 나타납니다.

주의하지 말아야 할 사항

Flamegraphs는 압도적일 수 있습니다. 그들은 당신에게 많은 정보를 보여주고, 당신은 거의 모든 정보를 한 번에 받아들여야 합니다. 그래서 무엇을 무시할 수 있습니까?

일반적으로 그래프의 맨 아래 및 맨 위 레이어는 건너뛸 수 있습니다. 대신, 나는 그래프의 중간, 또는 아마도 상단으로 가는 길의 3/4을 탐색하기 시작합니다. 내 코드가 자주 사용되는 곳입니다.

그래프의 상단은 일반적으로 ActiveRecord 또는 IO 관련이고 하단은 Rails 프레임워크 코드이므로 코드가 중간 어딘가에 있을 것입니다.

화염 그래프를 사용한 적이 있습니까? 최적화할 최적의 장소를 찾는 좋은 방법입니다. 그러니 시도해보십시오! rack-mini-profiler 추가 및 flamegraph Gemfile에 gem . 코드에 대해 얼마나 더 많은 통찰력을 얻을 수 있는지 놀랄 것입니다.