【发布时间】: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/<our-executable-name>。
编辑:dotnet --version 在我们的 CI 平台和生产服务器上输出 2.1.4。
当中断开始时,nginx 日志显示服务器对请求的响应从 200 变为 502,在中断时发出一个 504。
与此同时,来自我们服务器进程的日志刚刚停止。那里有警告,但它们都是我们在应用程序代码中放入的明确警告。它们都没有表明已引发任何异常。
【问题讨论】:
-
您是否在中断期间捕获了任何服务器日志?你的 .NET Core 框架版本是什么?
-
我们可以通过以下方式获得 502,1)无法连接服务器 2)服务器没有响应 3)超时,所以如果您有 502 的详细日志,请在您的问题中添加。跨度>
-
另外建议,在你的 stage/qual 环境中重现这个场景,它会帮助你找出真正的根本原因;如果您将应用程序与数据库连接,请确保没有死锁。