From: "byroot (Jean Boussier) via ruby-core" <ruby-core@...>
Date: 2023-02-22T08:03:11+00:00
Subject: [ruby-core:112531] [Ruby master Feature#19443] Cache `Process.pid`

Issue #19443 has been updated by byroot (Jean Boussier).


> How to read comment #7 results?

It's a flat reduction on our latency (server response time) metrics.

On average, with the pid_cache shim, our server response time is 2 milliseconds faster.

Also to note, we're still seeing quite a lot of `getpid()` syscalls coming from dependencies using `$$`, and from some C extensions. So hopefully https://github.com/ruby/ruby/pull/7326 would be even more effective.



----------------------------------------
Feature #19443: Cache `Process.pid`
https://bugs.ruby-lang.org/issues/19443#change-101981

* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
----------------------------------------
It's not uncommon for database client and similar network libraries to protect themselves from Process.fork by regularly checking Process.pid

Until recently most libc would cache `getpid()` so this was a cheap check to make.

However as of glibc version 2.25 the PID cache is removed and calls to `getpid()` always invoke the actual system call which significantly degrades the performance of existing applications.

The reason glibc removed the cache is that some libraries were bypassing `fork(2)` by issuing system calls themselves, causing stale cache issues.

That isn't a concern for Ruby as bypassing MRI's primitive for forking would render the VM unusable, so we can safely cache the PID.

An example of the issue: https://github.com/rails/rails/issues/47418


Patch: https://github.com/ruby/ruby/pull/7326



-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/