【问题标题】:dotnet core - Server hangs on Productiondotnet core - 服务器挂起生产
【发布时间】:2019-02-08 23:17:01
【问题描述】:

我们目前在生产环境中运行 dotnet 核心服务器设置时遇到问题。我们在 Bamboo 中发布它并从 AWS linux 服务器运行它,它位于 nginx 反向代理后面。

基本上,每隔几天,我们的 dotnet 核心服务器进程就会静音。它默默地接受并挂起网络请求,甚至默默地忽略我们(更礼貌的)阻止它的尝试。我们已经验证它实际上是通过从服务器内部直接向端口 5000 发送 curl 请求而挂起的 netcore 进程。我们已尽力将生产部署复制到我们的测试环境中,但无法重现此故障模式。

我们使用 NewRelic 监控了服务器,并在它进入故障模式时对其进行了检查。我们无法将此行为与任何显着级别的流量、RAM 使用、CPU 使用或打开文件描述符使用相关联。事实上,这些测量结果似乎都保持在非常合理的水平。

我和我的团队对于什么可能导致我们的服务器挂起,甚至我们接下来可以做些什么来诊断它都有些困惑。 什么可能导致我们的服务器进程挂起?我们可以采取哪些进一步的步骤来诊断问题?

额外信息

我们的 nginx 配置模板:

upstream wfe {
  server 127.0.0.1:5000;
  server 127.0.0.1:5001;
}

server {
  listen 80 default_server;
  location / {
    proxy_set_header Host $http_host;
    proxy_pass http://wfe;
    proxy_read_timeout 20s;

    # Attempting a fix suggested by:
    # https://medium.com/@mshanak/soved-dotnet-core-too-many-open-files-in-system-when-using-postgress-with-entity-framework-c6e30eeff6d1
    proxy_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_cache_bypass $http_upgrade;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
  }
}

我们的Program.cs

using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Net;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;

namespace MyApplication.Presentation
{
    [ExcludeFromCodeCoverage]
    public class Program
    {
        public static void Main(string[] args)
        {
            IWebHost host = WebHost.CreateDefaultBuilder(args)
#if DEBUG
                                   .UseKestrel(options => options.Listen(IPAddress.Any, 5000))
#endif
                                   .UseStartup<Startup>()
                                   .UseSerilog()
                                   .Build();

            host.Run();
        }
    }
}

在我们的 CD 构建过程中,我们发布我们的应用程序以进行部署:

dotnet publish --self-contained -c Release -r linux-x64

然后我们将文件夹bin/Release/netcoreapp2.0/linux-x64 部署到我们的服务器,并从内部运行publish/&lt;our-executable-name&gt;

编辑:dotnet --version 在我们的 CI 平台和生产服务器上输出 2.1.4

当中断开始时,nginx 日志显示服务器对请求的响应从 200 变为 502,在中断时发出一个 504。

与此同时,来自我们服务器进程的日志刚刚停止。那里有警告,但它们都是我们在应用程序代码中放入的明确警告。它们都没有表明已引发任何异常。

【问题讨论】:

  • 您是否在中断期间捕获了任何服务器日志?你的 .NET Core 框架版本是什么?
  • 我们可以通过以下方式获得 502,1)无法连接服务器 2)服务器没有响应 3)超时,所以如果您有 502 的详细日志,请在您的问题中添加。跨度>
  • 另外建议,在你的 stage/qual 环境中重现这个场景,它会帮助你找出真正的根本原因;如果您将应用程序与数据库连接,请确保没有死锁。

标签: nginx .net-core devops


【解决方案1】:

经过几天的调查,我找到了该问题的原因。它是由glibc &gt;= 2.27 引起的,在某些情况下会导致 GC 挂起,因此几乎没有什么可做的。但是,您有几个选择:

  1. 使用 Alpine Linux。它不依赖于glibc
  2. 使用较旧的发行版,如 Debian 9、Ubuntu 16.04 或任何其他带有 glibc &lt; 2.27 的发行版
  3. 尝试自行修补glibc,风险自负:https://sourceware.org/bugzilla/show_bug.cgi?id=25847
  4. 或等待glibc 补丁由社区审核并包含在您最喜欢的发行版中。

更多信息可以在这里找到:https://github.com/dotnet/runtime/issues/47700

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多