ASP.NET Azure WebApp TimerQueueTimer Geheugen / CPU-gebruik Problem

stemmen
0

Ik ben het hosten van een web-app op azuurblauwe bouwen op de klassieke ASP.NET (4.6.1). Mijn probleem is een toenemende CPU en geheugengebruik.

De applicatie is een API die wordt verbruikt door een app. Push hebben we geraakt, variërend van 100 - 3000 gebruikers per seconde over ten minste 2-5 seconden.

Na het krijgen van een volledige dump en dotMemory proefuitgave zie ik het volgende beeld. voer

Ik heb twee klassen het schrijven van data mijn een timer mechanisme.

Statistieken

public sealed class Statistics : IStatistics, IDisposable
{
    private static Lazy<Statistics> _lazy => new Lazy<Statistics>(() => new Statistics());
    public static Statistics Instance => Statistics._lazy.Value;

    private readonly object _mutex = new object();
    private readonly IDictionary<string, LogObject> _cache;

    private readonly TimeSpan _interval;
    private readonly Task _outputTask;
    private readonly CancellationTokenSource _cancellationTokenSource;

    private Statistics()
    {
        this._interval = TimeSpan.FromSeconds(15);
        this._cache = new Dictionary<string, LogObject>();
        this._cancellationTokenSource = new CancellationTokenSource();
        this._outputTask = Task.Factory.StartNew(
            this.WriteToRedis,
            null,
            TaskCreationOptions.LongRunning
        );
    }

    private void Stop()
    {
        this._cancellationTokenSource.Cancel();

        try
        {
            this._outputTask.Wait(this._interval);
        }
        catch (TaskCanceledException)
        {
        }
        catch (AggregateException ex) when (ex.InnerExceptions.Count == 1 && ex.InnerExceptions[0] is TaskCanceledException)
        {
        }
        this._cancellationTokenSource?.Dispose();
    }

    private static Task IntervalAsync(TimeSpan interval, CancellationToken cancellationToken)
        => Task.Delay(interval, cancellationToken);

    public async Task WriteToRedis(object state)
    {
        while (!this._cancellationTokenSource.IsCancellationRequested)
        {
            // write stuff to redis in azure

            await IntervalAsync(this._interval, this._cancellationTokenSource.Token);
        }
    }

    public Task ReportQuery(string query, string data)
    {
        // save data to local cache
    }

    public void Dispose()
        => this.Stop();
}

De tweede keer dat ik hetzelfde machanics is voor een lokale cache klasse die een woordenboek houdt. De timer wist woordenboek sleutels voor een set expiratie als er is ingesteld.

Heeft iemand een idee heeft waarom de TimerQueueTimer object toe met dat bedrag? Doe ik iets essantial gemist?

Bij voorbaat dank

De vraag is gesteld op 20/10/2018 om 10:43
bron van user
In andere talen...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more