Aqui estão algumas fontes de consumo de memória "oculto" no Redis:
-
Marc já mencionou os buffers mantidos pelo mestre para alimentar o escravo. Se um escravo estiver atrasado em relação ao mestre (porque roda em uma caixa mais lenta, por exemplo), então alguma memória será consumida no mestre.
-
quando comandos de longa duração são detectados, o Redis os registra na área SLOWLOG, o que consome alguma memória. Você pode querer usar o comando SLOWLOG LEN para verificar o número de registros que você tem aqui.
-
buffers de comunicação também podem ocupar memória. Pelo que me lembro, com versões antigas do Redis (e 2.4 é bastante antigo - você realmente deve atualizar), ele era ilimitado, o que significa que se você transferir um objeto grande em um ponto, o buffer de comunicação associado a essa conexão do cliente aumentará e nunca encolher. Se houver muitos clientes lidando ocasionalmente com objetos grandes, isso pode ser uma explicação possível. Se você usar comandos para recuperar dados muito grandes do Redis (de uma só vez), isso também pode ser uma explicação. Por exemplo, um simples comando KEYS * aplicado em um servidor Redis que armazena milhões de chaves consumirá uma quantidade significativa de memória.
Você mencionou que tem objetos tão grandes quanto 25 MB. Você tem 404 conexões de clientes, se cada uma delas precisar acessar tais objetos em um determinado momento, consumirá 10 GB de memória.