Issue #21797 has been updated by byroot (Jean Boussier). So first, I must say I agree this is a common problem with the advent of containers. Both Rails and Puma tried to have automatic detection and configuration of the number of worker processes, and it caused issue for users on various platform (mostly Heroku). That's how I ended up implementing the feature in `concurrent-ruby`. Unfortunately there was still some platforms (mostly Heroku) that did not expose cgroup informations to users (or using a mecanism other than cgroups? unclear). But perfect shouldn't be the enemy of good. If this became a first class Ruby feature, I'm sure more platforms would expose the info.
Changing the behavior of Etc.nprocessors to respect cgroup-based values
What would be the value of `nprocessor` in this case?, e.g. if `cpu_quota`is `0.5`, what does `nprocessors` return? `cpu_quota.ceil`?
Which is preferred: pure Ruby as a part of ruby/etc or C?
It's much easier implemented and maintained in Ruby. You can basically rip most of the code from `concurrent-ruby`. ---------------------------------------- Feature #21797: Make Etc.nprocessors cgroup-aware on Linux https://bugs.ruby-lang.org/issues/21797#change-115860 * Author: moznion (Taiki Kawakami) * Status: Open ---------------------------------------- Currently, `Etc.nprocessors` ignores cgroup CPU quotas. This causes issues in containers where CPU limits differ from the host CPU count. I have written a gem for this purpose (https://github.com/moznion/maxprocs-ruby), but it would be preferable if the Ruby core implementation respected cgroup configuration. Additionally, concurrent-ruby provides similar functionality, but if the language itself offered this capability, language users would not need to implement it individually. And some parts of the Ruby language handle the number of processors using hard-coded values (e.g., https://github.com/ruby/ruby/blob/8efaf5e6b6a25e0d237f3d71b75865661ae98268/t...), so this could also be useful for Ruby language development. Extending `Etc.nprocessors` to respect cgroups is one option, but that would be a breaking change, so adding a new API (e.g., `Etc.cpu_quota` or something?) might be a better approach. ## Prior Art - Go 1.25: runtime GOMAXPROCS (Issue [#73193](https://github.com/golang/go/issues/73193)) - [uber-go/automaxprocs](https://github.com/uber-go/automaxprocs) - [concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby): https://github.com/ruby-concurrency/concurrent-ruby/blob/129cf004294af68ac53... -- https://bugs.ruby-lang.org/