From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-3.6 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id 0A3C41F42D for ; Wed, 16 May 2018 18:45:48 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 155A8120A13; Thu, 17 May 2018 03:45:44 +0900 (JST) Received: from o1678948x4.outbound-mail.sendgrid.net (o1678948x4.outbound-mail.sendgrid.net [167.89.48.4]) by neon.ruby-lang.org (Postfix) with ESMTPS id 81931120A11 for ; Thu, 17 May 2018 03:45:42 +0900 (JST) Received: by filter0023p3iad2.sendgrid.net with SMTP id filter0023p3iad2-26106-5AFC7C51-7A 2018-05-16 18:45:37.886502673 +0000 UTC Received: from herokuapp.com (ec2-54-226-188-231.compute-1.amazonaws.com [54.226.188.231]) by ismtpd0023p1mdw1.sendgrid.net (SG) with ESMTP id wjqhs-cGTLe_gLTAfioTbQ Wed, 16 May 2018 18:45:37.827 +0000 (UTC) Date: Wed, 16 May 2018 18:45:38 +0000 (UTC) From: mperham@gmail.com To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 62448 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 14718 X-Redmine-Issue-Author: mperham X-Redmine-Sender: mperham X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS6jq5Sc9llT76ISW3B5GNoc/U4AZbnxVO8RAd Tdj4lv+2GTTtLHFoSYr56mq7MS+iTVbdW1IJkIa9CmWOsp+ZOaurOL/leVToBeT3fJkmetU+kj47B0 DgYii7XrZuQQh52cp9EEpCdgXf9GGg1ZnNfJCJllsSvPRFE6XuAahT9lYQ== X-ML-Name: ruby-core X-Mail-Count: 87086 Subject: [ruby-core:87086] [Ruby trunk Feature#14718] Use jemalloc by default? X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #14718 has been updated by mperham (Mike Perham). I've created a script which attempts to reproduce memory fragmentation. ~~~ =begin This script attempts to reproduce poor glibc allocator behavior within Ruby, leading to extreme memory fragmentation and process RSS bloat. glibc allocates memory using per-thread "arenas". These blocks can easily fragment when some objects are free'd and others are long-lived. Our script runs multiple threads, all allocating randomly sized "large" Strings between 4,000 and 40,000 bytes in size. This simulates Rails views with ERB creating large chunks of HTML to output to the browser. Some of these strings are kept around and some are discarded. With the builds below and the frag.rb script, jemalloc and MALLOC_ARENA_MAX=2 both show a noticeable reduction in RSS. =end ~~~ Results, it shows a significant reduction in RSS when run with jemalloc or MALLOC_ARENA_MAX=2. ~~~ > MALLOC_ARENA_MAX=32 /root/versions/2.5.1/bin/ruby -v frag.rb ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux] '--disable-install-doc' '--prefix=/root/versions/2.5.1' Total string size: 1903MB VmRSS: 2831832 kB > MALLOC_ARENA_MAX=2 /root/versions/2.5.1/bin/ruby -v frag.rb ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux] '--disable-install-doc' '--prefix=/root/versions/2.5.1' Total string size: 1917MB VmRSS: 2311052 kB > /root/versions/2.5.1j/bin/ruby -v frag.rb ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux] '--with-jemalloc' '--disable-install-doc' '--prefix=/root/versions/2.5.1j' Total string size: 1908MB VmRSS: 2306372 kB ~~~ https://gist.github.com/mperham/ac1585ba0b43863dfdb0bf3d54b4098e ---------------------------------------- Feature #14718: Use jemalloc by default? https://bugs.ruby-lang.org/issues/14718#change-72053 * Author: mperham (Mike Perham) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- I know Sam opened #9113 4 years ago to suggest this but I'm revisiting the topic to see if there's any movement here for Ruby 2.6 or 2.7. I supply a major piece of Ruby infrastructure (Sidekiq) and I keep hearing over and over how Ruby is terrible with memory, a huge memory hog with their Rails apps. My users switch to jemalloc and a miracle occurs: their memory usage drops massively. Some data points: https://twitter.com/brandonhilkert/status/987400365627801601 https://twitter.com/d_jones/status/989866391787335680 https://github.com/mperham/sidekiq/issues/3824#issuecomment-383072469 Redis moved to jemalloc many years ago and it solved all of their memory issues too. Their conclusion: the glibc allocator "sucks really really hard". http://oldblog.antirez.com/post/everything-about-redis-24.html This is a real pain point for the entire Rails community and would improve Ruby's reputation immensely if we can solve this problem. -- https://bugs.ruby-lang.org/