获取redis实例绑定cpu的情况
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

更多精彩