Developers
Resource
文档评分
Findability
Accuracy
Completeness
Readability
在线提单
论坛求助

使能内存超分

  1. 为Redis配置超分策略命令格式如下。
    ubsectl change process-mem (-p <pid> | -n <name>) -s <size> -r <remote-ratio>
    表1 参数说明

    参数

    说明

    -p, --pid

    目标进程PID,范围1~4194304。与--name互斥,必须二选一。

    -n, --name

    目标进程名(comm),最长15字符,仅含字母/数字/点/冒号/下划线/连字符。与--pid互斥,必须二选一。按进程名配置时,后续新启动的同名进程会被自动发现并纳管。

    -s, --size

    进程期望最大内存大小,范围128M到32G,支持单位B/K/M/G(二进制),最多两位小数(如512M、1G、1.5G)。

    -r, --remote-ratio

    远端内存占比上限,范围0.0到1.0,最多两位小数。配置为0.0时该进程不参与远端借用。

    • -p与-n必须且只能指定其一。
    • 按PID配置时进程必须存在;按进程名配置时,后续新启动的同名进程会被自动发现并纳管。
    • 若Redis以root用户运行且filter_root_process=true(默认),按PID配置会被拒绝。需将filter_root_process设为false后重启UBSE,或改用非root用户运行Redis。
    • 单个进程的可迁移上限 = 进程实际内存占用 × remote-ratio。该值需大于等于一个迁移块(默认128MB),否则进程无法借出远端内存。
    以下以controller节点7001实例为例配置内存超分。如果按PID配置使用如下命令。
    ubsectl change process-mem -p $pid -r 0.5 -s 128M

    如果按进程名配置则使用以下命令:

    ubsectl change process-mem -n redis-server -s 128M -r 0.5

    这里为Redis进程期望最大内存规模为128M,远端内存占比上限为50%,即允许将最多50%的内存迁移到远端NUMA。当本地NUMA总空闲内存低于pressing_free_threshold(默认15GB)时,系统自动借用远端内存并迁移Redis页面。当本地空闲内存持续回升(观测窗口最小值高于pressing_free_threshold)时,自动迁回并归还远端内存。

  2. 执行以下命令查询已配置的纳管进程。
    ubsectl display process-mem -t config

    执行以下命令查询当前实际纳管(匹配到)的进程明细。

    ubsectl display process-mem -t proc_detail

    输出以表格回显,列为PID、Name、Size、RemoteRatio。config回显所有持久化的纳管配置(按PID配置的Name显示为N/A);proc_detail回显当前真正纳管的进程(按PID配置命中时Name固定为N/A,否则显示实际匹配的配置名)。

  3. 查询7001实例负责的Slot,如图表示7001负责“0-5460”的Slot。
    redis-cli -h 192.168.100.100 -p 7001 cluster nodes

    执行以下命令验证落到7001实例的Hash Tag,这里得到TAG=tag0 SLOT=49。

    for i in $(seq 0 10); do
        slot=$(redis-cli \
            -h 192.168.100.100 \
            -p 7001 \
            cluster keyslot "{tag${i}}:test" 2>/dev/null)
    
        if [ "${slot}" -ge 0 ] && [ "${slot}" -le 5460 ]; then
            echo "TAG=tag${i} SLOT=${slot}"
            break
        fi
    done
    这里使用tag0构造可以落到7001实例的Hash Tag,执行以下命令,逐步写入1GB数据。
    for i in $(seq 1 1000000)
    do
        echo "SET {tag0}:key_${i} $(printf '%01024d' 1)"
    done | redis-cli \
        -h 192.168.100.100 \
        -p 7001 \
        --pipe
  4. 同时执行以下命令监测进程使用情况,可观测到内存使用逐步增加。
    watch -n 1 "grep -E 'VmRSS|VmSize' /proc/$pid/status"

  5. 当监测到VmRSS超过期望值即102.4MB时,查看确认是否触发内存超分机制,健康状态下应能观察到借用成功和迁出相关记录。
    grep -E '709889|Memory Borrow|MigrateOut|needBorrow|remote memory|fault|timeout'     /var/log/ubse/process_mem.log | tail -n 200

  6. 查询节点内存借入信息命令格式如下。
    ubsectl display memory -t node_borrow
    查询借用账本命令格式如下。
    ubsectl display memory -t borrow_detail [-bt <type>] [-n <name>]
    表2 输入参数

    字段名

    字段描述

    字段取值

    -bt,--borrow-type

    可选,根据借用类型过滤

    可选值:[ numa | fd | share ]

    -n,--name

    可选,根据内存名过滤各个节点、各个类型的同名内存都会显示

    字符串,长度为1~47,仅可包括大小写字母、数字、"."、":"、"-"以及"_"

    例如执行以下命令,如下回显信息表明:controller节点已经从controller1节点的NUMA 1(236)成功借入总计256 MiB的NUMA内存;这两笔借用由PID 709889的ProcessMem管理流程创建。该进程内存超分已经成功生效。
    ubsectl display memory -t node_borrow
    ubsectl display memory -t borrow_detail -bt numa

  7. (可选)执行以下命令取消进程纳管。取消前会自动执行迁回与归还,清理借用内存。
    ubsectl remove process-mem -p <pid>
    ubse-cli remove process-mem -n <name>