ASP.NET Azure WebApp TimerQueueTimer pamięci / procesora Wykorzystanie problem

głosy
0

Jestem gospodarzem aplikację na lazurowym budować na klasyczny ASP.NET (4.6.1). Mój problem jest rosnące zużycie procesora i pamięci.

Aplikacja jest API, które jest zużywane przez aplikację. Na naciśnięciem mamy hit począwszy od 100 - 3000 użytkowników na sekundę w ciągu co najmniej 2-5 sekund.

Po uzyskaniu pełnego zrzutu i dotMemory próbną edycję widzę następujący obraz. wprowadzić

Mam dwie klasy zapisuje dane mojego mechanizm zegara.

Statystyka

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();
}

Za drugim razem używać tych samych machanics jest dla lokalnej pamięci podręcznej klasy, który posiada słownika. Timer kasuje klucze słownika na określony upływie jeśli jest ustawiony.

Czy ktoś ma pomysł dlaczego obiektów TimerQueueTimer zwiększa się o tę kwotę? Czy tęsknię za nic essantial?

Z góry dziękuję

Utwórz 20/10/2018 o 10:43
źródło użytkownik
W innych językach...                            

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