需要帮助对 linux Docker 中的 .NET Core 2.1 API 进行故障排除

Posted

技术标签:

【中文标题】需要帮助对 linux Docker 中的 .NET Core 2.1 API 进行故障排除【英文标题】:Need help troubleshooting a .NET Core 2.1 API in a linux Docker 【发布时间】:2019-03-22 06:00:09 【问题描述】:

我们在 AWS ECS 上的 Linux Docker 中运行的 API 遇到了不好的情况。 API 现在在 ASP.NET Core 2.1 上运行,但我们在 ASP.NET 2.0 上也遇到了问题(我们希望升级到 2.1 可以解决它,但它没有)。

问题:容器经常被退出代码 139 杀死。从我目前的研究中收集到的信息,这意味着 SIGSEGV 错误或分段错误。如果应用程序试图访问它无权访问的内存部分,通常会抛出此错误。

我不希望托管代码会发生这样的事情,但它可能是触发这种情况的框架中的库或较低级别的函数。

我们配置了中间件,用于在 API 中记录未处理的异常,但发生这种情况时我们没有得到任何日志。这意味着我们没有太多工作可以解决这个问题。

我知道这里没有太多事情要做,所以我基本上是在寻找方法来了解问题可能是什么。

也许我可以在它崩溃时进行内存转储? - 或者以某种方式从 Docker 或 ECS 获取更多详细信息?

非常感谢任何建议!

更新

这里的一位站点可靠性工程师能够对此进行更多分析。他确定了两种类型的段错误会杀死容器:

ip-10-50-128-175 内核:[336491.431816] 陷阱:dotnet[14200] 一般保护 ip:7f7e14fc2529 sp:7f7b41ff8080 错误:0 in libc-2.24.so[7f7e14f8e000+195000]

ip-10-50-128-219 内核:[481011.825532] dotnet[31035]: segfault at 0 ip (null) sp 00007f50897f7658 error 14 in dotnet[400000+18000]

虽然我不确定这是什么意思,但我想我会把它放在这里以防有人得到提示

更新 2

因此,我们还无法确定问题的根本原因,但我们通过阻止我们的一项内部服务大量调用其中一个端点来缓解崩溃的 API。我们基本上复制了内部服务中的逻辑来测试崩溃是否停止,并且它们确实停止了。 这不是一个非常令人满意的解决方案,它不会真正帮助其他遇到此问题的人,但至少我们的 API 在整个黑色星期五和网络星期一是稳定的 :)

【问题讨论】:

如果您依赖任何非托管代码,请先查看那里。 您能否确认当您的代码在 docker 之外时不会发生这种情况,以便您可以确定这是 docker 问题还是与您的代码有关? 您是否尝试过记录跟踪并查看在记录停止之前到底发生了什么? 如何启用故障转储存储docs.microsoft.com/en-us/windows/desktop/wer/… ?如果你得到了这些,那么你可以在 VS 中打开它们并进行调试。但是您应该启用调试信息,以查看您的程序在哪里。 有一个similar situation here。该文档提到在不记录的情况下运行 docker 以查看是否是这样... 【参考方案1】:

我可以找到与段错误相关的哪些信息表明,正如您所说,某些东西正试图访问它被拒绝访问的内存。这似乎是 nlog。

尝试强制将特定于 microsoft 的日志记录为警告而不是异常,并查看该问题是否仍然存在:

将 MEL-config 更改为:

"Logging": 
  "LogLevel": 
    "Default": "Information",
    "Microsoft.AspNetCore.Hosting": "Warning",
    "Microsoft.AspNetCore.Infrastructure": "Warning",
    "Microsoft.AspNetCore.Routing": "Warning",
    "Microsoft.AspNetCore.Mvc": "Warning"
 

或者作为最后的努力,这个:

"Logging": 
  "LogLevel": 
    "Default": "Information",
    "Microsoft.AspNetCore": "Warning"
 

如果它们不能解决您的问题,它们都不会伤害任何东西并且很容易逆转。

如果成功,这听起来像是在 Mono 中使用的 .NET Core 2 的当前实现存在错误。如果可能的话,我会在最新的 .NET 核心版本中对其进行测试,如果它仍然存在,它已经存在多个版本,我会向 Mono 提交错误报告,看看他们是否会处理它,或者至少指出你报告的正确方向。

【讨论】:

感谢您的建议。我不再与遇到此问题的公司合作,因此无法对其进行任何实验 @SørenPedersen 啊,真遗憾,我确信这会解决问题并给我第一个选择的问题答案哈哈。祝你在未来的事业中好运。

以上是关于需要帮助对 linux Docker 中的 .NET Core 2.1 API 进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

CentOS7安装Docker

Docker最全教程——从理论到实战

云原生之Docker实战使用Docker部署Linux系统监控平台Netdata

Linux下如何停止docker

006.Docker网络管理

Zabbix 监控 docker容器 提示权限不够的问题