LXC: Limit CPU count to what is given in /proc/cpuinfo despite the container seeing the real host CPUs

This commit is contained in:
Daniel Lange 2022-05-04 18:21:41 +02:00
parent c7413fd677
commit 0d53245cf9
2 changed files with 31 additions and 1 deletions

View File

@ -166,6 +166,28 @@ static void LinuxProcessList_initNetlinkSocket(LinuxProcessList* this) {
#endif #endif
static unsigned int scanAvailableCPUsFromCPUinfo(LinuxProcessList* this) {
FILE* file = fopen(PROCCPUINFOFILE, "r");
if (file == NULL)
return this->super.existingCPUs;
unsigned int availableCPUs = 0;
while (!feof(file)) {
char buffer[PROC_LINE_LENGTH];
if (fgets(buffer, PROC_LINE_LENGTH, file) == NULL)
break;
if (String_startsWith(buffer, "processor"))
availableCPUs++;
}
fclose(file);
return availableCPUs ? availableCPUs : 1;
}
static void LinuxProcessList_updateCPUcount(ProcessList* super) { static void LinuxProcessList_updateCPUcount(ProcessList* super) {
/* Similar to get_nprocs_conf(3) / _SC_NPROCESSORS_CONF /* Similar to get_nprocs_conf(3) / _SC_NPROCESSORS_CONF
* https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/getsysstats.c;hb=HEAD * https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/getsysstats.c;hb=HEAD
@ -240,6 +262,12 @@ static void LinuxProcessList_updateCPUcount(ProcessList* super) {
if (existing < 1) if (existing < 1)
return; return;
if (Running_containerized) {
/* LXC munges /proc/cpuinfo but not the /sys/devices/system/cpu/ files,
* so limit the visible CPUs to what the guest has been configured to see: */
currExisting = scanAvailableCPUsFromCPUinfo(this);
}
#ifdef HAVE_SENSORS_SENSORS_H #ifdef HAVE_SENSORS_SENSORS_H
/* When started with offline CPUs, libsensors does not monitor those, /* When started with offline CPUs, libsensors does not monitor those,
* even when they become online. */ * even when they become online. */
@ -248,7 +276,7 @@ static void LinuxProcessList_updateCPUcount(ProcessList* super) {
#endif #endif
super->activeCPUs = active; super->activeCPUs = active;
assert(existing == currExisting); assert(Running_containerized || (existing == currExisting));
super->existingCPUs = currExisting; super->existingCPUs = currExisting;
} }

View File

@ -51,6 +51,8 @@ extern const MeterClass* const Platform_meterTypes[];
bool Platform_init(void); bool Platform_init(void);
void Platform_done(void); void Platform_done(void);
extern bool Running_containerized;
void Platform_setBindings(Htop_Action* keys); void Platform_setBindings(Htop_Action* keys);
int Platform_getUptime(void); int Platform_getUptime(void);