What is Ruby Enterprise Edition?
Ruby Enterprise Edition (REE) is a server-oriented distribution of the official Ruby interpreter, and includes various additional enhancements, such as:
- A “copy-on-write friendly” garbage collector, capable of reducing Ruby on Rails applications’ memory usage by 33% on average.
- The tcmalloc memory allocator, which lowers overall memory usage and boosts memory allocation speed.
- Performance enhancements for single-threaded applications (SIGVTALRM patch) and for Sparc machines (Sparc patch).
- The ability to performance tune the garbage collector.
- The MBARI patch set, for improved garbage collection efficiency.
- The zero-copy context switching patch, included as an experimental feature.
- Various analysis and debugging features.
REE can be easily installed in parallel to your existing Ruby interpreter, allowing you switch to REE with minimal hassle or risk. REE has been out for about a year now and is already used by many high-profile websites and organizations, such as New York Times, Shopify and 37signals.
“We switched to enterprise ruby to get the full benefit of the [copy-on-write] memory characteristics and we can absolutely confirm the memory savings of 30% some others have reported. This is many thousand dollars of savings even at today’s hardware prices.”
— Tobias Lütke (Shopify)
And just like Phusion Passenger, Ruby Enterprise Edition is 100% open source.
- New version numbering scheme
- We don’t use full date version numbers anymore. Instead we now use the release year and a sequence number. To avoid confusion we’ve given this release the sequence number 10.
The reason for this change is to allow milestone planning in our issue tracker. It’s kinda inconvenient to assign issues to future milestones if you don’t know their version numbers.
- Fixed floating point calculation issues on GCC 4.4
- GCC 4.4 produces incorrect floating point code because of aliasing issues in the Ruby source code. This causes floating point calculations to generate incorrect results. We’ve fixed this by compiling REE with -fno-strict-aliasing. Issue #2.
- Removed -fno-stack-protector
- The previous version was compiled with the -fno-stack-protector flag, which disables the stack protector. The stack protector is a compiler feature for reducing the effectiveness of buffer overflow attacks. We disabled the stack protector because the author of the MBARI patches recommended so for performance reasons.
Some systems such as Solaris as well as older Linux versions did not support the -fno-stack-protector flag, causing compilation to fail.
We’ve found that enabling the stack protector does not cause any noticeable degrade in performance, so we’ve removed the -fno-stack-protector flag, allowing the platform to decide whether to enable it or not. This not only improves security on platforms where the stack protector is enabled by default, but also fixes the compilation problems that some people were having. Issue #3.
- Snow Leopard compatibility issues fixed
- The tcmalloc memory allocator has some issues with Snow Leopard, so we’ve disabled tcmalloc on Snow Leopard. It’s still enabled for Leopard and other supported platforms.
- Backported a File.open memory leak fix
- Apparently File.open leaks memory. We’ve backported the leak fix.
Please note that this fix is not included in the latest upstream Ruby 1.8.7 release (p174). If you’re not an REE user then we strongly recommend applying this patch yourself.
- The installer now checks for ‘make’
- The installer used to fail silently if make isn’t installed. Issue #4.
- Various minor changes
- Upgraded tcmalloc to version 1.4
- The installer now installs the ‘pg’ gem instead of ‘postgres’, because ‘pg’ is newer, has more features and is under more active maintenance.
- The Linux x86_64 bootstrap binary has been recompiled so that it works on systems with a glibc version older than 2.7. This allows the installer to run out-of-the-box on e.g. x86_64 CentOS 5.2.
Download & upgrade
To install Ruby Enterprise Edition, please visit the download page. To upgrade from a previous version, simply install into the same prefix that you installed to last time. Please also refer to the documentation for upgrade instructions.