Fullstaq Ruby: 첫인상, Docker/Kubernetes Ruby 어플리케이션 마이그레이션 방법

Fullstaq Ruby란?


Fullstaq Ruby는 표준 MRI Ruby 해석기의 맞춤형 버전으로 메모리 분배기를 교체하고 보안 패치를 적용했으며 더 많은 좋은 것이 있다.
만약 몇몇 선배들이 여기에 있다면, 그들은 REE - Ruby 기업판 - Ruby 1.8.7과 Ruby on Rails 2.2의 원고시대 (약 10년 전) 를 기억할 것이다.아, 좋은 시절이다!RVM 또는 Rbenv를 통해 설치할 수 있으며 일부 레거시 어플리케이션이 아직 실행 중이거나 방금 마이그레이션되었습니다.REE는 Ruby 1.8.7에 성능 향상, 메모리 소모 감소, 오래된 보안 설정 조정 등을 위해 1개dozen of different patches를 추가했다.
핵자기 공진 성상 1.9.x 이 문제들 중 대다수가 해결되었고 REE가 채택되면서 시대에 뒤떨어졌다.그러나 현대의'보통'핵자기공진상에도 괴벽이 있어 상대적으로 쉽게 복구할 수 있다.그중 가장 짜증나는 것은memory bloat due to memory fragmentation이다.
따라서 REE의 창립자Hongli Lai가 Fullstaq Ruby를 발표하는 것은 조금도 이상하지 않다.

REE is dead, long live Fullstaq Ruby!


우리는 왜 그것을 필요로 합니까?


우리Evil Martians의 한 항목에서 우리는 심각한 메모리 팽창을 겪었다.Google 프로그램에는 많은 IO가 있습니다. Google은 많은 Sidekiq 프로세스를 가지고 있으며, 높은 병렬 설정을 가지고 있습니다. (프로세스당 20개의 루틴)작업자가 주로 다른 원격 API, 자체 데이터베이스, 캐시에 요청을 보내기 때문에 성능 측면에서 이 설정이 가장 좋습니다.그러나 이처럼 높은 수준의 합병성도 메모리 파편화를 초래할 수 있다.Sidekiq 프로세스는 프로세스당 수 GB의 RAM을 소비합니다.

Read more about choosing Sidekiq concurrency setting in the Sidekiq in Practice part 1 by Nate Berkopec.


MRI 2.6.3을 jemalloc로 교체하여 Fullstaq Ruby 2.6.3으로 성능을 확인하기로 결정했습니다.

이게 차이야!


Dell은 운영 환경에서 24시간 유료 고객의 요청에 서비스를 제공하는 Fullstaq Ruby를 실행하는 비즈니스 어플리케이션을 시도했습니다.

First of all: nothing broke. Zero downtime!


이제 이 모니터들을 보세요.장시간 실행된 프로세스의 메모리 팽창은 사실상 이미 사라졌다.

  • 웹 응용 프로그램 프로세스는 메모리 소모가 매우 안정적으로 변했다. (메모리가 4배 감소했다.)팽창은 여전히 간혹 발생하지만, 읽기 수는 여전히 최고치 기간에 소모된 메모리가 약 50퍼센트 감소한 것을 나타낸다.


  • 배경 스태프(Sidekiq 사용)도 3분의 2의 체중을 감량했다.Fullstaq Ruby로 마이그레이션하기 전 1.5~2GB에서 Fullstaq Ruby로 마이그레이션한 후 500~700MB.

  • 짧은 프로세스(예를 들어cron 작업)의 메모리 소모는 현저한 차이가 없다
  • 응답 시간이나 CPU 사용률의 변경 사항을 인식하지 못했습니다.
  • 위의 도표는 메모리 파편이 높은 메모리 소모의 원인임을 증명했다.
    하나의 루비 바이너리 파일을 다른 루비 바이너리 파일로 바꾸는 것은 매우 큰 개선 사항이 아닙니까?

    선택?


    만약 제몰락이 당신의 선택이 아니거나 MRI 대신 다른 것을 사용할 부담이 없다면 MALLOC_ARENA_MAX=2 맞춤법으로 MRI의 표준glibc-몰락 행동을 조정해 보세요.Fullstaq Ruby와 거의 동등하게 처리될 것입니다.

    우리의 예에서 제한된 수량의 malloc arena(오른쪽)를 사용하는 Ruby는 Jemalloc(왼쪽)의 Ruby를 사용하는 것보다 약 50-100MB의 메모리를 더 소모한다.

    Read more and see benchmarks of MALLOC_ARENA_MAX=2 in this post:


    Fullstaq Ruby를 계속 사용하기로 결정했습니다.

    어떻게 설치합니까?


    현재 Fullstaq Ruby를 설치하는 유일한 방법은deb 또는 rpm 패키지(직접 설치 또는 저장소를 통해 설치)를 사용하는 것입니다.그러나 Kubernetes 그룹에 프로그램을 배치하기 때문에 Docker 이미지가 필요합니다.공식 홈페이지에는 아직'용기판'이 없기 때문에 우리로 하여금 자신의 이미지를 세우게 하는 것은 사실상 어렵지 않다!
    공식 Ruby Docker image에서 사용하는 Linux 릴리스이므로 Debian 9을 사용하고 Ruby 버전을 정의합니다.
    FROM debian:stretch-slim
    
    ARG RUBY_VERSION=2.6.3-jemalloc
    
    그런 다음 명령에 선결 조건을 설치하고 Fullstaq Ruby APT repository를 추가하며 Ruby 자체를 설치하고 APT 캐시를 정리하여 Docker 레이어의 크기를 줄입니다.
    RUN apt-get update -q \
        && apt-get dist-upgrade --assume-yes \
        && apt-get install --assume-yes -q --no-install-recommends curl gnupg apt-transport-https ca-certificates \
        && curl -SLf https://raw.githubusercontent.com/fullstaq-labs/fullstaq-ruby-server-edition/master/fullstaq-ruby.asc | apt-key add - \
        && echo "deb https://apt.fullstaqruby.org debian-9 main" > /etc/apt/sources.list.d/fullstaq-ruby.list \
        && apt-get update -q \
        && apt-get install --assume-yes -q --no-install-recommends fullstaq-ruby-${RUBY_VERSION} \
        && apt-get autoremove --assume-yes \
        && rm -fr /var/cache/apt
    
    Fullstaq Ruby도 Rbenv를 의존 항목으로 설치하지만 Docker에서는 Rbenv를 필요로 하지 않기 때문에 same way that official Docker image for Ruby does에 Ruby와gems 바이너리 파일을 추가합니다.
    ENV GEM_HOME /usr/local/bundle
    ENV BUNDLE_PATH="$GEM_HOME" \
        BUNDLE_SILENCE_ROOT_WARNING=1 \
        BUNDLE_APP_CONFIG="$GEM_HOME" \
        RUBY_VERSION=$RUBY_VERSION \
        LANG=C.UTF-8 LC_ALL=C.UTF-8
    
    # path recommendation: https://github.com/bundler/bundler/pull/6469#issuecomment-383235438
    ENV PATH $GEM_HOME/bin:$BUNDLE_PATH/gems/bin:/usr/lib/fullstaq-ruby/versions/${RUBY_VERSION}/bin:$PATH
    
    CMD [ "irb" ]
    
    이렇게!
    우리는 이미 이 사진을 제작하여 발표했다.너는 부두에서 our repository 떼어낼 수 있다.io:
    docker pull quay.io/evl.ms/fullstaq-ruby:2.6.3-jemalloc-stretch-slim
    
    GitHub에서 DockerFile: https://github.com/evilmartians/fullstaq-ruby-docker
    이제 응용 프로그램 Dockerfile에서 기본 이미지를 교체할 수 있습니다.
    -ARG RUBY_VERSION=2.6.3
    +ARG RUBY_VERSION=2.6.3-jemalloc
    
    -FROM ruby:${RUBY_VERSION}-stretch-slim
    +FROM quay.io/evl.ms/fullstaq-ruby:${RUBY_VERSION}-stretch-slim
    
    임시 저장에 배치한 후 생산에 배치한다.
    너도 이렇게 할 수 있어!

    요점을 요약하고 다시 말하다.

  • 마이그레이션은 안정적입니다.Ruby와gems를 다시 설치하면 모든 것이 정상적이어야 합니다.
  • 응용 프로그램 서버와 백엔드 작업 프로세스는 메모리 소모를 대폭 줄일 수 있어야 한다.
  • 짧은 프로세스(예를 들어cron 작업이나 스크립트)의 메모리 소모는 현저한 차이가 없다.
  • 성능은 약간 향상될 수 있지만 워크로드에 따라 달라질 수 있습니다.
  • 좋은 웹페이지 즐겨찾기