Redis Out of Memory Исключения, но все еще есть много памяти - PullRequest
0 голосов
/ 25 октября 2018

Я использую проект StackeExchange.Redis для взаимодействия с Redis в нашем проекте .NET Core C #.

При большой нагрузке наши подключения Redis перестают работать со следующимиисключение:

StackExchange.Redis.RedisServerException: OOM command not allowed when used memory > 'maxmemory'

Проблема в том, что у нас остаётся нелепое количество свободной памяти.Мы используем Elasticache, поэтому его легко найти:

enter image description here

Мы также можем подключиться к Elasticache через оболочку и посмотреть, что память доступна.и взаимодействовать с ним просто отлично.

Это код, который я использовал в качестве слоя над информацией о Соединении.

    public class RedisTimeConnectionManager : IRedisConnectionManager
{
    // More info about the Lazy<> pattern https://stackoverflow.com/questions/28792196/how-does-connectionmultiplexer-deal-with-disconnects
    // Additional information about the multiplexer: https://github.com/StackExchange/StackExchange.Redis/blob/master/docs/Basics.md
    private static Lazy<ConnectionMultiplexer> RedisConnectionMultiplexer = new Lazy<ConnectionMultiplexer>(() =>
    {
        return ConnectionMultiplexer.Connect(ConnectionString);
    });

    private static string ConnectionString { get; set; }

    public RedisTimeConnectionManager(string connectionString)
    {
        ConnectionString = connectionString;
    }

    public ConnectionMultiplexer GetConnectionMultiplexer()
    {
        return RedisConnectionMultiplexer.Value;
    }

    public IDatabase GetDatabaseConnection()
    {
        return RedisConnectionMultiplexer.Value.GetDatabase();
    }
}

Затем я передаю этот уровень Соединения своему менеджеру redis "time",Это код, который выдает ошибку OOM:

public class TimeRedisManager : ITimeRedisManager
{
    private IRedisConnectionManager RedisConnectionManager { get; }

    public TimeRedisManager(IRedisConnectionManager redisConnectionManager)
    {
        RedisConnectionManager = redisConnectionManager;
    }

    public async Task<RedisUserTimelineGetValueDto> GetValueAsync(string id)
    {
        string key = $"time:{id}";

        HashEntry[] entries = await RedisConnectionManager.GetDatabaseConnection().HashGetAllAsync(key);

        // Parse and return values...
    }
}

Поскольку Elasticache имеет более 7,5 ГБ свободной памяти, и поскольку я могу взаимодействовать с ним через оболочку, я предполагаю, что это либо StackExchange.Библиотека Redis, или проблема с управлением соединениями в моем коде.

.NET CORE 2.1 StackExchange.Redis v 2.0.513

Еще одна важная вещь - когда это исключениеслучается, это продолжаетсяПерезапуск сервисов, которые взаимодействуют с Redis, ничего не делает.Только перезапуск узлов Elasticache решает проблему.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Команда OOM не разрешена, когда используемая память> 'maxmemory'

Из сообщения об ошибке ваш экземпляр Redis достиг ограничения maxmemory .

maxmemory - это конфигурация Redis, она ограничивает максимальный объем памяти, который Redis может использовать.Таким образом, вы должны установить большую maxmemory в файле конфигурации.

0 голосов
/ 26 октября 2018

Redis может занять в 2 раза больше памяти, чем требуется для данных, хранящихся в нем.

Подробнее читайте здесь: https://redis.io/topics/admin

Если вы используете Redis в очень интенсивной записиприложения, при сохранении файла RDB на диске или перезаписи журнала AOF Redis может использовать до 2 раз больше обычно используемой памяти.Используемая дополнительная память пропорциональна количеству страниц памяти, измененных записями во время процесса сохранения, поэтому она часто пропорциональна количеству клавиш (или элементов типов агрегатов), к которым было произведено прикосновение в течение этого времени.Удостоверьтесь, что ваш размер памяти соответственно.

Итак, если данные, хранящиеся в Redis, занимают 8 ГБ пространства, при большой нагрузке Redis может потреблять 16 ГБ.Возможно, вам придется настроить память соответственно, если это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...