【问题标题】:Memory leaks in windows service, IIS process doesn't diewindows服务内存泄漏,IIS进程不死
【发布时间】:2019-04-08 14:46:12
【问题描述】:

我目前正在开发一项健康监控服务,该服务将调用当前机器托管的每个网站。它的作用是贯穿所有托管网站,通过 HttpClient 向每个网站调用机器并将其当前状态响应保存到数据库中。这样做的问题是,该服务在运行时会创建多个根本不会消失的 IIS 工作进程,并且内存使用量每隔几分钟就会增加 1%。我很确定这不是巧合,我已经搜索了很多关于这个问题的不同主题,但找不到适合我的结果。关于如何解决这个问题的任何想法?这是我正在使用的代码的摘录:

        public void PingWebsites(List<Website> websites)
    {
        using (var client = new HttpClient())
        {
            for (int i = 0; i < websites.Count(); i++)
            {
                {

                    if (!websites[i].Environment.Contains("CI"))
                    {
                        Task<HttpResponseMessage> response = null;
                        try
                        {
                            response =  client.GetAsync(websites[i].Address);

                            if (!response.Result.IsSuccessStatusCode)
                            {
                                SaveStatus(websites[i].ID, 0);

                            }
                            else
                            {
                                SaveStatus(websites[i].ID, 1);
                            }

                        }
                        catch (Exception e)
                        {
                            SaveStatus(websites[i].ID, 0);
                        }
                        finally {
                            if (response != null)
                            {
                                response.Dispose();
                            }
                        }
                    }
                }
            }
        }
    }

我还搜索了计时器出错和 sql 调用的可能性,但我相信这更多是 HttpClient 的问题。

编辑:我也尝试过使用一个独特的 HttpClient 实例,但内存消耗是相同的,随着时间的推移消耗越来越多,所以这不是我当前的问题。

【问题讨论】:

  • 不要在 using 块中初始化 httpclient。见aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
  • HttpClient 的正确用法意味着共享单个实例,而不是每次阅读此here 时都重新创建它。至于多个 IIS 工作进程,我认为如果它们之前处于空闲状态,它们与您请求的站点有关。
  • @Daniel 我之前尝试过这种方法,但它仍然会导致内存泄漏,我觉得没有什么不同,所以我最终恢复到原始代码。随着每分钟使用率增加 1% 并且 IIS 工作进程没有消失,问题仍然存在,所以我只能假设还有另一个问题

标签: c# windows service httpclient


【解决方案1】:

我已经找出导致问题的原因,请求会使机器因数百个请求而超载,并且由于内存不足,它会发疯。增加容量后就没有这个问题了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2014-04-19
    • 2015-04-11
    • 2011-02-18
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多