From: mperham@... Date: 2018-05-16T18:45:38+00:00 Subject: [ruby-core:87086] [Ruby trunk Feature#14718] Use jemalloc by default? 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/ Unsubscribe: