Use cgroup.kill to quickly kill cgroups

This commit is contained in:
Eelco Dolstra 2022-11-18 16:59:36 +01:00
parent fa68eb367e
commit e6b71f84a0

View file

@ -35,9 +35,19 @@ static CgroupStats destroyCgroup(const Path & cgroup, bool returnStats)
{ {
if (!pathExists(cgroup)) return {}; if (!pathExists(cgroup)) return {};
if (!pathExists(cgroup + "/cgroup.procs")) auto procsFile = cgroup + "/cgroup.procs";
if (!pathExists(procsFile))
throw Error("'%s' is not a cgroup", cgroup); throw Error("'%s' is not a cgroup", cgroup);
/* Use the fast way to kill every process in a cgroup, if
available. */
auto killFile = cgroup + "/cgroup.kill";
if (pathExists(killFile))
writeFile(killFile, "1");
/* Otherwise, manually kill every process in the subcgroups and
this cgroup. */
for (auto & entry : readDirectory(cgroup)) { for (auto & entry : readDirectory(cgroup)) {
if (entry.type != DT_DIR) continue; if (entry.type != DT_DIR) continue;
destroyCgroup(cgroup + "/" + entry.name, false); destroyCgroup(cgroup + "/" + entry.name, false);
@ -48,7 +58,7 @@ static CgroupStats destroyCgroup(const Path & cgroup, bool returnStats)
std::unordered_set<pid_t> pidsShown; std::unordered_set<pid_t> pidsShown;
while (true) { while (true) {
auto pids = tokenizeString<std::vector<std::string>>(readFile(cgroup + "/cgroup.procs")); auto pids = tokenizeString<std::vector<std::string>>(readFile(procsFile));
if (pids.empty()) break; if (pids.empty()) break;