Skip to content

Commit 88e6a92

Browse files
availableCores(): query CGroups cpuset.cpus and cpuset.cpus.effective [#141]
1 parent 8b2e8fd commit 88e6a92

File tree

5 files changed

+44
-6
lines changed

5 files changed

+44
-6
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: parallelly
2-
Version: 1.46.1-9014
2+
Version: 1.46.1-9015
33
Title: Enhancing the 'parallel' Package
44
Imports:
55
parallel,

NEWS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
## New Features
44

55
* Give more information on invalid 'RichSOCKnode' connections.
6+
7+
* Now `availableCores()` queries also Linux CGroups v2 CPU affinity
8+
values `cpuset.cpus` and `cpuset.cpus.effective`.`
69

710
## Bug Fixes
811

R/availableCores.R

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@
6161
#' On Unix, query control group (cgroup v1) _quota_ value
6262
#' \code{cpu.cfs_quota_us} / \code{cpu.cfs_period_us}.
6363
#'
64+
#' \item `"cgroups2.cpuset.cpus"` -
65+
#' On Unix, query control group (cgroup v2) _affinity_ value
66+
#' \code{cpuset.cpus}.
67+
#'
68+
#' \item `"cgroups2.cpuset.cpus.effective"` -
69+
#' On Unix, query control group (cgroup v2) _effective affinity_ value
70+
#' \code{cpuset.cpus.effective}.
71+
#'
6472
#' \item `"cgroups2.cpu.max"` -
6573
#' On Unix, query control group (cgroup v2) _quota_ value \code{cpu.max}.
6674
#'
@@ -268,7 +276,7 @@
268276
#'
269277
#' @importFrom parallel detectCores
270278
#' @export
271-
availableCores <- function(constraints = NULL, methods = getOption2("parallelly.availableCores.methods", c("system", "/proc/self/status", "cgroups.cpuset", "cgroups.cpuquota", "cgroups2.cpu.max", "nproc", "mc.cores", "BiocParallel", "_R_CHECK_LIMIT_CORES_", "Bioconductor", "LSF", "PJM", "PBS", "SGE", "Slurm", "fallback", "custom")), na.rm = TRUE, logical = getOption2("parallelly.availableCores.logical", TRUE), default = c(current = 1L), which = c("min", "max", "all"), omit = getOption2("parallelly.availableCores.omit", 0L), max = getOption2("parallelly.availableCores.max", Inf)) {
279+
availableCores <- function(constraints = NULL, methods = getOption2("parallelly.availableCores.methods", c("system", "/proc/self/status", "cgroups.cpuset", "cgroups.cpuquota", "cgroups2.cpuset.cpus", "cgroups2.cpuset.cpus.effective", "cgroups2.cpu.max", "nproc", "mc.cores", "BiocParallel", "_R_CHECK_LIMIT_CORES_", "Bioconductor", "LSF", "PJM", "PBS", "SGE", "Slurm", "fallback", "custom")), na.rm = TRUE, logical = getOption2("parallelly.availableCores.logical", TRUE), default = c(current = 1L), which = c("min", "max", "all"), omit = getOption2("parallelly.availableCores.omit", 0L), max = getOption2("parallelly.availableCores.max", Inf)) {
272280
stop_if_not(
273281
is.null(constraints) || is.character(constraints), !anyNA(constraints)
274282
)
@@ -373,6 +381,14 @@ availableCores <- function(constraints = NULL, methods = getOption2("parallelly.
373381
n <- as.integer(floor(n + 0.5))
374382
if (n == 0L) n <- 1L ## If CPU quota < 0.5, round up to one CPU
375383
}
384+
} else if (method == "cgroups2.cpuset.cpus") {
385+
## Number of cores according to Unix cgroups v2 CPU set
386+
n <- length(getCGroups2CpuSet("cpuset.cpus"))
387+
if (n == 0L) n <- NA_integer_
388+
} else if (method == "cgroups2.cpuset.cpus.effective") {
389+
## Number of cores according to Unix cgroups v2 effective CPU set
390+
n <- length(getCGroups2CpuSet("cpuset.cpus.effective"))
391+
if (n == 0L) n <- NA_integer_
376392
} else if (method == "cgroups2.cpu.max") {
377393
## Number of cores according to Unix cgroups v2 CPU max quota
378394
n <- getCGroups2CpuMax()
@@ -436,7 +452,7 @@ availableCores <- function(constraints = NULL, methods = getOption2("parallelly.
436452
idx_fallback <- which(names(ncores) == "fallback")
437453
if (length(idx_fallback) == 1) {
438454
## Use 'fallback' if and only there are only "special" options specified
439-
special <- c("system", "/proc/self/status", "cgroups.cpuset", "cgroups.cpuquota", "cgroups2.cpu.max", "nproc")
455+
special <- c("system", "/proc/self/status", "cgroups.cpuset", "cgroups.cpuquota", "cgroups2.cpuset.cpus", "cgroups2.cpuset.cpus.effective", "cgroups2.cpu.max", "nproc")
440456
## 'connections' and 'connections-N' are also "special" options
441457
special <- c(special, grep(pattern_connections, constraints, value = TRUE))
442458
others <- setdiff(names(ncores), c("fallback", special))

inst/testme/test-cgroups.R

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,16 @@ stopifnot(
150150
is.na(value) || value > 0
151151
)
152152

153+
message("- availableCores(methods = 'cgroups2.cpuset.cpus')")
154+
n <- availableCores(methods = "cgroups2.cpuset.cpus", na.rm = FALSE)
155+
cat(sprintf("Number of cores: %s\n", n))
156+
stopifnot(length(n) == 1L, is.integer(n), is.na(n) || n >= 1L)
157+
158+
message("- availableCores(methods = 'cgroups2.cpuset.cpus.effective')")
159+
n <- availableCores(methods = "cgroups2.cpuset.cpus.effective", na.rm = FALSE)
160+
cat(sprintf("Number of cores: %s\n", n))
161+
stopifnot(length(n) == 1L, is.integer(n), is.na(n) || n >= 1L)
162+
153163
message("*** cgroups ... DONE")
154164

155165
root <- system.file(package = "parallelly", "test-data", mustWork = TRUE)

man/availableCores.Rd

Lines changed: 12 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)