【.com速译】当我们需要分析Redis实例的内存使用情况时,市面上有很多免费的开源工具,也有少数付费产品。如果你想更深层次地分析内存相关的问题,你可能需要使用一些更有针对性的“独特”工具。在这篇文章中,我们推荐了六个有用的工具,我们用它们来分析我们自己的Redis实例。它们是:Redis内存分析器(Redismemoryanalyzer,RMA)RedisSampler(Redis采样器)RDB工具(RDBtoolset)Redis-Audit(Redis-audit)Redis工具包(Redistoolkit)Harvest1.RedisMemoryAnalyzer在Redis领域内存分析,RMA(RedisMemoryAnalyzer)是最全面的FOSS(译者注:FreeandOpenSourceSoftware,自由开源软件)之一。它支持三种不同级别的模式,即:全局-显示内存使用信息的概览。扫描仪-显示最高级别的键空间和前缀的内存使用信息-换句话说,使用最短的公共前缀。RAM-显示顶级键空间和前缀-换句话说,使用最长的公共前缀。每种模式都有自己的用途,您可以在RMA的自述文件(https://github.com/gamenet/redis-memory-analyzer/blob/master/README.rst)中获得更多详细信息。RMA-全局模式在全局模式下,RMA提供了一些高级的统计信息,如键的数量、系统内存、驻留集的大小、键值空间的大小等。值得一提的是它的特殊功能:“键值空间开销”,这是Redis系统使用的内存量,用于存储与键值空间相关的信息,例如列表数据结构中的指针数量。RMA-扫描仪模式在扫描仪模式下,我们可以获得键值空间的概览。它给出了高级命名空间(因此,a:b:1和a:c:1合并为a:*),以及每个条目的类型,以及命名空间占用的内存百分比。这个schema可以作为分析的起点,然后使用下面的“RAM”schema进行详细分析。RMA-RAM模式在RAM模式下,我们得到key-value空间级别的内存开销值,当然其他大多数开源内存分析工具也可以提供。所以这里a:b:1和a:c:1分别被当作a:b:*和a:c:*,我们得到内存使用、实际数据大小、开销、编码、min和***TTL等详细信息,这些都有助于我们找出那些系统中内存消耗的“大户”。不过这个工具已经很久没有更新了(上次在GitHub上的commit是一年多以前了)。即便如此,它仍然是我们进行详细分析的首选工具之一。RMA的安装和使用:RMA需要在系统上预先安装好Python和PIP(译者注:Python的包管理工具),主流操作系统一般都预装了这两个工具。安装完成后,可以执行“pipinstallrma”命令安装RDB工具。您可以使用以下语法从命令行轻松使用它:“rma[-sHOST][-pPORT][-aPASSWORD][-dDB][-mpattern-to-match][-lnumber-of-keys-to-scan][-bBEHAVIOUR][-tcomma-separated-list-of-data-types-to-scan]"RMA的优点:可以实时运行。scan命令用于遍历数据库,因此对性能的影响有限,但分析的准确性更高。有很好的支持文档,使用示例很容易找到。支持定制和过滤能力,包括只分析特定的数据类型,或者只考虑匹配特定模式的键值。可以提供不同级别的详细信息,包括:命名空间、键值或全局值。相比其他工具,它有一个特别之处:可以显示数据结构的开销(即Redis系统用来存储key-value空间相关信息的内存占用量,比如指针的个数)列表数据结构)。RMA的缺点:不支持概率抽样。对于大型数据库,它线性扫描数据库的方式可能非常慢。为了提高性能,我们可以选择在返回一定数量的键后中止扫描。输出带有太多细节。虽然对专家有用,但它也会给新手带来困惑。2.RedisSamplerRedisSampler是一个非常强大的工具,可以让我们深入了解Redis实例的内存使用情况。它由Redis背后的开发者antirez(https://github.com/antirez)维护。从这个工具中我们可以看出他对Redis的深入了解。该工具更新不频繁,当然也很少有错误报告。RedisSampler对数据库进行概率扫描,可以报告以下信息:键值在各种数据类型中的百分比分布(基于键值的数量,而不是对象的大小)。字符串类型的键,基于strlen,以及它们消耗的内存百分比。对于所有其他数据类型,它计算键并将其显示到两个单独的列表中:一个基于对象的大小;另一个基于对象的大小。另一个基于对象中的项目数。对于每种数据类型,它还可以显示“2次方分布”。这对于我们了解数据类型的大小分布非常有用。它的输出可以详细说明给定类型的键值的百分比范围,即:>2^x和<=2^x+1。RedisSampler的安装和使用:由于是一个单独的Ruby脚本,所以需要已经安装了Ruby。同时,还需要安装“rubygems”和“redisgems”。它的用法很简单,执行命令“./redis-sampler.rb”即可。RedisSampler的优点:使用起来非常简单,没有选项可以自己查找理解。即使是新手,它的输出也很容易阅读。同时也可以为技术专家对Redis实例进行详细分析提供足够的信息。展示区布局比较清晰,可以过滤。适用于所有版本的Redis。由于没有使用DEBUGOGJECT等特权命令,因此它可以应用于包括AmazonElastiCache在内的任何系统。它使用特定于数据类型的长度命令来识别数据大小,因此它的报告不受序列化的影响。适用于实时数据。虽然该工具推荐在环回接口上运行,但它也可以支持远程系统的采样。RedisSampler的缺点:如果它的采样频率设置的比数据库的基数高,它仍然会使用随机键值(RANDOMKEYS)而不是扫描(SCAN)模式。没有现成的捆绑包或Docker映像。您必须手动安装其相应的依赖项(幸好只有两个依赖项)。由于数据结构具有不同的存储开销,因此报告的数据大小与RAM上占用的空间不完全匹配。如果您的Redis实例需要身份验证,则它无法开箱即用。您将需要修改脚本以适应密码。最简单的形式是:redis=Redis.new(:host=>ARGV[0],:port=>ARGV[1].to_i,:db=>ARGV[2].to_i)改成:redis=Redis.new(:host=>ARGV[0],:port=>ARGV[1].to_i,:db=>ARGV[2].to_i,:password=>"add-your-password-here")3.RDBToolsRDBTools是一个非常有用的工具套件,适用于任何要求苛刻的Redis管理员。它具有适用于我们能想到的几乎所有用例的工具。在这里,我们只关注它的内存分析工具。尽管不如RMA或RedisSampler全面,但RDBTools提供了以下三个方面的重要信息:(1)列出所有(序列化)值大于B字节的键[B由用户指定]。(2)***N个键[N由用户指定]。(3)特定键的大小:这是实时从数据库中读取的。该套件在GitHub上有许多活跃的贡献者,因此可以保持经常更新。我们也可以在网上找到RDBTools的相关文档。它的维护者是SripathiKrishnan(https://github.com/sripathikrishnan?tab=repositories)。众所周知,他多年来为Redis社区贡献了许多工具。RDBTools的安装和使用:RDBTools需要系统提前安装好Python和PIP,主流操作系统一般都会预装。安装完成后,可以执行“pipinstallrdbtoolspython-lz”命令安装RDB工具。它的用法很简单:获取前200个***键:rdb-cmemory/var/redis/6379/dump.rdb–largest200-fmemory.csv获取所有大于128字节的键值:rdb-cmemory/var/redis/6379/dump.rdb--bytes128-fmemory.csv获取key值的大小:redis-memory-for-key-slocalhost-p6379-amypasswordperson:1的优点RDBTools:输出CSV文件,可供其他开源工具使用,轻松实现数据可视化,也可导入RDBMS进行分析。有很好的支持文档。支持自定义和过滤选项,以便您可以获得更有用的报告。RDBTools的缺点:不能分析实时数据,必须获取RDBdump文件。因此,它报告序列化内存的使用情况,而不是准确显示RAM上占用的内存。它不支持任何内置分组,因此无法找到完美的命名空间。4.Redis-AuditRedis-Audit是一个概率工具,可以用来快速了解内存使用情况。它能够输出各种有用的密钥组信息,包括:总体内存消耗、组内的最大TTL、平均上次访问时间、组中过期密钥的百分比等。如果你想在你的应用程序中找到那些内存密集型键值组,那么它是你的首选工具。Redis-Audit的安装和使用:你必须提前安装好Ruby和Bundle(https://bundler.io/)。安装完成后,可以将Redis-Audit仓库(https://github.com/snmaynard/redis-audit.git)clone到一个文件夹,或者下载zip工具(https://github.com/snmaynard/redis-audit/archive/master.zip)并在那里解压。从该文件夹中,您可以运行“bundleinstall”来完成安装。它的用法很简单,直接输入“execute”即可redis-audit.rbhostname[port][password][dbnum][sample_size]正则表达式(regex)。适用于所有版本的Redis。如果样本量大于键的实际数量,它将遍历所有键。另一方面,此操作使用*键而不是扫描来阻止其他操作。Redis-Audit的缺点:由于使用了“DEBUGOBJECT”命令(在ElastiCache中不可用),它报告的序列化大小将与RAM上的实际占用空间不同。由于它不是表格形式,因此无法轻松快速地解析其输出。5.RedisToolkitRedisToolkit是一个极其简单的监控解决方案。它可用于分析两个关键指标:效率和内存消耗。虽然该项目通过更新定期修复错误,但它提供的工具没有社区支持。RedisToolkit的安装和使用:必须先在您的系统上安装Docker。然后,克隆其GitHub存储库(https://github.com/alexdicianu/redis_toolkit.git)或下载并将其解压缩到某个文件夹中。在此文件夹中,您可以通过执行“./redis-toolkitinstall”来执行简单安装。下面是一些纯命令行的简单操作:开始监控攻击率:./redis-toolkitmonitor上报攻击率:./redis-toolkitreport-nameNAME-typehitrate停止监控攻击率:./redis-toolkitstop创建一个在本地系统上转储文件:./redis-toolkitdump报告内存使用情况:./redis-toolkitreport-typememory-nameNAMERedisToolkit的优点:它可以为您提供准确的信息。能够将前缀分组到适合您的任何级别(因此,如果您选择a:b:1和a:c:1,它既算作a:*又单独算作)。适用于所有版本的Redis,同时不需要访问DEBUGOBJECT等特权命令。有很好的支持文档。RedisToolkit的缺点:由于工作在序列化转储模式,无法进行实时内容分析。此外,它报告的内存使用情况并不完全等同于RAM的实际消耗量。当RedisToolkit运行时,计算机会创建一个转储文件。如果您正在访问Redis的远程实例,则可能需要一段时间才能完成。使用MONITOR命令监控攻击率以捕获服务器上运行的所有命令。在生产环境中,这可能会降低性能并带来安全风险。由于它通过|GET|计算攻击率/(|GET|+|SET|),如果一个值频繁变化,即使没有真正的缓存丢失,那么它的攻击率也会降低。6.Harvest是一种概率抽样工具,可用于根据键的数量识别前十名的命名空间和前缀。作为一个较新的工具,它在GitHub上的关注度并不高。但是,如果你是一个Redis新手,想要找出你的实例中哪些应用程序数据拥塞,那么Harvest对你来说非常容易上手。Harvest的安装和使用:您可以通过以下链接下载其Docker镜像:https://hub.docker.com/r/31z4/harvest/。映像准备就绪后,您可以使用“dockerrun--linkredis:redis-it--rm31z4/harvestredis://redis-URL”在CLI中运行该工具。Harvest的优势:?适用于实时数据。?使用“内存使用”命令获取内存信息。因此它可以提供准确的数量信息(而不是序列化大小),并且不需要访问DEBUGOBJECT命令。?您的命名空间不需要用冒号分隔。Harvest识别通用前缀,而不是依赖正则表达式来识别命名空间。Harvest的缺点:很难应用于任何其他类型的用例。此工具仅适用于Redisv4.0及以上版本。它的支持文档很少。免费工具的局限性虽然我们在此处列出的工具可用于调试Redis实例的内存问题,但您应该了解这些免费工具的一些局限性。付费工具通常总是提供一些数据可视化功能,但我们在此处列出的工具并不是开箱即用的。它们最多给你一个CSV输出,供其他开源软件进一步可视化,当然很多工具甚至没有这样的输出。这给Redis的新手用户带来了“陡峭”的学习曲线。所以,如果你需要经常做内存分析,你最好选择一个提供良好可视化的付费工具。另一个限制是它们存储历史信息的能力。和那些*nix的设计理念一样,这些工具只专注于一个方面,也能做好,但很少涵盖整个监控领域。它们既不能提供内存消耗随时间变化的图表,也不能分析实时数据。选择的底线虽然单一工具确实无法满足您的所有需求,但它们可以作为您“武器库”中的常备“武器”来配合使用,例如:ScaleGrid的Redis托管(https://scalegrid.io/redis/products.html)等具有监控能力的DBaaS服务联合使用。原标题:TheTop6FreeRedisMemoryAnalysisTools,作者:AparajitaRaychaudhury
