我目前正在测试将键插入本地Redis数据库中。我有超过500万个键,但只有4GB的内存,因此在某一时刻我会达到内存容量并且交换填充(然后我的PC就会崩溃)...
我的问题是:如何监视Redis数据库所在的计算机上的内存使用情况,并通过这种方式提醒不要再向Redis数据库中插入更多的键?
谢谢。
Redis性能的关键资源之一是内存。使用的内存定义了Redis分配的总字节数,使用的分配器可以是标准libc、jemalloc、或者其他分配器如tcmalloc。
您可以通过运行“info memory”命令来收集Redis实例的所有内存利用率指标数据。
127.0.0.1:6379> info memory Memory used_memory:1007280 used_memory_human:983.67K used_memory_rss:2002944 used_memory_rss_human:1.91M used_memory_peak:1008128 used_memory_peak_human:984.50K
有时,当Redis没有设置最大内存限制时,内存使用量将最终达到系统内存,并且服务器将开始抛出“Out of Memory”错误。在其他情况下,Redis配置了最大内存限制但没有清除策略。这将导致服务器不清除任何键,从而阻止任何写操作直到内存被释放。解决此类问题的方法是设置Redis的最大内存和一些清除策略。在这种情况下,服务器会在内存使用量达到最大值时使用清除策略开始清除键。
内存RSS(Resident Set Size)是操作系统分配给Redis的字节数。如果‘memory_rss’与‘memory_used’的比率大于~1.5,则表明存在内存碎片。可以通过重新启动服务器来恢复碎片内存。
INFO
命令中的所有统计信息并获得通知的文章:https://medium.com/@liesislukas/how-to-monitor-redis-or-anything-else-running-on-your-linux-machine-and-get-an-email-or-trigger-d0d62769f60e - Lukas Liesis关于内存使用,建议您查看redis.io FAQ和有关将redis用作LRU缓存的文章。
您可以通过maxmemory配置设置限制内存使用,一旦达到内存限制,所有写请求都将失败并出现错误,或者您可以将maxmemory-policy设置为allkeys-lru,以覆盖服务器上最近未使用的数据与您当前需要的数据等。对于大多数用例,您可以通过适当的配置灵活处理此类问题。
我的建议是通过redis服务器的配置来保持简单,并处理此问题,而不是引入操作系统级别的监视或类似的额外复杂性。
有一个很好的Unix实用程序叫做vmstat。它类似于top命令,但是是命令行界面,所以您可以在系统崩溃之前获取内存使用情况并做好准备。您还可以使用ps v PID
来获取特定进程的此信息。Redis的PID可以通过以下方式检索:pidof redis-server