mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 07:31:57 +00:00
Merge pull request #50379 from alekar/minor-cgroup-improvements
Minor improvements in CGroup awareness.
This commit is contained in:
commit
f1eba08eaf
@ -28,6 +28,19 @@ uint64_t getMemoryAmountOrZero()
|
||||
|
||||
#if defined(OS_LINUX)
|
||||
// Try to lookup at the Cgroup limit
|
||||
|
||||
// CGroups v2
|
||||
std::ifstream cgroupv2_limit("/sys/fs/cgroup/memory.max");
|
||||
if (cgroupv2_limit.is_open())
|
||||
{
|
||||
uint64_t memory_limit = 0;
|
||||
cgroupv2_limit >> memory_limit;
|
||||
if (memory_limit > 0 && memory_limit < memory_amount)
|
||||
memory_amount = memory_limit;
|
||||
}
|
||||
else
|
||||
{
|
||||
// CGroups v1
|
||||
std::ifstream cgroup_limit("/sys/fs/cgroup/memory/memory.limit_in_bytes");
|
||||
if (cgroup_limit.is_open())
|
||||
{
|
||||
@ -36,6 +49,7 @@ uint64_t getMemoryAmountOrZero()
|
||||
if (memory_limit > 0 && memory_limit < memory_amount)
|
||||
memory_amount = memory_limit;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return memory_amount;
|
||||
|
@ -69,13 +69,23 @@ AsynchronousMetrics::AsynchronousMetrics(
|
||||
|
||||
/// CGroups v2
|
||||
openFileIfExists("/sys/fs/cgroup/memory.max", cgroupmem_limit_in_bytes);
|
||||
if (cgroupmem_limit_in_bytes)
|
||||
{
|
||||
openFileIfExists("/sys/fs/cgroup/memory.current", cgroupmem_usage_in_bytes);
|
||||
}
|
||||
openFileIfExists("/sys/fs/cgroup/cpu.max", cgroupcpu_max);
|
||||
|
||||
/// CGroups v1
|
||||
if (!cgroupmem_limit_in_bytes)
|
||||
{
|
||||
openFileIfExists("/sys/fs/cgroup/memory/memory.limit_in_bytes", cgroupmem_limit_in_bytes);
|
||||
if (!cgroupmem_usage_in_bytes)
|
||||
openFileIfExists("/sys/fs/cgroup/memory/memory.usage_in_bytes", cgroupmem_usage_in_bytes);
|
||||
}
|
||||
if (!cgroupcpu_max)
|
||||
{
|
||||
openFileIfExists("/sys/fs/cgroup/cpu/cpu.cfs_period_us", cgroupcpu_cfs_period);
|
||||
openFileIfExists("/sys/fs/cgroup/cpu/cpu.cfs_quota_us", cgroupcpu_cfs_quota);
|
||||
}
|
||||
|
||||
openSensors();
|
||||
openBlockDevices();
|
||||
@ -926,6 +936,61 @@ void AsynchronousMetrics::update(TimePoint update_time)
|
||||
tryLogCurrentException(__PRETTY_FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
if (cgroupcpu_max)
|
||||
{
|
||||
try {
|
||||
cgroupcpu_max->rewind();
|
||||
|
||||
uint64_t quota = 0;
|
||||
uint64_t period = 0;
|
||||
|
||||
std::string line;
|
||||
readText(line, *cgroupcpu_max);
|
||||
|
||||
auto space = line.find(' ');
|
||||
|
||||
if (line.rfind("max", space) == std::string::npos)
|
||||
{
|
||||
auto field1 = line.substr(0, space);
|
||||
quota = std::stoull(field1);
|
||||
}
|
||||
|
||||
if (space != std::string::npos)
|
||||
{
|
||||
auto field2 = line.substr(space + 1);
|
||||
period = std::stoull(field2);
|
||||
}
|
||||
|
||||
new_values["CGroupCpuCfsPeriod"] = { period, "The CFS period of CPU cgroup."};
|
||||
new_values["CGroupCpuCfsQuota"] = { quota, "The CFS quota of CPU cgroup. If stated zero, the quota is max."};
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
tryLogCurrentException(__PRETTY_FUNCTION__);
|
||||
}
|
||||
}
|
||||
else if (cgroupcpu_cfs_quota && cgroupcpu_cfs_period)
|
||||
{
|
||||
try {
|
||||
cgroupcpu_cfs_quota->rewind();
|
||||
cgroupcpu_cfs_period->rewind();
|
||||
|
||||
uint64_t quota = 0;
|
||||
uint64_t period = 0;
|
||||
|
||||
tryReadText(quota, *cgroupcpu_cfs_quota);
|
||||
tryReadText(period, *cgroupcpu_cfs_period);
|
||||
|
||||
new_values["CGroupCpuCfsPeriod"] = { period, "The CFS period of CPU cgroup."};
|
||||
new_values["CGroupCpuCfsQuota"] = { quota, "The CFS quota of CPU cgroup. If stated zero, the quota is max."};
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
tryLogCurrentException(__PRETTY_FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
if (meminfo)
|
||||
{
|
||||
try
|
||||
|
@ -110,6 +110,9 @@ private:
|
||||
|
||||
std::optional<ReadBufferFromFilePRead> cgroupmem_limit_in_bytes;
|
||||
std::optional<ReadBufferFromFilePRead> cgroupmem_usage_in_bytes;
|
||||
std::optional<ReadBufferFromFilePRead> cgroupcpu_cfs_period;
|
||||
std::optional<ReadBufferFromFilePRead> cgroupcpu_cfs_quota;
|
||||
std::optional<ReadBufferFromFilePRead> cgroupcpu_max;
|
||||
|
||||
std::vector<std::unique_ptr<ReadBufferFromFilePRead>> thermal;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user