Project

General

Profile

Feature #14813

[PATCH] gc.c: make gc_enter+gc_exit pairs dtrace probes, too

Added by normalperson (Eric Wong) 4 months ago. Updated 3 months ago.

Status:
Open
Priority:
Normal
Target version:
-
[ruby-core:87360]

Description

gc.c: make gc_enter+gc_exit pairs dtrace probes, too

I would like to use these with systemtap to gather
min/max/avg/variance data for gc_*_continue functions.

I prefer to use systemtap/dtrace and not modify or load extra
Ruby code to use built-in tracing. Systemtap also has aggregate
functionality built in for @min/@max/@avg and @hist_log for
generating histograms:

https://80x24.org/spew/20180602135820.6686-1-e@80x24.org/raw
(work-in-progress)

I will add documentation to probes.d and doc/dtrace_probes.rdoc
if accepted.

History

#1 [ruby-core:87419] Updated by normalperson (Eric Wong) 4 months ago

https://bugs.ruby-lang.org/issues/14813

I would like to use these with systemtap to gather
min/max/avg/variance data for gc_*_continue functions.

Fwiw, I tried using function tracing for this, but they get
inlined, timing becomes impossible :<

#2 [ruby-core:87424] Updated by normalperson (Eric Wong) 4 months ago

https://bugs.ruby-lang.org/issues/14813

Fwiw, I'm still learning systemtap myself; and I made r63581
the dtrace tests to work with systemtap.

I played around with systemtap ~5 years ago for other projects
and forgot much of it :x

For Debian/Ubuntu users:

# as root:
apt-get install systemtap systemtap-sdt-dev
stap-prep # should install necessary kernel headers + debug symbol(*)
adduser $YOUR_USER stapusr
adduser $YOUR_USER stapdev

Red Hat-based systems should be similar; and most of the
systemtap team works for Red Hat. There's also dyninst support
which won't require special privileges (or kernel context
switch), but current Debian stable doesn't enable it, yet.

# (re-)login as regular user:

# rebuild Ruby with --enable-dtrace
# (make sure probes.h has SDT stuff and isn't a dummy file)

# trace a new command
$ stap -v script.stp -c "$RUBY_CMD"

# trace running command
$ stap -v script.stp -x $PID_OF_RUBY

My original example with:

probe process("/path/to/ruby").mark("foo")

was a bit strict since it requires the path of executable.
Now I favor "-x $PID" or "-c $CMD" so I can use:

probe process.mark("foo")

There is also "systemtap-doc" package
I look at docs + *.stp examples in their git tree:

git://sourceware.org/git/systemtap.git

(*) I never tested `stap-prep' myself since I build my own kernels
from source. For people like me who run the latest kernels;
be prepared to backport patches from systemtap.git or
build+install from that yourself. Users of distro-provided
kernels get things working out-of-the-box in my experience.

#3 [ruby-core:87617] Updated by vo.x (Vit Ondruch) 3 months ago

Just FTR, Ruby in Fedora/RHEL has built in support for SystemTap.

Not sure what r63581 really does, but you might find useful these two .stp files:

https://src.fedoraproject.org/rpms/ruby/blob/master/f/libruby.stp
https://src.fedoraproject.org/rpms/ruby/blob/master/f/ruby-exercise.stp

Also available in: Atom PDF