配置进程NUMA绑核

目的

根据Redis Node在集群中的角色可以将具体的实例分为Master和Slave两类,其中,Master节点负责request的处理,写入、读取、更新数据,定时同步数据到备用Redis Node,数据持久化。Slave节点负责当主用Redis Node故障时,取代主用Redis Node对外提供服务。由于角色不同,在实际业务中,Master实例需要更多的CPU资源与网络资源,因此在Redis集群部署完成后,根据Redis节点在集群中负责的角色,将相应的Redis实例进行NUMA绑核操作。当集群规模不同时,需要调整该绑核策略以发挥不同规模集群的最优性能。

方法

  1. 获取当前集群的节点(实例)信息,首先使用如下命令通过集群中任一节点登录集群。

    1
    redis-cli -h ip_server -p port_server
    

    以下参数请根据实际情况修改:

    • ip_server:Redis服务器所在的IP地址。
    • port_server:Redis服务器所监听的端口号。

  2. 查询当前集群各节点的角色信息,示例如下(简化版),可以看到通过该方式可以获得当前集群中各个实例的具体角色,将该信息保存至临时文件tmp_nodes_info.log中。

    1
    cluster nodes
    

  3. 根据实例的角色进行绑核,因为Redis集群是部署在多个物理服务器上的分布式数据库,因此需要分别获取每个服务器上Redis实例的角色信息。使用如下命令从tmp_nodes_info.log中批量获取属于某个服务IP地址的实例角色信息。

    1
    2
    local_master_ports=(cat tmp_nodes_info.log |grep "master"|awk '{print $2}'|awk -F@ '{print $1}' | grep ip_server | awk -F: '{print $2}')
    local_slave_ports=(cat tmp_nodes_info.log |grep "slave"|awk '{print $2}'|awk -F@ '{print $1}'|grep ip_server | awk -F: '{print $2}')
    

    ip_server:Redis服务器所在的IP地址,请根据实际情况修改。

  4. 根据local_master_ports和local_slave_ports中的端口信息获取相应的进程PID,再根据PID对相应的Redis实例进行绑核操作。

    1
    2
    pid=(ps -ef | grep "redis" | grep port | awk '{print $2}')
    taskset -cp destCores pid
    

    以下参数请根据实际情况修改:

    • port:需要绑核的Redis实例的端口号。
    • pid:需要绑定CPU核的进程ID。
    • destCores:需要绑定的CPU核。