케이블 프로파일링 반환: 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.yml 및 simulate.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"와 같은 기능을 추가하여 격리된 압축을 수행해야 했습니다.풀스택 루비 & 제말록
Jemalloc은
malloc
(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
모든 결과 결합
Reference
이 문제에 관하여(케이블 프로파일링 반환: GC.compact & jemalloc), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/palkan_tula/cables-profiling-returns-gc-compact-jemalloc-33c9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)