Files
pnpm/cspell.json
T
Zoltan Kochan 316ec14c4b fix(worker): size the worker pool by the cgroup CPU quota (#17385)
The worker pool and the default workspaceConcurrency took the CPU count
from os.availableParallelism(), which counts the CPUs in the process's
affinity mask. In a container with a cgroup CPU quota smaller than that
mask, such as a Kubernetes pod with a 4-CPU limit on a 233-CPU node,
pnpm 11 created 232 workers per install, and four concurrent installs
exhausted a 16 GiB memory limit while the workers were still loading.

Node's libuv does try to apply the quota, but its cgroup v1 parser
looks for ":cpu," and keeps "cpuacct:" in the path it builds, so it
never finds the quota file there, and both it and Rust's standard
library give up when the cgroup path from /proc/self/cgroup is not
mounted under /sys/fs/cgroup, as happens with a host cgroup namespace
and a bind-mounted controller.

A new package, `@pnpm/os.available-parallelism`, reads the quota itself:
the smallest limit/period walking from the process's cgroup up to the
hierarchy root, for cgroup v2 (cpu.max) and v1 (cpu.cfs_quota_us and
cpu.cfs_period_us), rounded down and floored at 1 like Rust's
std::thread::available_parallelism, which pnpm 12 already uses. The
cgroup directory is located through /proc/self/mountinfo, which says
which cgroup each mount shows, so a container that sees only its own
cgroup bind-mounted at /sys/fs/cgroup is read correctly; the standard
mount points are the fallback. The worker pool and the config reader's
workspace-concurrency default both use it, so the two stay in step.

pnpm 12 is unaffected: every Rust pool is sized with
std::thread::available_parallelism, which honours the quota.

Closes pnpm/pnpm#17382
2026-10-26 17:20:51 +01:00

587 lines
9.0 KiB
JSON

{
"ignorePaths": [
"**/nodeReleaseKeys.ts",
"**/nodeReleaseKeys.d.ts",
"**/node_release_keys.rs",
"bench-work-env/**",
"target/**",
"vendor/**"
],
"words": [
"abrt",
"adduser",
"adipiscing",
"agentkeepalive",
"agentkeepalive's",
"aliasless",
"amet",
"andreineculau",
"APFS",
"appdata",
"applyq",
"archy",
"argumentless",
"armv",
"AUTHTOKEN",
"autocheckpoint",
"autocompleting",
"autofix",
"autofixed",
"autoinstalled",
"autozoom",
"babek",
"Backblaze",
"badheaders",
"baires",
"basedirs",
"bdist",
"behaviour",
"blabla",
"Bluesky",
"brasileiro",
"bryntum",
"bsdtar",
"btrfs",
"buildx",
"Bunzip",
"cafile",
"cafs",
"camelcase",
"canonicalizer",
"cantopen",
"canva",
"CDPATH",
"cerbos",
"certfile",
"cgroup",
"cgroups",
"chcp",
"chmods",
"clonedeep",
"clonefile",
"cmds",
"Codeberg",
"codegen",
"codeload",
"codenames",
"codesign",
"colorterm",
"compdef",
"COMPREPLY",
"comver",
"confbox",
"cooldown",
"copyfiles",
"corejs",
"corepack",
"corge",
"cowsay",
"cpuacct",
"creatordate",
"Creds",
"cryptiles",
"cves",
"CWORD",
"cwsay",
"cyclonedx",
"cygdrive",
"dashrc",
"deburr",
"dedup",
"denoland",
"denolib",
"dependson",
"deptype",
"desugared",
"desugars",
"devextreme",
"devowl",
"dgimuvys",
"didyoumean",
"dirents",
"dirtyforms",
"diskusage",
"dislink",
"dpkg",
"drivelist",
"duplexify",
"dylint",
"eacces",
"eagain",
"ebadplatform",
"ebusy",
"eexist",
"ehrkoext",
"eintegrity",
"eisdir",
"elifecycle",
"elit",
"embedder",
"embedders",
"emfile",
"enametoolong",
"endgroup",
"endregion",
"eneedauth",
"enoent",
"enotdir",
"enotempty",
"enten",
"eotp",
"eperm",
"epipe",
"erofs",
"errcode",
"errorlevel",
"esac",
"esep",
"etamponi",
"exdev",
"execa",
"execpath",
"exploitability",
"fakehash",
"fastlist",
"fellback",
"fetchings",
"filenamify",
"filesystem",
"filesystems",
"fnpm",
"fnumber",
"foobarqar",
"foofoo",
"footgun",
"forgejo",
"forwardable",
"fsevents",
"fslib",
"fstype",
"gabor",
"garply",
"gcttmf",
"getaddrinfo",
"getattr",
"ghes",
"ghsa",
"ghsas",
"gitdir",
"gitea",
"globalconfig",
"globstar",
"gnueabihf",
"gpgsign",
"grault",
"gruntfile",
"gwhitney",
"gypfile",
"haptics",
"hardlink",
"hardlinked",
"hardlinking",
"hardlinks",
"hashbang",
"hashless",
"highmaps",
"hikljmi",
"hoistable",
"homepath",
"hosters",
"hostnames",
"hotspots",
"htpasswd",
"hyperdrive",
"idempotency",
"imagetools",
"imurmurhash",
"inodes",
"invalidformat",
"ionicons",
"isexe",
"istvan",
"italiano",
"jega",
"jhcg",
"jnbpamcxayl",
"journaled",
"junyi",
"kebabcase",
"kevva",
"keyfile",
"keyid",
"keytype",
"killcb",
"kloc",
"kochan",
"koorchik",
"kshrc",
"kubepods",
"LASTEXITCODE",
"ldid",
"ldni",
"ledgered",
"leniolabs",
"libc",
"libnpmpublish",
"libnpx",
"libpnpm",
"libsql",
"libzip",
"licence",
"licences",
"lifecycles",
"lightningcss",
"linearization",
"linuxstatic",
"localappdata",
"lockfiles",
"loglevel",
"logstream",
"longlink",
"longpaths",
"loong",
"lowlink",
"ltrim",
"luca",
"malloc",
"manylinux",
"martensson",
"maxsockets",
"maxtimeout",
"mdast",
"metacharacter",
"metafile",
"millis",
"mimalloc",
"minioadmin",
"mintimeout",
"mkfifo",
"mksh",
"mmap",
"monorepolint",
"montudor",
"moonrepo",
"mountinfo",
"mountpoint",
"msgpack",
"msgpackr",
"msvc",
"msys",
"MSYSTEM",
"mtimes",
"musleabihf",
"mycomp",
"mycompany",
"myorg",
"mypackage",
"mytoken",
"napi",
"ndjson",
"nerfed",
"newteam",
"newversion",
"nistp",
"NOASSERTION",
"nodepath",
"nodetouch",
"noent",
"nonexec",
"noninjected",
"nonvulnerable",
"noopener",
"nopadding",
"noprofile",
"noproxy",
"norc",
"noreferrer",
"nosystem",
"nothrow",
"npath",
"npmcli",
"npmignore",
"npmjs",
"npmmirror",
"npmrcs",
"npmx",
"ntfs",
"nushell",
"ofjergrg",
"oldteam",
"onclickoutside",
"onstat",
"oomol",
"openharmony",
"openpgp",
"openpyxl",
"ossl",
"outfile",
"overrider",
"packlist",
"packr",
"packument",
"packuments",
"pacquet",
"paralleljs",
"parallelly",
"parseable",
"partialmatch",
"pathext",
"pathsep",
"peeker",
"pegjs",
"pgid",
"pids",
"pidtree",
"pify",
"pinnable",
"pkgid",
"pkgname",
"pkgs",
"plotly",
"plugh",
"pnpmfile",
"pnpmfiles",
"pnpmjs",
"pnpmrc",
"pnpmtest",
"pnpr",
"polyfilling",
"português",
"posix",
"postbuild",
"postconditions",
"postfoo",
"postpack",
"postprepare",
"postpublish",
"postrestart",
"postshrinkwrap",
"poststart",
"poststop",
"posttest",
"postuninstall",
"postversion",
"preact",
"prebuild",
"prefoo",
"prefs",
"preinstall",
"premajor",
"preminor",
"preopens",
"prepatch",
"prepublish",
"prereleases",
"prerestart",
"preshrinkwrap",
"prestart",
"prestop",
"preuninstall",
"preversion",
"prioritizer",
"promisified",
"propfind",
"proxied",
"publickey",
"pwsh",
"pylock",
"pypi",
"pyproject",
"pythonhosted",
"qrcode",
"quux",
"rcompare",
"redownload",
"refclone",
"refetched",
"refetches",
"reflattened",
"reflink",
"reflinked",
"reflinks",
"rehoist",
"rehosted",
"reimagining",
"reka",
"Rekor",
"relinks",
"renderable",
"reparses",
"replit",
"repoint",
"repointing",
"reqheaders",
"rescans",
"rescopable",
"rescope",
"rescoped",
"rescopes",
"rescoping",
"resolv",
"revisioned",
"rimrafed",
"riscv",
"rmgr",
"rpmdevtools",
"rpmlint",
"rsort",
"rstacruz",
"rushstack",
"rustc",
"rustup",
"safecrlf",
"sccache",
"scim",
"scopeless",
"scriptless",
"sdiff",
"searchexclude",
"searchlimit",
"searchopts",
"searchstaleness",
"secp",
"sels",
"semistrict",
"serde",
"serp",
"serverjs",
"setgid",
"SETLOCAL",
"setx",
"shasums",
"sheetjs",
"Sherov",
"shlex",
"shrc",
"SIGPIPE",
"sigstore",
"sindresorhus",
"sirv",
"skopeo",
"SLSA",
"soporan",
"sopts",
"spdxdocs",
"SPDXID",
"sqld",
"srcset",
"ssri",
"stackblitz",
"stacktracey",
"statter",
"stdtype",
"streamsearch",
"stringifying",
"strongconnect",
"subcmd",
"subdep",
"subdependencies",
"subdependency",
"subdeps",
"subdir",
"subdirs",
"subkey",
"subkeys",
"subpkg",
"subresource",
"supercede",
"superopts",
"Swatinem",
"syml",
"symref",
"syncer",
"syscall",
"syscalls",
"sysfs",
"systemroot",
"szia",
"tabtab",
"taffydb",
"taiki",
"tarballtemplate",
"Tarjan",
"taskkill",
"tcsh",
"teambit",
"tempy",
"testcase",
"thesys",
"tlog",
"TLSV",
"toctou",
"todomvc",
"toplevel",
"TOTP",
"triaging",
"tsgo",
"tsparticles",
"turso",
"typecheck",
"typeflag",
"TYPELESS",
"unallowed",
"Unawaited",
"uncacheable",
"unconfigured",
"undeprecate",
"underperformance",
"undispatched",
"undollar",
"unextractable",
"Unincluded",
"uninstallation",
"unmigrated",
"unnest",
"unparseable",
"unproxied",
"unreleasable",
"unreviewed",
"Unseparated",
"unskip",
"unstar",
"untracks",
"unvalidated",
"usecase",
"userconfig",
"userprofile",
"ustar",
"uuidv",
"valign",
"venv",
"versionless",
"virtiofs",
"vuln",
"wabt",
"wafpickle",
"waitpid",
"wakeup",
"wasi",
"wasip",
"wbem",
"webauth",
"webcontainer",
"webdav",
"WIFEXITED",
"windir",
"windowspowershell",
"winst",
"wordbreaks",
"workleap",
"worktree",
"worktrees",
"wrappy",
"wscript",
"wslpath",
"WTERMSIG",
"xattr",
"xattrs",
"xmarw",
"yazl",
"zdotdir",
"zkochan",
"zoli",
"zoltan",
"zstd"
]
}