【问题标题】:Nancy on Linux is using 100% CPULinux 上的 Nancy 正在使用 100% 的 CPU
【发布时间】:2015-08-12 19:16:57
【问题描述】:

我的 nancy web 应用程序在没有实际使用的情况下占用了 100% 的 CPU。

它们在单声道的 docker 容器内运行。我唯一能想到的就是我的 main 函数中的无限循环,比如

while(Console.ReadLine() != "quit") {}

但我认为,Console.ReadLine() 会阻塞,因此这个循环只会在有输入时执行,而这是不应该有的。艾米我错过了什么? nancy 是否还有其他原因会在单声道中耗尽所有 CPU? - 在开发过程中的 Windows 中,它似乎运行良好。

更新:

docker 中的应用程序只是简单地以mono NancyServer.exe 启动。内存使用比以前的 XPS 基础版本低很多(50-70MB 而不是 160-180MB),但基于 XPS 的应用程序使用的 CPU 不到 0.1%(也没有真正做任何事情)

【问题讨论】:

    标签: linux mono docker nancy


    【解决方案1】:

    如果没有使用-t or -i options,我可以通过在前台启动一个容器来重现非阻塞行为。在这种特殊情况下,Console.ReadLine() 不会阻止。

    如果使用-i-t,则Console.ReadLine 会阻塞。此外,如果我在后台运行容器(使用-d option),Console.ReadLine() 会阻塞。


    如果您在前台运行容器,请确保使用-t-i

    【讨论】:

    • 它在后台运行,我会检查确切的参数并回复您
    • 在所有标志中(-i-t-d)我只设置了-d 而你说,-d Console.ReadLine() 正在阻止你,或者?您是否在 mono 图像之上构建了容器?
    • 我在mono 图像的顶部构建了一个图像,并将您的while 循环合并到this 示例+CMD sh -c "mcs hello.cs && mono hello.exe"
    • 好吧,这很奇怪,因为我也在使用单声道图像,唯一不同的是,我的应用程序在 Visual Studio Online 上编译,我从编译后的代码创建图像(使用 .net 框架在 Windows 中编译)。由于我不需要使用输入文本来停止应用程序,因此我将循环更改为 while (true) { Thread.Sleep(Int32.MaxValue); },这对我现在有效,但非常感谢尝试所有不同的可能性
    • 你可以去掉while循环,直接Thread.Sleep(Timeout.Infinite);
    【解决方案2】:

    高 CPU 负载是由该 while 循环引起的,因为您没有让当前线程在短时间内睡眠。喜欢:

    while(Console.ReadLine() != "quit") {Thread.Sleep(10);}
    

    【讨论】:

    • 但不应该Console.ReadLine 阻止并等到我输入内容? - 这不应该发生。我现在已将其更改为睡眠 Int32.MaxValue(大约 23 天) - 让我们看看这是否真的是问题所在
    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2023-02-22
    相关资源
    最近更新 更多