我正在运行一个提供服务的 C++ 程序,并注意到即使不提供任何请求,它也会占用 100% 的 CPU。我将问题缩小到一个 while 循环,该循环调用
std::sleep_for
以防止服务退出。
为了测试,我编译并运行了这个简单的测试程序:
#include <chrono>
#include <thread>
int main(int argc, char * argv[])
{
std::this_thread::sleep_for(std::chrono::hours::max());
}
我的预期是它会休眠很长时间,事实上,当我在 M1 Mac 上尝试它时,我看到了预期的行为。然而,当我在 Redhat Linux 8 机器上运行它时,它立即返回。我还在 Mac 上运行的 Rocky Linux 8 docker 容器上进行了尝试,这也立即返回。这证实了这种情况通常发生在 RHEL 8 系统上 - 或者至少在 gcc 8.5.0 上发生,因为两个 Linux 系统上的编译器版本是相同的(Mac 上的编译器是 Apple 提供的 clang)。
这解释了为什么我的服务占用了 100% 的 CPU,因为它是在 while 循环中调用它的。但我从未听说过这种行为。还有人吗?
当然,睡个
std::chrono::seconds(1)
就可以轻松解决问题。我只是出于求知欲才问这个问题。
这是 libstdc++ 中的一个错误 https://godbolt.org/z/vce44vjx5,看起来像是溢出。
它内联
nanossleep()
调用
timespec req{ -3600, 0 }; // -1 hour.
main: # @main
push rbx
sub rsp, 16
mov qword ptr [rsp], -3600
mov qword ptr [rsp + 8], 0
mov rbx, rsp
.LBB0_1: # =>This Inner Loop Header: Depth=1
mov rdi, rbx
mov rsi, rbx
call nanosleep@PLT