about summary refs log tree commit homepage
path: root/README
diff options
context:
space:
mode:
Diffstat (limited to 'README')
-rw-r--r--README120
1 files changed, 70 insertions, 50 deletions
diff --git a/README b/README
index 88abe7d..f969c14 100644
--- a/README
+++ b/README
@@ -1,66 +1,86 @@
-Devel::Mwrap - LD_PRELOAD malloc wrapper + malloc line stats for Perl
+= mwrap - LD_PRELOAD malloc wrapper + line stats for Ruby
 
-Devel::Mwrap is designed to answer the question:
+mwrap is designed to answer the question:
 
-   Which lines of Perl are hitting malloc the most?
+   Which lines of Ruby are hitting malloc the most?
 
-Devel::Mwrap wraps all malloc-family calls to trace the Perl
-source location of such calls and bytes allocated at each
-callsite.  It is primarily designed to identify high memory use,
-but may function as a leak detector as it can show live
-allocations at every call site.  Depending on your application
-and workload, the overhead is roughly a 50%-100% increase memory
-and runtime.
+mwrap wraps all malloc-family calls to trace the Ruby source
+location of such calls and bytes allocated at each callsite.
+As of mwrap 2.0.0, it can also function as a leak detector
+and show live allocations at every call site.  Depending on
+your application and workload, the overhead is roughly a 50-100%
+increase memory and runtime with default settings.
 
-It also gives configurable backtraces of all dynamically-linked
-malloc callsites for any program where backtrace(3) works,
-including programs not linked to Perl.
+It works best for allocations under GVL, but tries to track
+numeric caller addresses for allocations made without GVL so you
+can get an idea of how much memory usage certain extensions and
+native libraries use.
 
-It is thread-safe and requires the concurrent lock-free hash table
-from the Userspace RCU project: https://liburcu.org/
+As of 3.0, it also gives configurable C backtraces of all
+dynamically-linked malloc callsites for any program where backtrace(3)
+works, including programs not linked to Ruby.
 
-It relies on dynamic linking to a malloc(3) implementation.  If
-you got Perl from your OS distribution, this typically does not
-require rebuilding Perl.
+It requires the concurrent lock-free hash table from the
+Userspace RCU project: https://liburcu.org/
 
-Tested on the `perl' package distributed with:
+It does not require recompiling or rebuilding Ruby, but only
+supports Ruby 2.7.0 or later on a few platforms:
 
-* Debian GNU/Linux 10 and 11
+* GNU/Linux (only tested --without-jemalloc, mwrap 3.x provides its own malloc)
 
-* FreeBSD 12.x
-
-It may work on NetBSD, OpenBSD and DragonFly BSD.
+It may work on FreeBSD, NetBSD, OpenBSD and DragonFly BSD if given
+appropriate build options.
 
 == Install
 
-See `INSTALL' document
+        # Debian-based systems: apt-get install liburcu-dev
+
+        # Install mwrap via RubyGems.org
+        gem install mwrap
 
 == Usage
 
-Devel::Mwrap works as an LD_PRELOAD and supplies a mwrap-perl wrapper to
-improve ease-of-use.  You can set dump_csv: in the MWRAP environment
+mwrap works as an LD_PRELOAD and supplies a mwrap RubyGem executable to
+improve ease-of-use.  You can set `dump_csv:' in the MWRAP environment
 variable to append the results to a CSV file:
 
-        MWRAP=dump_csv:/path/to/csv.%p mwrap-perl COMMAND
+        MWRAP=dump_csv:/path/to/log mwrap RUBY_COMMAND
+
+(`dump_csv:' is new in mwrap 3.x, `dump_file:' from earlier versions is
+still supported).
 
 For long running processes, you can see the AF_UNIX HTTP interface:
 
-        MWRAP=socket_dir:/some/dir mwrap-perl COMMAND
+        MWRAP=socket_dir:/some/dir mwrap COMMAND
+
+And connect via `curl --unix-socket /some/dir/$PID.sock' or
+`mwrap-rproxy(1p)<https://80x24.org/mwrap-perl.git/tree/script/mwrap-rproxy#n44>
+for more info.
 
-And connect via `curl --unix-socket /some/dir/$PID.sock' or `mwrap-rproxy'.
-See mwrap-rproxy(1p) and mwrap-perl(1p) manpages for more info.
+You may also `require "mwrap"' in your Ruby code and use
+Mwrap.dump, Mwrap.reset, Mwrap.each, etc.
 
-== Compared to other tools
+However, mwrap MUST be loaded via LD_PRELOAD to have any
+effect in tracking malloc use.  However, it is safe to keep
+"require 'mwrap'" in performance-critical deployments,
+as overhead is only incurred when used as an LD_PRELOAD.
 
-* mwrap-perl knows about Perl code, and an `mwrap' RubyGem exists, too
+The output of `dump_csv:' is has self-describing columns and is
+subject to change.  SQLite 3.32+ can load it with: `.import --csv'.
 
-* mwrap does not catch memory errors; use ASan, valgrind, or similar
+The output of the `dump_file:' output is a text file with 3 columns:
 
-* mwrap is reasonably fast, fast enough for the author to run on
-  production-facing Perl daemons
+        total_bytes        call_count        location
 
-* the AF_UNIX HTTP interface allows inspecting live processes without
-  interruption instead of waiting for an exit dump
+Where location is a Ruby source location (if made under GVL)
+or an address retrieved by backtrace_symbols(3).  It is
+recommended to use the sort(1) command on either of the
+first two columns to find the hottest malloc locations.
+
+mwrap 3.0.0+ also supports an embedded HTTP server
+it is documented at:
+
+https://80x24.org/mwrap.git/tree/Documentation/mwrap.pod
 
 == Known problems
 
@@ -68,28 +88,28 @@ See mwrap-rproxy(1p) and mwrap-perl(1p) manpages for more info.
 
 * signalfd(2)-reliant code will need latest URCU with commit
   ea3a28a3f71dd02f (Disable signals in URCU background threads, 2022-09-23)
+  This doesn't affect C Ruby itself, and signalfd(2) use is rare
+  3rd-party processes.
 
-* Perl source files over 16.7 million lines long are not supported :P
-
-* large C backtraces (off by default) are expensive for large programs
+* Ruby source files over 16.7 million lines long are not supported :P
 
 == Public mail archives (HTTP, Atom feeds, IMAP mailbox, NNTP group, POP3):
 
-        https://80x24.org/mwrap-perl/
-        imaps://;AUTH=ANONYMOUS@80x24.org/inbox.comp.lang.perl.mwrap.0
-        nntps://80x24.org/inbox.comp.lang.perl.mwrap
-        https://80x24.org/mwrap-perl/_/text/help/#pop3
+* https://80x24.org/mwrap-public/
+* nntps://80x24.org/inbox.comp.lang.ruby.mwrap
+* imaps://;AUTH=ANONYMOUS@80x24.org/inbox.comp.lang.ruby.mwrap.0
+* https://80x24.org/mwrap-public/_/text/help/#pop3
 
-No subscription nor real identities will ever be required to obtain
-support or contribute, HTML mail is rejected.  Memory usage reductions
-start with you; only send plain-text mail to us and do not top-post.
-HTML mail and top-posting costs everybody memory and bandwidth.
+No subscription nor real identities will ever be required to obtain support,
+but HTML mail is rejected.  Memory usage reductions start with you;
+only send plain-text mail to us and do not top-post.  HTML mail and
+top-posting costs everybody memory and bandwidth.
 
-                mwrap-perl@80x24.org
+                mwrap-public@80x24.org
 
 == Hacking
 
-        git clone https://80x24.org/mwrap-perl.git
+        git clone https://80x24.org/mwrap.git
 
 Send all patches ("git format-patch" + "git send-email") and
 pull requests (use "git request-pull" to format) via email