ASP.NET Core奇遇记:无用户访问,CPU却一直100%

这是5月11日遇到的一个问题,1台1核1G阿里云Linux服务器运行着生产环境中的ASP.NET Core站点,出现CPU 100%问题。

开始以为是这台服务器负载高引起的,于是将这台服务器从负载均衡上摘下来。这时奇怪的事情发生了,即使没有负载(无用户访问),CPU也在接近100%范围波动。

用htop命令查看,也没看到哪个进程占用CPU特别多。

以为是阿里云服务器的问题,向阿里云提交了工单,阿里云客服分析后发现其中的一个进程(我们的一个ASP.NET Core站点)占用资源比较多,而且对资源的占用频繁变动。

看来问题与这个ASP.NET Core站点有关,这时发现另外一个奇怪的地方——虽然监控显示CPU占用一直接近100%,但这台服务器上的其他ASP.NET Core站点都能正常运行(有正常的负载),不像以前遇到的各种CPU 100%情况。

于是查看这个ASP.NET Core站点的日志,发现下面的error log:

---> System.Net.Sockets.SocketException: No such host is known
   at System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult)
   at System.Net.Dns.EndGetHostAddresses(IAsyncResult asyncResult)
   at System.Net.Dns.<>c.<GetHostAddressesAsync>b__14_1(IAsyncResult asyncResult)

查看了对应的代码(在Startup.cs的ConfigureServices中):

services.AddDistributedServiceStackRedisCache(options =>
{
    configuration.GetSection("redis").Bind(options);
    //Workaround for deadlock when resolving host name
    if (!IPAddress.TryParse(options.Host, out var ip))
    {
        options.Host = Dns.GetHostAddressesAsync(options.Host)
        .Result.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork).ToString();
    }
});

联想到出问题之前用 supervisorctl restart 命令重启了站点,以及我们最近更换了阿里云redis实例,终于明白了引发CPU 100%问题的原因。

这个 ASP.NET Core 站点的 appsettings.json 中配置的 redis 实例已经释放,上面的代码中通过 redis 实例的网址解析 IP 地址的操作会失败,由于这个操作是在 Startup 中进行的,所以造成整个站点启动失败。本来仅仅是站点启动失败并不会造成CPU 100%,但是由于我们在 supervisor 中(我们是用 supervisor 以服务方式运行 ASP.NET Core 站点的)配置了 autorestart=true 。于是,当 DNS 解析失败造成的 ASP.NET Core 站点启动失败后,supervisor 会自动重启站点,重启依然失败,失败后继续重启。。。就这样不停地重启,造成了 CPU 100% 。当在 appsettings.json 中修改为正确的 redis 配置后,问题立马解决。

时间: 2024-09-27 23:05:48

ASP.NET Core奇遇记:无用户访问,CPU却一直100%的相关文章

ASP.NET Core 行军记 -----拔营启程

ASP.NET MVC 6:https://docs.asp.net/en/latest/mvc/index.html ASP.NET Core :https://docs.asp.net/en/latest/fundamentals/index.html cli-samples  : https://github.com/aspnet/cli-samples 以下是我在学习过程中的一些总结,作此记录 抱怨! 微软的发布候选版本真是坑爹…… 1:三月初开始看 ASP.NET Core ,利用 2

【已解决】IIS搭建 asp.net core 项目后 其他电脑访问不到资源文件

IIS搭建asp.net core 项目后,访问不到里面的资源文件(图片等),解决方法如下: 1.检查asp.net core发布文件中的资源文件是不是都放到了wwwroot名称的目录中. 2.检查asp.net core项目内Startup.cs文件中加上了app.UseStaticFiles(); 检查以上两点后 然后访问就可以找到资源了. ps 访问资源的链接中不用加 wwwroot. 原文地址:https://www.cnblogs.com/YangPeng/p/8971374.html

asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS)

这篇文章介绍如何允许跨域访问 浏览器安全不允许不同域名的网页之间发送请求.这种限制叫做同源策略(the same-origin policy). 同源策略可以防止一个恶意的站点读取另一个站点的敏感数据. 有时候,你想允许网站发送跨域的请求到你的应用. Cross Origin Resource Sharing ( CORS ) : 是一个W3C的标准:即允许放宽同源策略 不是一个安全的功能,CORS 放宽了安全性.允许跨域,会让API更不安全 允许一个服务明确的允许一些跨域请求,而拒绝另外一些

ASP.NET MVC应用迁移到ASP.NET Core及其异同简介

ASP.NET Core是微软新推出支持跨平台.高性能.开源的开发框架,相比起原有的ASP.NET来说,ASP.NET Core更适合开发现代应用程序,如跨平台.Dorker的支持.集成现代前端开发框架(如npm.bower.gulp等等).另外相比ASP.NET它的性能更好,还内置了依赖注入等功能对开发方式进行了优化.但它们之间也有很多相同或相似的地方,如都使用C#进行开发.都提供了MVC.Entity Framework.Identity等组件来快速构建应用程序. 本文将通过迁移一个简单的A

ASP.NET Core的身份认证框架IdentityServer4--入门【转】

原文地址 Identity Server 4是IdentityServer的最新版本,它是流行的OpenID Connect和OAuth Framework for .NET,为ASP.NET Core和.NET Core进行了更新和重新设计.在本文中,我们将快速了解IdentityServer 4存在的原因,然后直接进入并创建一个从零到英雄的工作实现. IdentityServer 3与IdentityServer 4 目前流行的一句话是"概念上兼容",但这对于Identity Se

ASP.NET Core集成现有系统认证

我们现在大多数转向ASP.NET Core来使用开发的团队,应该都不是从0开始搭建系统,而是老的业务系统已经在运行,ASP.NET Core用来开发新模块.那么解决用户认证的问题,成为我们的第一个拦路虎.本文将给大家简单阐述一下认证与授权的基本概念,以及基于ASP.NET Core 中间件实现的认证和改造JwtBearer 认证中间件来实现的认证达到与老系统(主要是token-based认证)的集成. 目录 认证与授权 什么是认证 何谓授权 用Middleware拦截 定制JWT Bearer 

Asp.Net Core Identity 完成注册登录

Identity是Asp.Net Core全新的一个用户管理系统,它是一个完善的全面的庞大的框架,提供的功能有: 创建.查询.更改.删除账户信息 验证和授权 密码重置 双重身份认证 支持扩展登录,如微软.Facebook.google.QQ.微信等 提供了一个丰富的API,并且这些API还可以进行大量的扩展 接下来我们先来看下它的简单使用.首先在我们的DbContext中需要继承自IdentityDbContext. public class AppDbContext:IdentityDbCon

在Linux上以服务的方式运行ASP.NET Core站点

要在生成环境下在Linux服务器上跑ASP.NET Core站点,首先要解决的问题是以服务的方式运行ASP.NET Core站点,这样即使服务器重启,站点也能自动运行. Node.js中有强大的pm2,而.NET Core目前一无所有,只能自己动手实现.摸索了一个晚上,终于使用initctl命令基于Linux的upstart实现了,在这篇博文中分享一下(试验所用的Linux服务器器是Ubuntu). 首先在 /etc/init/ 目录中创建一个服务配置文件,比如这里是 /etc/init/dot

ASP.NET Core开发-后台任务利器Hangfire使用

ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也可以使用于控制台.Hangfire 只需简单几句代码即可创建新的不同种类的任务. 目前 Hangfire 已经支持.NET Core ,现在就给大家讲解下在ASP.NET Core 里的使用. Hangfire GitHub:https://github.com/HangfireIO/Hangfir