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

其实可以对指定的进程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

 

添加一下输出优化,直观看出来是不是绑定了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}')
bind_current=$(taskset -pc $pid | awk -F':' '{print $2}')
total=$(cat /proc/cpuinfo |grep processor |wc -l)
start=0
let end=total-1
bind_default="$start-$end"
if [[ $bind_current -ne $bind_default ]];then
echo "$port instance bind on cpu $bind_current ok"
else
echo "$port instance not set bind cpu default $bind_default,please check!!!"
fi
done
rm -rf pid_instance

如果没有绑定:

[root@testdb1 ~]# sh c.sh
6379 instance not set bind cpu default 0-23,please check!!!
29009 instance not set bind cpu default 0-23,please check!!!
29095 instance not set bind cpu default 0-23,please check!!!
27000 instance not set bind cpu default 0-23,please check!!!
27001 instance not set bind cpu default 0-23,please check!!!
29001 instance not set bind cpu default 0-23,please check!!!
29002 instance not set bind cpu default 0-23,please check!!!
29003 instance not set bind cpu default 0-23,please check!!!
29004 instance not set bind cpu default 0-23,please check!!!
29005 instance not set bind cpu default 0-23,please check!!!
29006 instance not set bind cpu default 0-23,please check!!!
29007 instance not set bind cpu default 0-23,please check!!!
29008 instance not set bind cpu default 0-23,please check!!!
29000 instance not set bind cpu default 0-23,please check!!!

如果有绑定

27183 instance bind on cpu  1 ok
27184 instance bind on cpu 2 ok
27185 instance bind on cpu 3 ok
27186 instance bind on cpu 4 ok
27187 instance bind on cpu 5 ok
27188 instance bind on cpu 6 ok
27189 instance bind on cpu 7 ok
27190 instance bind on cpu 8 ok
27191 instance bind on cpu 9 ok
27192 instance bind on cpu 10 ok
27193 instance bind on cpu 11 ok
27194 instance bind on cpu 11 ok
27195 instance bind on cpu 10 ok
27196 instance bind on cpu 9 ok
27197 instance bind on cpu 8 ok

@20190509

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}')
bind_current=\$(taskset -pc \$pid | awk -F':' '{print \$2}')
total=\$(cat /proc/cpuinfo |grep processor |wc -l)
start=0
let end=total-1
bind_default="\$start-\$end"
if [[ \$bind_current -ne \$bind_default ]];then
echo "\$port instance bind on cpu \$bind_current ok"
else
echo "\$port instance not set bind cpu default \$bind_default,please check!!!" >> no_bind.log
fi
done
rm -rf pid_instance
EOF 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" > /dev/null
ansible -i \$1 all -m shell -s -a "cd /tmp;sh get_redis_bind_cpu.sh" > /dev/null
ansible -i \$1 all -m shell -s -a "ls -l /tmp/no_bind.log 2>/dev/null" EOF PS:
1.执行前确保ansible到目标所有redis实例的机器可以跑通。
2.执行sh redis_cpu.sh redis_host |grep -v FAILED
3.有输出的即是对应主机上redis实例存在没有绑定cpu的,具体实例端口在对应机器的/tmp/no_bind.log

  

获取redis实例绑定cpu的情况的更多相关文章

  1. 获取redis实例中最大的top-N key

    需求:获取redis实例中最大的top-N key 说明:由于redis 4.x才引入了memory usage keyname的语法.3.x不支持! db_ip=5.5.5.101 db_port= ...

  2. 从阿里云迁移分布式redis实例到华为云解决方案(详细)

    如果要换多数是经济因素啦- 一. 准备工作 先在华为云上买一台redis数据库,配置一定要注意多数要保持一致,至于4.0还是5.0倒问题不大亲测兼容 可用区要找现有ECS云主机中的相同的机器.记下:这 ...

  3. 一次线上redis实例cpu占用率过高问题优化(转)

    前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然而然就把redis也挪到我 ...

  4. redis实例cpu占用率过高问题优化

    目录 一.简介 一.简介 前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然 ...

  5. 获取CPU使用情况信息(转)

    获取了内存使用情况,也可以使用PHP的 getrusage()获取CPU使用情况,该方法在windows下不可用.    print_r(getrusage()); /* 输出 Array ( [ru ...

  6. 获取redis cluster中所有节点的内存使用情况

    需求:获取redis cluster集群中所有节点的内存使用情况. ip_port=`redis-cli -h $ -p $ -a abc123 -c cluster nodes | awk '{pr ...

  7. 获取redis指定实例中所有的key

    需求:获取redis指定的实例中所有的key的名字. 千万不要使用keys *,可以使用scan命令的递归方式获取. 以下给出自己写的脚本,经过测试效果还可以. db_ip=5.5.5.101 db_ ...

  8. Redis优化之CPU充分利用

    Linux Redis Server之CPU充分利用 不知道大家有没有注意到你们公司的集群配置是否是有一种配置是这样的: 多个Redis Server分布在同一个节点,只是端口不同,如果有的话,应该是 ...

  9. NGINX源代码剖析 之 CPU绑定(CPU亲和性)

    作者:邹祁峰 邮箱:Qifeng.zou.job@gmail.com 博客:http://blog.csdn.net/qifengzou 日期:2014.06.12 18:44 转载请注明来自&quo ...

随机推荐

  1. Nodejs实战系列:数据加密与crypto模块

    博客地址:<NodeJS模块研究 - crypto> Github :https://github.com/dongyuanxin/blog nodejs 中的 crypto 模块提供了各 ...

  2. 【大白话系列】MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计

    一.存储引擎 上节我们最后说到,SQL 的执行计划是执行器组件调用存储引擎的接口来完成的. 那我们可以理解为:MySQL 这个数据库管理系统是依靠存储引擎与存放数据的磁盘文件进行交互的. 那么 MyS ...

  3. 《 Java 编程思想》CH03 操作符

    < Java 编程思想>CH03 操作符 在最底层,Java中的数据是通过操作符来操作的. 操作符 +,-,*,*,=与其他语言类似 几乎所有的操作符只能操作"基本类似" ...

  4. Serverless 的资源评估与成本探索

    Serverless 布道师在讲解 Serverless 架构和云主机等区别的时候,总会有类似的描述: 传统业务开发完成想要上线,需要评估资源使用.根据评估结果,购买云主机,并且需要根据业务的发展不断 ...

  5. ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充

    原文地址:  ASP.NET Core 2.2 WebApi 系列[九]使用SignalR 今天,看到了大牛的这篇博文,  发了一下评论, 我很惊喜, 没想到他很快就回复了我,  而且通过QQ帮助了S ...

  6. Go语言实现:【剑指offer】数组中只出现一次的数字

    该题目来源于牛客网<剑指offer>专题. 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 正常能想到哈希表来处理,但此题考查的是异或的知识, ...

  7. 基于 HTML5 WebGL 的智慧楼宇三维可视化监控

    前言 可视化的智慧楼宇在 21 世纪是有急迫需求的,中国被世界称为"基建狂魔",全球高层建筑数量位居首位,所以对于楼宇的监控是必不可少.智慧楼宇可视化系统更多突出的是管理方面的功能 ...

  8. 实验楼-python3简明教程笔记

    #!/usr/bin/env python3 days = int(input("Enter days: ")) print("Months = {} Days = {} ...

  9. Python3 (一) 基本类型

    前言: 什么是代码? 代码是现实世界事物在计算机世界中的映射. 什么事写代码? 写代码是将现实世界中的事物用计算机语言来描述. 一.数字:整形与浮点型 整型:int 浮点型:float (没有单精度和 ...

  10. RTEMS进程同步机制

    互斥量 好像没有互斥量,信号量接收那儿有个图,互斥量似乎术语一类特殊的信号量. 信号量 12. Semaphore Manager 12.1. Introduction The semaphore m ...