В моем случае с Redis, почему сумма MEM USAGE для всех ключей будет меньше, чем сообщенные суммы из INFO? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть скрипт (golang), который перебирает все ключи в моем экземпляре redis, который вычисляет сумму MEMORY USAGE для каждого ключа, но конечный результат намного ниже, чем я ожидал, исходя из INFO command.

{"count":6535412, "msg":"Final statistics", "totalGiB":1.43}

Вот вывод команды INFO.

# Memory
used_memory:3084991464
used_memory_human:2.87G
used_memory_rss:3190091776
used_memory_rss_human:2.97G
used_memory_peak:11348202280
used_memory_peak_human:10.57G
used_memory_peak_perc:27.18%
used_memory_overhead:468319456
used_memory_startup:4987200
used_memory_dataset:2616672008
used_memory_dataset_perc:84.96%
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:10852761600
maxmemory_human:10.11G
maxmemory_policy:volatile-lru
mem_fragmentation_ratio:1.03
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
. . .
# Keyspace
db0:keys=6540519,expires=2030054,avg_ttl=707634519

Как видите, скрипт вычислил сумму 1,43 ГБ для 6,5 миллионов ключей однако команда INFO сообщает used_memory_dataset при 2,4 ГБ. Я не уверен, что мне здесь не хватает.

См. Соответствующий код ниже:

func getMemoryUsage(key string) int64 {
    var err error
    bytesUsed := int64(0)
    memCmd := redisClient.MemoryUsage(key, 0)
    bytesUsed, err = memCmd.Result()
    if err != nil {
        log.Error("error msg")
        return 0
    }
    return bytesUsed
}

func iterateThroughKeys() {
    keyIterator := redisClient.Scan(0, "keyPrefix/*", batchSize).Iterator()
    totalBytes := 0
    count := 0
    for keyIterator.Next() {
        totalBytes += getMemoryUsage(keyIterator.Val())
        count++
    }
    totalGiB := float64(totalBytes) / float64(1e9)
    log.Info("Final statistics", "count", count, "totalGiB", totalGiB)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...