mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-29 11:02:08 +00:00
Merge pull request #50379 from alekar/minor-cgroup-improvements
Minor improvements in CGroup awareness.
This commit is contained in:
commit
f1eba08eaf
@ -28,14 +28,28 @@ uint64_t getMemoryAmountOrZero()
|
|||||||
|
|
||||||
#if defined(OS_LINUX)
|
#if defined(OS_LINUX)
|
||||||
// Try to lookup at the Cgroup limit
|
// Try to lookup at the Cgroup limit
|
||||||
std::ifstream cgroup_limit("/sys/fs/cgroup/memory/memory.limit_in_bytes");
|
|
||||||
if (cgroup_limit.is_open())
|
// CGroups v2
|
||||||
|
std::ifstream cgroupv2_limit("/sys/fs/cgroup/memory.max");
|
||||||
|
if (cgroupv2_limit.is_open())
|
||||||
{
|
{
|
||||||
uint64_t memory_limit = 0; // in case of read error
|
uint64_t memory_limit = 0;
|
||||||
cgroup_limit >> memory_limit;
|
cgroupv2_limit >> memory_limit;
|
||||||
if (memory_limit > 0 && memory_limit < memory_amount)
|
if (memory_limit > 0 && memory_limit < memory_amount)
|
||||||
memory_amount = memory_limit;
|
memory_amount = memory_limit;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// CGroups v1
|
||||||
|
std::ifstream cgroup_limit("/sys/fs/cgroup/memory/memory.limit_in_bytes");
|
||||||
|
if (cgroup_limit.is_open())
|
||||||
|
{
|
||||||
|
uint64_t memory_limit = 0; // in case of read error
|
||||||
|
cgroup_limit >> memory_limit;
|
||||||
|
if (memory_limit > 0 && memory_limit < memory_amount)
|
||||||
|
memory_amount = memory_limit;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return memory_amount;
|
return memory_amount;
|
||||||
|
@ -69,13 +69,23 @@ AsynchronousMetrics::AsynchronousMetrics(
|
|||||||
|
|
||||||
/// CGroups v2
|
/// CGroups v2
|
||||||
openFileIfExists("/sys/fs/cgroup/memory.max", cgroupmem_limit_in_bytes);
|
openFileIfExists("/sys/fs/cgroup/memory.max", cgroupmem_limit_in_bytes);
|
||||||
openFileIfExists("/sys/fs/cgroup/memory.current", cgroupmem_usage_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
|
/// CGroups v1
|
||||||
if (!cgroupmem_limit_in_bytes)
|
if (!cgroupmem_limit_in_bytes)
|
||||||
|
{
|
||||||
openFileIfExists("/sys/fs/cgroup/memory/memory.limit_in_bytes", 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);
|
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();
|
openSensors();
|
||||||
openBlockDevices();
|
openBlockDevices();
|
||||||
@ -926,6 +936,61 @@ void AsynchronousMetrics::update(TimePoint update_time)
|
|||||||
tryLogCurrentException(__PRETTY_FUNCTION__);
|
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)
|
if (meminfo)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -110,6 +110,9 @@ private:
|
|||||||
|
|
||||||
std::optional<ReadBufferFromFilePRead> cgroupmem_limit_in_bytes;
|
std::optional<ReadBufferFromFilePRead> cgroupmem_limit_in_bytes;
|
||||||
std::optional<ReadBufferFromFilePRead> cgroupmem_usage_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;
|
std::vector<std::unique_ptr<ReadBufferFromFilePRead>> thermal;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user