[#103680] [Ruby master Bug#17843] Ruby on Rails error[BUG] Segmentation fault at 0x0000000000000110 ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin15] (#42110) — nayaronfire@...

Issue #17843 has been reported by nayaronfire (kk nayar).

7 messages 2021/05/01

[#103686] [Ruby master Misc#17845] Windows Ruby - ucrt build? — Greg.mpls@...

Issue #17845 has been reported by MSP-Greg (Greg L).

22 messages 2021/05/01

[#103690] [Ruby master Bug#17846] Percent mode changes the output from ERB beyond what is documented — wolf@...

Issue #17846 has been reported by graywolf (Gray Wolf).

8 messages 2021/05/02

[#103724] [Ruby master Feature#17849] Fix Timeout.timeout so that it can be used in threaded Web servers — duerst@...

Issue #17849 has been reported by duerst (Martin Dst).

22 messages 2021/05/05

[#103756] [Ruby master Feature#17853] Add Thread#thread_id — komamitsu@...

Issue #17853 has been reported by komamitsu (Mitsunori Komatsu).

11 messages 2021/05/06

[#103801] [Ruby master Feature#17859] Start IRB when running just `ruby` — deivid.rodriguez@...

Issue #17859 has been reported by deivid (David Rodr刕uez).

18 messages 2021/05/12

[#103866] [Ruby master Bug#17866] Incompatible changes with Psych 4.0.0 — hsbt@...

Issue #17866 has been reported by hsbt (Hiroshi SHIBATA).

13 messages 2021/05/17

[#103892] [Ruby master Bug#17871] TestGCCompact#test_ast_compacts test failing again — jaruga@...

Issue #17871 has been reported by jaruga (Jun Aruga).

11 messages 2021/05/19

[#103912] [Ruby master Bug#17873] Update of default gems in Ruby 3.1 — hsbt@...

Issue #17873 has been reported by hsbt (Hiroshi SHIBATA).

38 messages 2021/05/20

[#103971] [Ruby master Bug#17880] [BUG] We are killing the stack canary set by `opt_setinlinecache` — jean.boussier@...

Issue #17880 has been reported by byroot (Jean Boussier).

8 messages 2021/05/22

[#103974] [Ruby master Feature#17881] Add a Module#const_added callback — jean.boussier@...

Issue #17881 has been reported by byroot (Jean Boussier).

29 messages 2021/05/22

[#104004] [Ruby master Feature#17883] Load bundler/setup earlier to make `bundle exec ruby -r` respect Gemfile — mame@...

Issue #17883 has been reported by mame (Yusuke Endoh).

21 messages 2021/05/24

[#104109] [Ruby master Feature#17930] Add column information into error backtrace — mame@...

Issue #17930 has been reported by mame (Yusuke Endoh).

34 messages 2021/05/31

[ruby-core:104009] [Ruby master Feature#17884] locindex for profiling tools

From: ko1@...
Date: 2021-05-24 15:41:25 UTC
List: ruby-core #104009
Issue #17884 has been reported by ko1 (Koichi Sasada).

----------------------------------------
Feature #17884: locindex for profiling tools
https://bugs.ruby-lang.org/issues/17884

* Author: ko1 (Koichi Sasada)
* Status: Open
* Priority: Normal
* Assignee: ko1 (Koichi Sasada)
----------------------------------------
(MRI internals)

Profiling tools need to record the code location, mainly a pair of file path and line number ("file:line").
To record this pair in 64bit CPU, 8B (VALUE) + 4B (int) = 12B is needed. In general, the number of pairs (file:line) in a interpreter process does not exceed 32bit boundary (4G pairs). `st_data_t` is 8B (or 4B on 32bit CPU) and we can not store "file:path" information as `st_table` key/value.

Also getting a line from PC (program counter), is not simple (now we are using succinct bitvector, enough fast and compact data in general, but need some calculations).

To solve the size and the time problem, we introduced new concept "locindex".

"locindex" is `unsigned int` data structure, maybe 4B in many environments. A "locindex" represents a pair of "iseq" and "PC" (more correctly, "pc_index", given by `PC - iseq->body->iseq_encoded`).

We can get "locindexL" from "iseqA" with "pcB". "iseqA" will not be freed in this process.
From "locindexL", we can get "iseqA" and "pcB". We can calculate "file:line" information from the iseq/pc pair. "file:line" information is needed to see the profiling results, so the performance of getting "file:line" from a "iseq/pc" pair is not important, in many cases.

"locindex" is calculated by the following pseudo code:

```ruby
$last_locindex = 1
$global_recorded_ary = []

def locindex iseq, pc # pc is pc_index (nth instruction)
  if iseq->locindex_start == 0 # not recorded yet
    iseq->locindex_start = last_locindex
    $last_locindex += iseq->iseq_size
    $global_recorded_ary.push(iseq)
  end
  iseq->locindex_start + pc
end

def resolve locindex
  $global_recorded_ary.each{|iseq|
    if locindex is in iseq?
      return [iseq, locindx - iseq->locindex_start]
    end
  }
end
```

----

`ObjectSpace.trace_object_allocations` is one of profiling tool and we can use "locindex" to make it.
I implemented and measure the performance.

The benchmark program:

```ruby
# This file should be located to the ruby's src directory

require 'objspace/trace'
require 'rdoc/rdoc'
require 'tmpdir'

srcdir = File.expand_path(__dir__)
STDERR.puts srcdir

Dir.mktmpdir('rdocbench-'){|d|
  dir = File.join(d, 'rdocbench')
  args = %W(--root #{srcdir} --page-dir #{srcdir}/doc --encoding=UTF-8 --no-force-update --all --ri --debug --quiet #{srcdir})
  args << '--op' << dir

  r = RDoc::RDoc.new
  r.document args
}
```

Results:

```
# without 'objspace/trace'
real    0m19.764s
user    0m19.200s
sys     0m0.561s

# with 'objspace/trace'
real    0m42.638s
user    0m41.695s
sys     0m0.920s

# with 'objspace/trace' and locindex
real    0m36.875s
user    0m35.956s
sys     0m0.890s

# with 'objspace/trace' light mode
real    0m25.850s
user    0m25.085s
sys     0m0.762s
```

Light mode is only recording "locindex".
I believe that most of case it is enough to see the "file:line" pair for performance tuning.

Implementation: https://github.com/ruby/ruby/pull/4524/
"light-mode" seems more practical.





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

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next