相关文章推荐
爱逃课的李子  ·  list.stream().filter() ...·  1 月前    · 
追风的显示器  ·  C#时区逻辑·  7 月前    · 
逆袭的剪刀  ·  隐秘的 MySQL ...·  1 年前    · 

适用于: .NET Core 2.1、.NET Core 3.1、.NET 5

本文介绍在 Linux 中重现 .NET Core 崩溃问题的过程。 本文还讨论了如何检查 Nginx 工具和系统日志是否出现故障的症状和迹象。

遵循这些故障排除实验室的最低要求是拥有一个 ASP.NET Core应用程序来演示低 CPU 和高 CPU 性能问题。

可在 Internet 上找到多个示例应用程序来实现此目标。 例如,可以下载并设置 Microsoft 的简单 Webapi 示例 ,以演示不良行为。 或者,可以使用 BuggyAmb ASP.NET Core应用程序作为示例项目。

如果已关注此系列的上一部分,则应准备好以下设置:

  • Nginx 配置为托管两个网站:
    • 第一个侦听请求时,使用 myfirstwebsite 主机标头 () http://myfirstwebsite ,并将请求路由到侦听端口 5000 的演示 ASP.NET Core应用程序。
    • 第二个侦听请求,使用 buggyamb 主机标头 ( http://buggyamb ) ,并将请求路由到侦听端口 5001 的第二个 ASP.NET Core示例越野车应用程序。
    • 这两个 ASP.NET Core应用程序都应作为服务运行,这些服务在服务器重启或应用程序停止响应时自动重启。
    • Linux 本地防火墙已启用并配置为允许 SSH 和 HTTP 流量。
    • 如果安装程序尚未准备就绪,请转到“ 第 2 部分创建并运行 ASP.NET Core应用 ”。

      若要继续此实验室,必须至少有一个在 Nginx 后面运行的 web 应用程序 ASP.NET Core有问题。

      此实验室的目标

      本文是两个实验室部分中的第一个。 实验室工作按如下所示进行划分:

    • 第 1 部分:将重现崩溃问题,检查 Nginx 和系统日志以搜索崩溃症状和指示器,然后通过生成故障转储文件进行故障排除。 最后,你将从 Ubuntu 管理器(apport)生成的崩溃报表中收集系统生成的核心转储文件。

    • 第 2 部分 :安装并配置 lldb,以便与名为 SOS 的 .NET Core 调试器扩展协同工作。 你还将在 lldb 中分析转储文件。

      重现崩溃问题

      浏览到网站 URL 并 http://buggyamb/ 选择 “问题页 ”链接时,会看到一些问题方案的链接。 有三种不同的崩溃方案。 但是,对于此实验室,你将仅对第三个崩溃方案进行故障排除。

      在选择任何链接之前,请选择 “预期结果 ”,并验证应用程序是否按预期工作。 应会看到类似于以下内容的输出。

      页面应在不到一秒) 内快速加载 (,并显示产品列表。

      若要测试第一个“慢页”方案,请选择 “慢 ”链接。 该页面最终将显示与“预期结果”页相同的输出,但呈现速度将比预期慢得多。

      在重现崩溃问题之前,请记下越野车应用程序的进程 ID。 你将使用此信息来验证应用程序是否重启。 运行命令 systemctl status buggyamb.service 以获取当前 PID。 在以下结果中,运行服务的进程的 PID 为 2255。

      选择 “崩溃 3 ”链接。 页面加载并显示以下消息:

      此消息要求用户考虑以下问题:此页面是否会导致进程崩溃? 运行相同的 systemctl status buggyamb.service 命令,应该会看到相同的 PID。 这表示未发生崩溃。

      选择 “预期结果 ”,然后选择 “慢 ”。 尽管在选择 “预期结果 ”后应看到正确的页面,但选择 “慢 ”应会生成以下错误消息。

      即使在网页上选择任何其他链接,也会在一段时间内遇到相同的错误。 10-15 秒后,一切将按预期再次开始响应。

      若要检查 PID 是否已更改,请再次运行 systemctl status buggyamb.service 。 这一次,你应该注意到,由于 PID 已更改,进程似乎已经停止。 在前面的示例中,进程 PID 为 2255。 在以下示例中,它已更改为 2943。 显然,该网站兑现了其承诺,崩溃的过程。

      排查重新处理步骤的问题

      下面是重新处理步骤的摘要:

    • 选择 “崩溃 3 ”。 页面加载正确,但返回一条令人困惑的消息,指示进程将崩溃。
    • 选择 “慢 ”。 你会收到“HTTP 502 - 错误网关”错误消息,而不是产品表。
    • 问题启动后,在接下来的 10-15 秒内不会呈现任何页面。
    • 10-15 秒后,应用程序开始正确响应。
    • “HTTP 502 - 错误网关”错误消息本身并不能说明问题。 但是,它应提供第一个线索:这是一个代理错误,如果代理无法与代理后面运行的应用程序通信,则可能会发生该错误。 在建议的设置中,Nginx 充当 ASP.NET Core应用程序的反向代理。 因此,Nginx 中的此错误指示它在转发传入请求时无法访问后端应用程序。

      验证 Nginx 是否正常工作

      在继续之前,可能需要检查 Nginx 是否正常工作。 此步骤不是必需的,因为你知道应用程序正在崩溃。 但是,仍可以通过检查 Nginx 日志来验证 Nginx 的状态。 在前面的 “安装和配置 Nginx” 部分中,你也练习了类似的故障排除步骤。

      Nginx 有两种类型的日志:访问日志和错误日志。 这些存储在文件夹中 /var/log/nginx/

      访问日志与 IIS 日志文件类似。 打开并检查它们,就像在上一部分中所做的那样。 除了在网站页面导航尝试期间遇到的“HTTP 502”响应状态代码之外,日志不会显示任何新信息。

      使用 cat /var/log/nginx/error.log 命令检查错误日志。 此日志更有用且更清晰。 它显示 Nginx 能够处理请求,但在发送最终响应之前,Nginx 与越野应用程序之间的连接已关闭。

      此日志清楚地表明你看到的不是 Nginx 问题。

      使用 journalctl 命令检查系统日志

      如果 ASP.NET Core应用程序崩溃,则症状应出现在某处。

      由于越野车应用程序作为系统服务运行,因此其操作将记录在系统日志文件中。 系统日志文件类似于 Windows 中的系统事件日志。 该 journalctl 命令用于查看和操作系统化日志。

      可以运行命令, journalctl 而无需切换即可查看所有日志。 但是,输出将是一个大文件。 了解如何筛选内容符合你的最佳利益。 例如,可以运行以下命令:

      journalctl -r --identifier=buggyamb-identifier --since "10 minute ago"
      

      以下开关可用:

    • -r:按反向顺序打印日志,以便首先列出最新日志。
    • --identifier:请记住 SyslogIdentifier=buggyamb-identifier 测试应用程序的服务文件中的行。 (可以使用此方法强制日志仅显示适用于有问题的应用程序的条目。)
    • --since:显示在指定的上一时期记录的信息。 示例: --since "10 minute ago"--since "2 hour ago".
    • 对于命令,有几个有用的开关 journalctl 可以帮助你筛选日志。 若要熟悉此命令,我们建议你通过运行 man journalctl来查阅帮助页。

      运行 journalctl -r --identifier=buggyamb-identifier --since today -o cat。 应注意,会生成一些警告消息。

      若要查看详细信息,请使用箭头键向下滚动。 你会发现异常 System.Net.WebException

      如果仔细检查日志,将看到代码文件名和出现问题的行号。 对于此实验室,我们假设此信息不可用。 这是因为,在现实场景中,你可能无法检索此类信息。 因此,目的是通过分析故障转储来继续了解崩溃的原因。

      崩溃后获取核心转储文件

      在进程终止时,请回想一些关键系统行为:

    • 默认情况下,会生成核心转储文件。
    • 核心转储命名为 核心 ,在当前工作文件夹或文件夹中 /var/lib/systemd/coredump 创建。
    • 尽管默认行为是系统生成核心转储文件,但可以覆盖 /proc/sys/kernel/core_pattern 此设置,将生成的核心转储文件直接传送到另一个应用程序。 在本系列的上一部分中使用 Ubuntu 时,你了解到 apport 管理 Ubuntu 中的核心转储文件生成。 该 core_pattern 文件被覆盖以通过管道将核心转储传递到 apport。

      Apport 使用 /var/crash 文件夹来存储其报表文件。 如果检查此文件夹,应会看到崩溃后已生成的文件。

      但是,这不是核心转储文件。 这是一个报表文件,其中包含几条信息以及转储文件。 必须解压缩此文件才能获取核心转储文件。

      在主文件夹下创建转储文件夹。 系统会指示你在其中提取报表。 用于解压缩 apport 报表文件的命令是 apport-unpack。 运行以下命令:

      sudo apport-unpack /var/crash/_usr_share_dotnet_dotnet.33.crash ~/dumps/dotnet

      此命令创建 /dumps 文件夹。 该 apport-unpack 命令将创建 /dumps/dotnet 文件夹。 结果如下。

      ~/dumps/dotnet 文件夹中,应会看到转储文件。 该文件名为 CoreDump,应约为 191 MB。

      提取自动生成的核心转储文件可能是一个繁琐的过程。 在下一个实验室中,你将看到使用 createdump它更容易捕获核心转储文件。

      实验室 1.2 在 lldb 调试器中打开和分析系统生成的核心转储文件,你将了解如何在 lldb 调试器中打开此转储文件以执行快速分析。

  •