Project

General

Profile

Feature #19443

Updated by byroot (Jean Boussier) almost 2 years ago

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 

Back