获取redis实例绑定cpu的情况
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的情况的更多相关文章
- 获取redis实例中最大的top-N key
需求:获取redis实例中最大的top-N key 说明:由于redis 4.x才引入了memory usage keyname的语法.3.x不支持! db_ip=5.5.5.101 db_port= ...
- 从阿里云迁移分布式redis实例到华为云解决方案(详细)
如果要换多数是经济因素啦- 一. 准备工作 先在华为云上买一台redis数据库,配置一定要注意多数要保持一致,至于4.0还是5.0倒问题不大亲测兼容 可用区要找现有ECS云主机中的相同的机器.记下:这 ...
- 一次线上redis实例cpu占用率过高问题优化(转)
前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然而然就把redis也挪到我 ...
- redis实例cpu占用率过高问题优化
目录 一.简介 一.简介 前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然 ...
- 获取CPU使用情况信息(转)
获取了内存使用情况,也可以使用PHP的 getrusage()获取CPU使用情况,该方法在windows下不可用. print_r(getrusage()); /* 输出 Array ( [ru ...
- 获取redis cluster中所有节点的内存使用情况
需求:获取redis cluster集群中所有节点的内存使用情况. ip_port=`redis-cli -h $ -p $ -a abc123 -c cluster nodes | awk '{pr ...
- 获取redis指定实例中所有的key
需求:获取redis指定的实例中所有的key的名字. 千万不要使用keys *,可以使用scan命令的递归方式获取. 以下给出自己写的脚本,经过测试效果还可以. db_ip=5.5.5.101 db_ ...
- Redis优化之CPU充分利用
Linux Redis Server之CPU充分利用 不知道大家有没有注意到你们公司的集群配置是否是有一种配置是这样的: 多个Redis Server分布在同一个节点,只是端口不同,如果有的话,应该是 ...
- NGINX源代码剖析 之 CPU绑定(CPU亲和性)
作者:邹祁峰 邮箱:Qifeng.zou.job@gmail.com 博客:http://blog.csdn.net/qifengzou 日期:2014.06.12 18:44 转载请注明来自&quo ...
随机推荐
- 21种JavaScript设计模式最新记录(含图和示例)
最近观看了<Javascript设计模式系统讲解与应用>教程,对设计模式有了新的认识,特在此做些记录. 一.UML 文中会涉及众多的UML类图,在开篇需要做点基础概念的认识.以下面的图为例 ...
- 温故知新,.NET 重定向深度分析
在早期的.NET Framework程序员心里,重定向Redirect其实分为两种: Response.Redirect: Response对象的Redirect方法提供了一种实现客户端重定向的方法 ...
- Android触摸事件传递机制,这一篇就够了
整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...
- Ajax等待返回结果时,弹出一个友好的等待提示
巧用Ajax的beforeSend 提高用户体验 jQuery是经常使用的一个开源js框架,其中的$.ajax请求中有一个beforeSend方法,用于在向服务器发送请求前执行一些动作. 具体可参考j ...
- 《 Java 编程思想》CH05 初始化与清理
< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...
- Spring Boot自动装配原理源码分析
1.环境准备 使用IDEA Spring Initializr快速创建一个Spring Boot项目 添加一个Controller类 @RestController public class Hell ...
- JMeter之If Controller深究二
1.背景 接上文JMeter之If Controller深究一,在上文中提到压测采用的是JMeter3.1版本,本篇继续深究.基本确定问题原因后,宝路这边又做了不同版本的JMeter对比实验,这次加入 ...
- 自定义内建模块 - Python Build Your Own Built-In Module
在 python 中, 用户可以通过 py 文件创建自定义的 module, 也可以通过 C 创建 dll, 扩展 python module. 当用户在一个正在编辑的模块 module 中, 引入( ...
- [Effective Java 读书笔记] 第三章类和接口 第二十三-- ??条
第二十三条 请不要再新代码中使用原生态类型 1 使用原生态类型,就失去了泛型在安全性和表述性方面的所有优势,所以新代码中不要使用原生态类型 2 List<String>可以传递给List作 ...
- ansible实现SSH配置免密互信
Ansible是用来处理大批量重复性操作的工具,只需要在一台机器上就可以远程控制所有机器,但前提是必须保证每台机器之间SSH可以相互免密登录.关于Ansible的安装和环境准备请参考Ansible环境 ...