You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure WebApp异步代码出现SemaphoreSlim等待致延迟升高问题排查

Azure WebApp移动端后端延迟升高问题排查求助

我们的移动端后端部署于Azure WebApp,近期应用延迟明显升高。通过内存dump分析得到错误提示,提示建议在调用中使用await,但我们的代码已经正确使用了await关键字。

具体报错信息

第一条报错

Api.Controllers.v5.CampaignsController.Campaigns(string, string) is waiting on System.Threading.SemaphoreSlim.Wait(int, System.Threading.CancellationToken)

对应代码:

public async Task<ActionResult<BaseResponse>> Campaigns([Required] string matasID, string type = "Campaign")
{
    _logger.Information(IntegrationLogger.GetLogMessage(_correlationId, HttpStatusCode.OK,
                                 GetType().Name, IntegrationLogger.GetActualAsyncMethodName(),
                                 $"API Call received with matas Id {matasID} to get compaigns", null));
    if (type == "Campaign")
    {
        var cacheCampaigns = await _memberCacheService.GetCampaigns(matasID);
        BaseResponse response;
        if (cacheCampaigns == null)
        {
            var campaignsResponse = await _clientv5.GetAsync<CampaignsResponseModel>($"/campaigns?type={type}");

            var filteredCampaigns = campaignsResponse.campaigns.Where(c => !string.IsNullOrEmpty(c.link)).ToList();
            campaignsResponse.campaigns = filteredCampaigns; 

            _memberCacheService.SaveCampaigns(campaignsResponse, matasID);
            response = await _memberCacheService.GetCampaigns(matasID);
        }
        else
        {
            response = cacheCampaigns;
        }
        return Ok(response);
    }             
    else
    {
        var responseModel = new FailureResponseModel
        {
            result = false,
            timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss"),
            resultDetails = $"Please pass the correct parameters",
            errors = new List<Error>
            {
                new Error{
                description=$"The specified Type '{type}' is not valid",
                code= 400,
                resolve = "Please provide correct parameters"
                }
            }
        };
        return BadRequest(responseModel);
    }
}

以及GetCampaigns方法代码:

public async Task<CampaignsResponseModel> GetCampaigns(string matasID)
{
    try
    {
        _logger.Information(IntegrationLogger.GetLogMessage(_correlationId, HttpStatusCode.OK,
                                 GetType().Name, IntegrationLogger.GetActualAsyncMethodName(),
                                 $"Getting compaigns for User {matasID}", null));

        var cacheCampaigns = await _redisClient.Db3.GetAsync<CampaignsResponseModel>(matasID);

        return cacheCampaigns;
    }
    catch (Exception ex)
    {
        _logger.Error(IntegrationLogger.GetLogMessage(_correlationId, HttpStatusCode.InternalServerError,
                                GetType().Name, IntegrationLogger.GetActualAsyncMethodName(),
                                $"Getting compaigns for User {matasID} Failed", ex.Message));
        throw;
    }
}

第二条警告

Api.Controllers.v5.MembersController.GetSpecificMemberInfo(string) is waiting on System.Threading.SemaphoreSlim.Wait(int, System.Threading.CancellationToken)

对应代码:

_logger.Information(IntegrationLogger.GetLogMessage(_correlationId, HttpStatusCode.OK,
                                         GetType().Name, IntegrationLogger.GetActualAsyncMethodName(),
                                         $"API call received to get specific member info with the matas Id {matasID}", null));
    
        MemberShortResponseModel response = await _memberInfoService.GetShortInfo(matasID);
        response.acceptedPermissionVersion = response.termsAcceptVersion;
        Shop shop = null;

        if (response.shopId != null)
        {
            shop = await _shopCacheService.GetShopByShopId(response.shopId).ConfigureAwait(true);
        }

        response.shop = shop;
        return Ok(response);

以及GetShopByShopId方法代码:

public async Task<Shop> GetShopByShopId(string shopId)
{
    _logger.Information(IntegrationLogger.GetLogMessage(_correlationId, HttpStatusCode.OK,
                                 GetType().Name, IntegrationLogger.GetActualAsyncMethodName(),
                                 $"Fetching Shop By shopId", null));

    var cacheShop = await _redisClient.Db1.GetAsync<Shop>(shopId);

    return cacheShop;
}

内存dump截图

内存dump中线程等待SemaphoreSlim的截图

恳请协助分析此问题的根本原因。

内容的提问来源于stack exchange,提问作者Shabir jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:40:13