Fullstaq Ruby: 첫인상, Docker/Kubernetes Ruby 어플리케이션 마이그레이션 방법
8758 단어 rubymemorydockerperformance
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.
하나의 루비 바이너리 파일을 다른 루비 바이너리 파일로 바꾸는 것은 매우 큰 개선 사항이 아닙니까?
선택?
만약 제몰락이 당신의 선택이 아니거나 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
임시 저장에 배치한 후 생산에 배치한다.너도 이렇게 할 수 있어!
요점을 요약하고 다시 말하다.
Reference
이 문제에 관하여(Fullstaq Ruby: 첫인상, Docker/Kubernetes Ruby 어플리케이션 마이그레이션 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/evilmartians/fullstaq-ruby-first-impressions-and-how-to-migrate-your-docker-kubernetes-ruby-apps-today-4fm7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)