redis是一个单线模型的nosql类型的数据库,而目前接触到的服务器大都是多核的,比如8c,16c,32c,64c等等。为了充分利用主机,在一台主机上必然会部署多个redis实例,默认情况cpu会随机选择,但经过观察自动选择的时候很大情况下会选择同一逻辑cpu,这样导致cpu使用不均衡,撑得死了,饿的饿死了,怎么破。

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

其实可以对指定的进程id进行cpu绑定,绑定前的情况如下:

 

27001 instance bind on cpu  0-7
27002 instance bind on cpu  0-7
27003 instance bind on cpu  0-7
27004 instance bind on cpu  0-7
27005 instance bind on cpu  0-7
27007 instance bind on cpu  0-7
27008 instance bind on cpu  0-7

 

生成绑定的命令

ps aux|grep redis-server |grep -v grep |awk 'BEGIN {i=0}{i++}{print "taskset -pc " i, $2}'

  

绑定后的情况如下:

27001 instance bind on cpu  1
27002 instance bind on cpu  2
27003 instance bind on cpu  3
27004 instance bind on cpu  4
27005 instance bind on cpu  5
27007 instance bind on cpu  6
27008 instance bind on cpu  7

 

绑定后获取cpu绑定情况的确认脚本如下:

ps -ef |grep redis-server |grep -v grep | awk '$NF~/cluster/{print $2,$(NF-1);next}{print $2,$NF}' > pid_instance

cat pid_instance | while read line
do
	pid=$(echo $line | awk '{print $1}')
	port=$(echo $line | awk -F':' '{print $2}')
	echo "$port instance bind on cpu `taskset -pc $pid | awk -F':' '{print $2}'`"
done
rm -rf pid_instance

 

如果有很多台redis实例,可以通过ansible分发该脚本到对应的主机上,然后跑一下sh redis_cpu.sh xxx脚本,xxx文件中是以all为分组的redis主机列表,例如:

cat >redis_cpu.sh <<EOF
#!/bin/bash

ansible -i $1 all -m copy -s -a "src=./get_redis_bind_cpu.sh dest=/tmp/get_redis_bind_cpu.sh"
ansible -i $1 all -m shell -s -a "sh get_redis_bind_cpu.sh"
EOF

cat >get_redis_bind_cpu.sh <<EOF
#!/bin/bash

ps -ef |grep redis-server |grep -v grep | awk '$NF~/cluster/{print $2,$(NF-1);next}{print $2,$NF}' > pid_instance

cat pid_instance | while read line
do
        pid=$(echo $line | awk '{print $1}')
        port=$(echo $line | awk -F':' '{print $2}')
        echo "$port instance bind on cpu `taskset -pc $pid | awk -F':' '{print $2}'`"
done
rm -rf pid_instance
EOF

  

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄