Skip to content

Commit

Permalink
Merge pull request #1410 from 3scale/fix-cpu-detection-cgroupsv2
Browse files Browse the repository at this point in the history
THREESCALE-10167 Fix cpu detection cgroupsv2
  • Loading branch information
eguzki authored Sep 29, 2023
2 parents 362b7b5 + 3c37fe1 commit cff87c9
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 14 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]

### Added

- Detect number of CPU shares when running on Cgroups V2 [PR #1410](https://github.com/3scale/apicast/pull/1410) [THREESCALE-10167](https://issues.redhat.com/browse/THREESCALE-10167)

## [3.14.0] 2023-07-25

### Fixed
Expand Down
44 changes: 30 additions & 14 deletions gateway/src/apicast/cli/environment.lua
Original file line number Diff line number Diff line change
Expand Up @@ -43,36 +43,52 @@ local function parse_nameservers()
end
end

local function detect_kubernetes()
local secrets = open('/run/secrets/kubernetes.io')
-- CPU shares in Cgroups v1 or converted from weight in Cgroups v2 in millicores
local function cpu_shares()
local shares

if secrets then secrets:close() end
-- This check is from https://github.com/kubernetes/kubernetes/blob/release-1.27/test/e2e/node/pod_resize.go#L305-L314
-- alternatively, this method can be used: https://kubernetes.io/docs/concepts/architecture/cgroups/#check-cgroup-version
-- (`stat -fc %T /sys/fs/cgroup/` returns `cgroup2fs` or `tmpfs`)
if pl_path.exists("/sys/fs/cgroup/cgroup.controllers") then
-- Cgroups v2
ngx.log(ngx.DEBUG, "detecting cpus in Cgroups v2")
-- Using the formula from https://github.com/kubernetes/kubernetes/blob/release-1.27/pkg/kubelet/cm/cgroup_manager_linux.go#L570-L574
local file = open('/sys/fs/cgroup/cpu.weight')

return secrets or resty_env.value('KUBERNETES_PORT')
end

local function cpu_shares()
if not detect_kubernetes() then return end
if file then
local weight = file:read('*n')
file:close()

local shares
local file = open('/sys/fs/cgroup/cpu/cpu.shares')
shares = (((weight - 1) * 262142) / 9999) + 2
end
else
-- Cgroups v1
ngx.log(ngx.DEBUG, "detecting cpus in Cgroups v1")
local file = open('/sys/fs/cgroup/cpu/cpu.shares')

if file then
shares = file:read('*n')
if file then
shares = file:read('*n')

file:close()
file:close()
end
end

return shares
end

local function cpus()
local shares = cpu_shares()
if shares then return ceil(shares / 1024) end
if shares then
local res = ceil(shares / 1024)
ngx.log(ngx.DEBUG, "cpu_shares = "..res)
return res
end

-- TODO: support /sys/fs/cgroup/cpuset/cpuset.cpus
-- see https://github.com/sclorg/rhscl-dockerfiles/blob/ff912d8764af9a41096e63064bbc325395afa608/rhel7.sti-base/bin/cgroup-limits#L55-L75
local nproc = util.system('nproc')
ngx.log(ngx.DEBUG, "cpus from nproc = "..nproc)
return tonumber(nproc)
end

Expand Down

0 comments on commit cff87c9

Please sign in to comment.