stevenjin 2024-06-04 14:30 采纳率: 97.3%
浏览 14
已结题

asp.net core mvc网站出现假死现像

1.环境asp.net core mvc 7.0,内置后台通信mqtt客户端,前端采用websock消息推送
2.网站在运行一段时间(1天左右),会出现mqtt连接断开。经排查,是整个web端出现了假死现像。但只要在网页上点击,通信又立马恢复过来。过段时间不看网站又呈现假死状态

1.使用的是自带的控制台kestel
2.websocket有重连机制
以下是相关代码

//websocket部分
var ws;
window.onload = function () {
    var host = window.location.host;
    var protocol = window.location.protocol === "https:" ? "wss://" : "ws://";
    var wsUrl = protocol + host + "/ws";
    var timeConnect = 0;
    var lockReconnect = false;//避免重复连接
    webSocketInit(wsUrl);
    //socket初始化
    function webSocketInit(service) {
        ws = new WebSocket(wsUrl);
        ws.onopen = function (e) {
            console.log("Server > connection open.");
        };
        ws.onmessage = function (e) {
          
             
        }
        ws.onerror = function (e) {
            console.log("Server > connection err.");
            reconnect(service);
        };

        ws.onclose = function (e) {            
            //commonUtil.alert("Server connection closed", "danger");
            reconnect(service);
            console.log("Server > connection closed.");
        };
    }

    // 重连
    function reconnect(service) {
        // lockReconnect加锁,防止onclose、onerror两次重连
        if (lockReconnect) return;
        lockReconnect = true;

        // 进行重连
        setTimeout(function () {
            //timeConnect++;
            console.log("正在重连,当前时间" + new Date());
            //console.log("第" + timeConnect + "次重连");
            webSocketInit(service);
        }, 5000);
    }

    // 心跳 * 回应
    setInterval(function () {
        var websocket = new WebSocket(ws);
        websocket.send('');
    }, 1000 * 100)
}

//mqtt部分

 var builder1 = new MqttClientOptionsBuilder()
                            .WithTcpServer(Host, 1883)
                            .WithClientId(Id1)
                            .WithCleanSession(true)
                            .WithCredentials("", "");


                        IManagedMqttClientOptions options1 = new ManagedMqttClientOptionsBuilder()
                            .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
                            .WithClientOptions(builder1.Build()).Build();
                        mqttClient1.UseDisconnectedHandler(dc => {
                                       
                            return Task.CompletedTask;
                        });
                        mqttClient1.UseConnectedHandler(async ee =>
                        {
                            Console.WriteLine($"{DateTime.Now.ToString()} >>> {Id1} 连接到服务");

                            // 订阅主题 
                            List<MqttTopicFilter> lstTopics = new List<MqttTopicFilter>();
                            try
                            {
                               lstTopics.add(......);
                            }
                            catch (Exception ex)
                            {                              
                             
                            }
                            await mqttClient1.SubscribeAsync(lstTopics);
                        });
                        mqttClient1.UseApplicationMessageReceivedHandler(async m =>
                        {
                            var clientID = m.ClientId;
                            var topic = m.ApplicationMessage.Topic;
                         
                            Console.WriteLine($"{DateTime.Now.ToString()} {clientID} 接收到主题:" + topic);
                            if (topic != null)
                            {
                                try
                                {
                                  }
           }
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-04 14:30
    关注

    引自免费微信小程序:皆我百晓生

    首先,我们需要检查几个可能的原因导致 ASP.NET Core MVC 网站出现假死现象。我会提供一些步骤和可能的解决方案,你可以根据这些信息逐步排查问题。

    1. 线程池耗尽: 确保应用程序没有因为长时间执行的任务而导致线程池耗尽。你可以通过监视器工具(如 Performance Monitor)检查ThreadPool Threads计数器,看看是否有过多的请求处于等待状态。

      • 如果发现线程池耗尽,可以考虑增加线程池大小:
        public void ConfigureServices(IServiceCollection services)
        {
            // ...
            services.Configure<MvcOptions>(options =>
            {
                options.MaxDegreeOfParallelism = Environment.ProcessorCount * 2; // 根据实际情况调整
            });
            // ...
        }
        
      • 或者优化你的代码,减少长耗时操作,并确保异步方法正确使用了 asyncawait 关键字。
    2. WebSocket 连接管理: 检查 WebSocket 连接是否正确管理,包括连接建立、断开以及重连逻辑。

      • 使用合适的库管理 WebSocket 连接,比如 Microsoft.AspNetCore.WebSockets。
      • 确保在客户端断开连接后,服务器端也能正确处理并释放资源。
    3. 内存泄漏: 长时间运行的应用程序可能会因为内存泄漏导致性能下降。使用内存分析工具(如 dotMemory 或 ANTS Profiler)检查是否存在内存泄漏。

    4. 定时任务: 检查是否有长时间运行的定时任务,它们可能导致线程阻塞。

    5. MQTT 客户端配置: 确认 MQTT 客户端配置正确,例如心跳包设置、重连策略等。确保客户端能自动重连并在断开连接时发出通知。

    6. 错误日志和诊断: 在生产环境中启用详细的错误日志记录和诊断,以便于捕获异常和性能瓶颈。

    7. 负载均衡和监控: 如果在多台服务器上部署应用,确认是否有负载均衡机制,防止单点故障。同时,使用监控工具(如 Application Insights)实时查看系统状态。

    8. 定期重启服务: 虽然不是理想的解决方案,但在某些情况下,定期重启服务可以帮助解决长期运行的问题。可以通过 Windows Task Scheduler 或其他进程管理工具实现。

    9. 代码审查: 对关键部分的代码进行审查,寻找潜在的问题,比如无限循环、死锁等。

    如果你需要更具体的代码示例或者进一步的帮助,请告诉我哪个方面需要深入讨论,我会尽力提供更多的细节。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 修改了问题 6月4日
  • 修改了问题 6月4日
  • 展开全部

悬赏问题

  • ¥15 网络分析设施点无法识别
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决
  • ¥100 基于SVM的信息粒化时序回归预测,有偿求解!
  • ¥15 物体组批优化问题-数学建模求解答
  • ¥15 微信原生小程序tabBar编译报错
  • ¥350 麦克风声源定位坐标不准
  • ¥15 apifox与swagger使用
  • ¥15 egg异步请求返回404的问题