diff --git a/src/unix/linux.c b/src/unix/linux.c index e98f3811c..5f37a2ae2 100644 --- a/src/unix/linux.c +++ b/src/unix/linux.c @@ -1867,10 +1867,19 @@ nocpuinfo: continue; n++; + /* Prefer cpuinfo_cur_freq: it reads a hardware-cached value and avoids + * slow ACPI/SMM round-trips that scaling_cur_freq triggers on some AMD + * CPUs (especially inside containers), which can take ~20ms per core. + * Fall back to scaling_cur_freq when cpuinfo_cur_freq is not available. + */ snprintf(buf, sizeof(buf), - "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq", cpu); - + "/sys/devices/system/cpu/cpu%u/cpufreq/cpuinfo_cur_freq", cpu); fp = uv__open_file(buf); + if (fp == NULL) { + snprintf(buf, sizeof(buf), + "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq", cpu); + fp = uv__open_file(buf); + } if (fp == NULL) continue;