케이블 프로파일링 반환: GC.compact & jemalloc

This post introduces a new series—Unfinished plays. I have many drafts and incomplete posts I do not plan to finish in the nearest future. Since they still could be interesting/helpful to the community, I decided to release them almost as-is. This is the first one.



에서 Action Cable 메모리 사용량을 다양한 VM 구성(MALLOC_ARENA_MAX , malloc_trim )과 비교했습니다. 이 방향으로 계속 연구하고 GC.compact 및 jemalloc (Fullstaq Ruby을 통해)도 평가하겠다고 약속했습니다. 자, 여기 있습니다.

벤치마크



이번에는 조금 다른 시나리오를 분석하기로 했습니다.

"일정한 압력"은 균일한 로드를 의미합니다. 클라이언트는 벤치마크 중에 연결, 통신 및 연결 해제되지만 총 동시 사용자 수는 거의 동일하게 유지됩니다.

wsdirector이라는 시나리오를 작성하기 위한 특정 도구가 있습니다. 이를 통해 YML 형식으로 시나리오를 정의하고 다른 배율 인수를 사용하여 실행할 수 있습니다.

"갑자기 공격"은 동시 연결 수가 예기치 않게 급증한 다음 정상으로 돌아오는 상황을 에뮬레이트합니다. .

벤치마크의 소스 코드는 https://github.com/anycable/simple-cable-app에서 사용할 수 있습니다(simiulate.ymlsimulate.rb 참조).

서버가 Docker 컨테이너 내에서 실행 중입니다. 벤치마크 중에 컨테이너의 메모리 사용량을 캡처하고 마지막에 차트를 생성합니다(굉장한 unicode_plot 라이브러리의 도움으로 monitor_docker.rb 참조).

아래 벤치마크에 사용한 정확한 명령은 다음과 같습니다.

# first, start the app
dip up rails

# or for Fullstaq
dip up rails-fs

# or for Fullstaq with malloc_trim
dip up rails-fs-trim

# pressure
TOTAL=20 SAMPLE=50 N=4 SCALE=200 ruby benchmarks/simulate.rb

# spike (runs twice during the pressure)
cat benchmarks/broadcast.opts | xargs websocket-bench broadcast


아래에서 내 컴퓨터(Windows 10 + WSL2, AMD Ryzen 3200G 3.6GHz, 16GB RAM)에서 얻은 결과를 찾을 수 있습니다. 그러나 먼저 힙 압축에 대해 잠시 이야기해 봅시다.

GC.compact



GC 압축이 마침내 Ruby 2.7에서 릴리스되었습니다(덕분에 ). 이 기능에 대해 자세히 알아보려면 RubyConf 2019의 예를 들어 Aaron의 최신 강연 중 하나를 시청하세요.



먼저, 1k 연결된 클라이언트로 시뮬레이션을 실행한 후 GC.compact의 효과를 시각화하려고 했습니다.


다짐 없이


GC.compact 이후

대박! 압축이 작동합니다! 아니면 🤔

각 웨이브 이후에 추가된 GC.compact 호출로 압력 시나리오를 실행하려고 시도했지만(다른 웨이브가 활성 상태인 동안, 즉 연결 수락, 메시지 브로드캐스팅 등을 계속) 불행히도 segmentation fault 상황에 처했습니다. 아마도 문제는 C 확장(최소한 Puma 및 nio4r이 있음)에 있습니다.

활성 액션 케이블 클라이언트가 없을 때 호출GC.compact이 제대로 작동합니다. 그래서 저는 시나리오를 약간 업데이트하고 "stop-the-world"와 같은 기능을 추가하여 격리된 압축을 수행해야 했습니다.

풀스택 루비 & 제말록



Jemallocmalloc(MRI에서 기본적으로 사용됨) 대신 사용할 수 있는 대체 메모리 할당자입니다.

Here are a couple of articles to learn more about jemalloc for Rails applications: one and two.



Fullstaq Ruby을 통해 jemalloc이 내장된 Docker images provided by Evil Martians 배포판을 사용할 것입니다.

벤치마크 결과



참고: 이것은 미완성 플레이이므로 여기에서 설명/자전거 흘리기를 제공하지 않습니다. 그냥 평범한 결과입니다. 댓글에서 자유롭게 토론을 시작하세요!

6가지 설정이 있습니다.

  • 기준선: MRI 2.7.1

  • 컴팩트: MRI 2.7.1 w/압축

  • jemalloc: Fullstaq Ruby 2.7.1(jemalloc 포함)

  • jemalloc_compact: jemalloc 및 압축이 포함된 Fullstaq Ruby 2.7.1

  • 다듬기: Fullstaq Ruby 2.7.1 w/malloc_trim

  • trim_compact: Fullstaq Ruby 2.7.1 w/malloc_trim 및 압축.

  • 아래에서 다양한 조합의 벤치마크 결과를 확인할 수 있습니다(차이점을 더 잘 보여주기 위해).


    다짐 없이


    다짐으로


    루비 2.7.1


    Jemalloc을 사용한 FullstaqRuby 2.7.1


    malloc_trim이 포함된 FullstaqRuby 2.7.1


    모든 결과 결합

    좋은 웹페이지 즐겨찾기