简介再分配存储器的使用

rma的Python项目详细描述


redis内存分析器

RMA是一个控制台工具,用于实时扫描和聚合redis密钥空间 按键模式统计内存使用情况。你可以不用 生产服务器的维护。您可以按全部或选定项扫描 redis类型,如"string"、"hash"、"list"、"set"、"zset",并使用 你喜欢什么样的图案。RMA试图通过模式识别密钥名, 例如,如果您有"user:100"和"user:101"应用程序之类的密钥 会在输出中选择常见模式"user:*",以便您可以分析 实例中大多数内存不足的数据。

安装RMA

先决条件:

  1. python>;=3.4和pip。
  2. redis py.
  3. < > >

    从pypi安装(推荐):

    pip install rma
    

    从源安装:

    git clone https://github.com/gamenet/redis-memory-analyzer
    cd redis-memory-analyzer
    sudo python setup.py install
    

    运行

    安装后从控制台使用:

    >rma --help
    usage: rma [-h] [-s HOST] [-p PORT] [-a PASSWORD] [-d DB] [-m MATCH] [-l LIMIT]
               [-b BEHAVIOUR] [-t TYPES]
    
    RMA is used to scan Redis key space in and aggregate memory usage statistic by
    key patterns.
    
    optional arguments:
      -h, --help                 show this help message and exit
      -s, --server HOST          Redis Server hostname. Defaults to 127.0.0.1
      -p, --port PORT            Redis Server port. Defaults to 6379
      -a, --password PASSWORD    Password to use when connecting to the server
      -d, --db DB                Database number, defaults to 0
      -m, --match MATCH          Keys pattern to match
      -l, --limit LIMIT          Get max key matched by pattern
      -b, --behaviour BEHAVIOUR  Specify application working mode. Allowed values
                                 areall, scanner, ram, global
      -t, --type TYPES           Data types to include. Possible values are string,
                                 hash, list, set. Multiple types can be provided. If
                                 not specified, all data types will be returned.
                                 Allowed values arestring, hash, list, set, zset
      -f --format TYPE           Output type format: json or text (by default)
    

    如果您有大型数据库,请先使用 --限制选项运行 先运行有限数量的密钥。也可以使用 --类型来限制 在大型数据库中仅指定redis类型。不是这个工具有 性能问题-如果批处理,则调用单个密钥的编码 使用lua排队(就像在scanner中一样)。所以这个选择可能非常 有用的。您可以选择将从redis聚合的数据类型 使用 -b (-行为)选项作为控制台参数的节点。支持 行为包括"全局"、"扫描仪"、"RAM"和"全部"。

    内部构件

    RMA显示按类型分隔的统计信息。应用中的所有工作 以几个步骤分隔:

    1. 用lua指定模式匹配的每个密钥的加载类型和编码 以批处理模式编写脚本。 scan 用于从redis key迭代键 dB.
    2. 按类型和匹配模式分隔键。
    3. 为给定的数据集运行行为和规则。
    4. 给定报告的输出结果(现在仅文本报告已实现)
    5. < > >

全球产出("全球"行为)

全局数据是一些redis服务器统计数据,它可以帮助您 了解此工具中的其他数据:

| Stat                             | Value          |
|:---------------------------------|:---------------|
| Total keys in db                 | 28979          |
| RedisDB key space overhead       | 790528         |
| Used `set-max-intset-entries`    | 512            |
| ....                             | ...            |
| Info `total_system_memory`       | 3190095872     |
| ....                             | ...            |

这里有趣的事情之一是"redisdb密钥空间开销"。这个 redis用来存储密钥空间数据的内存量。如果你有很多 redis实例中的键这实际上显示了您的开销。 请记住,部分数据,如数据库中的总键或键空间开销 显示选定数据库的数据。但是统计是从 信息 开始的t>配置 关键字是基于服务器的。

键类型("扫描仪"行为)

这个表帮助您不知道实际上存储的是哪种密钥 在你的redis数据库中。例如,devops或系统管理员 想了解redis实例中存储了什么类型的密钥。哪个 系统中使用最多的是数据结构。如果你是新手,这也有帮助 一些大型项目-此类 显示所有表 请求:)

| Match                 |   Count | Type   | %      |
|:----------------------|--------:|:-------|:-------|
| job:*                 |    5254 | hash   | 18.13% |
| game:privacy:*        |    2675 | hash   | 9.23%  |
| user:*                |    1890 | hash   | 6.52%  |
| group:*               |    1885 | set    | 6.50%  |

数据相关输出("RAM"行为)

由键和值统计信息分隔的所有输出。这个部门是 用于:1.redis中任何类型的键实际存储在redisdb中 基于dict的内部数据结构(更多关于 重新发现星球 )。2。这类数据 在具有大量密钥的redis实例中特别重要。

| Match                         | Count | Useful |   Real | Ratio | Encoding                     | Min | Max |   Avg |
|:------------------------------|------:|-------:|-------:|------:|:-----------------------------|----:|----:|------:|
| event:data:*                  |  1198 |  17970 |  76672 |  4.27 | embstr [50.0%] / raw [50.0%] |  15 |  71 | 41.20 |
| mm:urllist:*                  |   524 |   7648 |  33536 |  4.38 | embstr [100.0%]              |  12 |  15 | 14.60 |
| Provider:ParallelForm:*:*:*:* |   459 |  43051 |  66096 |  1.54 | raw [100.0%]                 |  92 |  94 | 93.79 |
| user:spamblocked:dialy:post:* |    48 |   2208 |   4608 |  2.09 | raw [100.0%]                 |  46 |  46 | 46.00 |
| ...                           |   ... |    ... |    ... |   ... |                          ... | ... | ... |   ... |
| Total:                        |  2432 |  80493 | 200528 |  0.00 |                              |   0 |   0 |  0.00 |

所以您可以看到与给定模式匹配的键的计数,预期为 以及考虑到redis数据的真实内存 结构和分配器开销。比率和编码分布 最小/最大/平均密钥长度。例如,在上面的示例键中有些键 编码为 原始 (SDS字符串)。每个SDS编码字符串:

  1. 有效载荷
  2. 有sds字符串头开销
  3. redis对象 开销
  4. 内存分配期间的redis实现将是 align(redis object)+align(sds header+有效负载)
  5. < > >

    在x64 redis key 事件实例中:数据:f1wfqgqwgeg (24字节长度) 实际上将使用24字节有效负载字节、9字节sds头和32 r_obj中的字节( redis object )。所以我们认为这需要65 字节。但是在jemalloc分配器之后,将这个24字节(65字节的数据)对齐 在redis内部)将使用80字节-在~3,3倍于您 expect(`ratio``表中的值)。

    我们不能看价值观。所有值按redis类型单独输出。 每种类型都有自己的局限性,因此下面是每种类型的一些通用数据 类型和一些独特的。字符串的数据类型值与键相同 以上输出。唯一的区别是 free 字段,它显示 未使用但由sds字符串在 raw 编码中分配的内存。

    例如,查看 散列值的输出:

    | Match                 | Count | Avg field count | Key mem |   Real | Ratio | Value mem |   Real |    Ratio |   System | Encoding         | Total mem |  Total aligned |
    |:----------------------|------:|----------------:|--------:|-------:|------:|----------:|-------:|---------:|---------:|:-----------------|----------:|---------------:|
    | job:*                 |  5254 |            9.00 |  299485 | 619988 |  2.07 |    685451 | 942984 |     1.38 |  1345024 | ziplist [100.0%] |    984936 |        2907996 |
    | LIKE:*                |  1890 |            1.02 |    5744 |  30262 |  5.27 |      1932 |  15432 |     7.99 |    91344 | ziplist [100.0%] |      7676 |         137038 |
    | game:*:count:*        |  1231 |            1.00 |    7386 |  19696 |  2.67 |      1234 |   9848 |     7.98 |    59088 | ziplist [100.0%] |      8620 |          88632 |
    | LIKE:game:like:*      |  1207 |            1.00 |    3621 |  19312 |  5.33 |      1210 |   9656 |     7.98 |    57936 | ziplist [100.0%] |      4831 |          86904 |
    | integration:privacy:* |   530 |            3.00 |   20140 |  33920 |  1.68 |         0 |  25440 | 25440.00 |    42400 | ziplist [100.0%] |     20140 |         101760 |
    

    看看作业:* 散列。此实例包含5254个这样的键,其中9个 每个字段。看起来这些数据的结构像python 元组。这意味着您可以从redis更改此数据的数据结构。 散列 列表 并使用比现在少2倍的内存。为什么这么做? 现在您的作业:* hash使用的内存是开发人员的3,2倍 期待.

为什么报告的内存与实际使用的内存不匹配?

此工具报告的内存是近似值。一般来说, 报告的内存应该在 信息

还要注意的是,该工具没有(也不能)解释以下原因: -分配器元数据使用的内存(如果没有 c ,实际上是不可能的) -pub/sub使用的内存(redis中没有任何命令) -redis进程内部(如共享对象)

已知问题

  1. skiplist zset 实际上)编码实际上没有实现。
  2. 快速列表 现在计算为 ziplist
  3. 未实现来自redis 3.2(优化头)的sds字符串。现在 使用固定的9字节头。
  4. < > >

下一步是什么?

现在我们把这些工具当作很棒的助手。我们最常用的数据结构是 我们的redis实例是 hash list 。升级后 服务器到redis 3.2.x计划修复已知问题。很高兴知道 你在想这个工具。在M你梦见这些工具应该被使用 作为redis lint工具 嘿,把这个改成这个,节省30%的内存 嘿,您正在为字符串使用php序列化程序-更改为msgpack并节省15%的ram 等等。

许可证

此应用程序是为在 gamenet 作为redis内存的一部分投影 优化和分析。RMA是根据麻省理工学院的许可证授权的。见 许可证

RMA的更改日志

    < DL>
    0.2.0
    > UL>
  • 计算所有按键类型的TTL特性,并在按键摘要表中显示最小/最大/平均TTL。
  • 扫描密钥空间时,请替换redis密钥名称中无效的utf-8字符。
  • 0.1.16

    < Buff行情>
    • 增加了以json格式报告输出的可能性。第28期
  • 0.1.15

    < Buff行情>
    • 如果删除了包含valuestring的键,则fix 29将失败,并返回valueerror。
  • 0.1.14

    < Buff行情>
    • 如果删除了包含哈希的密钥,则修复失败,返回valueerror。 结束问题23。
  • 0.1.13

    < Buff行情>
    • 如果删除了包含整数的键,则修复失败,返回typeerror。 关闭第22期。
  • 0.1.12

    < Buff行情>
    • 如果删除了包含整数的密钥,则修复失败,并返回responseerror。 关闭第22期。
    • 在全局规则描述中添加更多信息。
  • 0.1.11

    < Buff行情>
    • 修复aws的elasticache的未知命令"debug"问题。 关闭问题21。
  • 0.1.10

    < Buff行情>
    • 每个规则都提交它们与tqdm的进度。 结束第5期。
    • 通过切换到流水线模式来检索类型,修复scanner lua脚本中的交叉时隙错误 以及对来自redis集群服务器的数据进行编码。 解决问题17的一部分。
  • 0.1.9

    < Buff行情>
    • 修复类型和行为筛选器的问题。 结束第14期。
    • 将列min和max添加到列表统计信息中。 结束第15期。
    • valueerror:min()arg是空序列。 结束问题13。
    • make setup.py use需要来自requirements.txt和来自readme.rst的信息。 结束问题8。
  • 0.1.8

    < Buff行情>
    • 再试试setup.py中的deps。 结束问题16。
  • 0.1.7

    < Buff行情>
    • 再试试setup.py中的deps。 结束问题16。
  • 0.1.6

    < Buff行情>
    • 修正按键显示百分比问题。 结束问题13。
    • 修复setup.py中python 3.4的无效语法。 结束问题16。
  • 0.1.5

    • 修复valuestring中的日志记录问题
  • 0.1.4

    • 固定管道深度
  • 0.1.3

    • 将模式聚合移动到单独的过程
    • 在scanner lua脚本中检索密钥编码并提高性能~1,75倍。 结束问题4。
    • 许多来自landscape的pylint警告和代码样式
  • 0.1.2

    • 修正了在调试值字符串中的sdslen时,没有这样的键responseerror的问题。 关闭问题1。
    • 修正错误的行为,如果使用非0分贝。 关闭问题2。
    • 修复由于不允许使用 config 命令而导致的Elasticache崩溃。 结束问题3。
  • 0.1.1

    • 准备PIP分发
  • 0.1.0

    • 初始版本
    • 支持字符串、哈希、集、列表
  • 欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


    热门话题
    java访问私有字段而不使用getter方法?   使用PowerMockito在JavaEWSAPI中模拟测试拉订阅   启动活动时未保存java首选项并清除变量   java如何在servlet中检索子域?斯普林有帮手吗   java使用Docker从命令行构建Android项目   java Android,ActionBar后退按钮(setDisplayHomeAsUpEnabled(true))重新创建父活动   java在重用FileOutputStream时应该关闭流吗?   java使用RESTAPI将文件上载到s3 bucket   Java SOAP Web服务应用程序中的mysql用户登录方法不工作   java使用多个数字计算百分比并转换为长   java Android SQLiteDatabase查询忽略空格   java如何在Javafx中比较两个字段文本   java错误:未设置java_HOME,在Eclipse安装后找不到   java在安卓中保存对象   java如何使用jaxws从返回List<Object>的服务中检索值   java Google OAuth2 JWT令牌验证异常   SpringMVC中的JavaUTF8编码问题,当从JSP表单发送POST请求中的越南语信件时   java从webview重定向到安卓应用程序   JUnit 5中多个扩展的java顺序