上周末晚上运营做直播,业务代码不规范,访问1个redis竟然把1台服务器的网卡打满了,这台服务器上的其他redis服务都受到了影响。之前没有做这方面的预案,当时又没有空闲的机器可以迁移,在当时一点办法都没有,尴尬啊,就这样拖到了直播结束。结束后做复盘,leader对数据库这边要求必须对数据库使用服务器资源有限制方案。结合我们的数据库部署情况,mysql都是单实例部署,问题不大;redis是直接在服务器上做多实例部署,因此主要就是限制redis的cpu和网卡流量。

1. linux如何限制网卡流量

流量控制的基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系, 每当内核需要将报文分组从网卡发送出去, 都会首先将该报文分组添加到该网卡所配置的队列中, 由该队列决定报文分组的发送顺序。在队列中将不同的报文使用不同的过滤器(Filter)来分组分成不同的类别(Class),并根据不同的原则, 以不同的顺序发送队列中的报文分组。

2. 带宽互斥

2.1 针对网卡建立根htb队列:

需要限流的端口为 9001, 网卡为 eth0

v_port=9001

veth=eth0

tc qdisc add dev ${veth} root handle 1:0 htb default 11

#add dev ${veth} 表示针对 veth 网卡创建队列

#root 表示添加的是1个根队列

#handle 1:0 标识该队列

#htb 表示要添加的队列为HTB队列

#default 11 是htb队列特有的参数,表示所有未分类的流量都分配给 1:11

2.2 为根队列创建两个类别:

tc class add dev ${veth} parent 1:0 classid 1:11 htb rate 64mbps ceil 64mbps burst 640k

tc class add dev ${veth} parent 1:0 classid 1:12 htb rate 64mbps ceil 64mbps burst 640k

#parent 1:0 表示类别的父亲为根队列 1:0

#classid 1:11 标识该类别;其中 1:11 为1.1中指定的未分类的流量分配类别

#rate 64Mbit 表示系统为该类别确保带宽为 64M

#ceil 64Mbit表示该类别最高可占用带宽为 64M

#burst 640k 令牌桶大小,应对突发流量,官方建议1M/s数据流对应 10k的令牌桶大小

2.3 为各个类别设置过滤器

对出口流量进行限制

tc filter add dev ${veth} protocol ip parent 1:0 prio 1 u32 match ip sport ${v_port} 0xffff flowid 1:12

#protocol ip 表示过滤器检查tcp报文分组的协议字段

#prio 1 表示这些过滤器对报文处理的优先级是相同的,对于不同优先级的过滤器,系统将按照从小到大的优先级

#u32 match ip sport ${v_port} 0xffff  表示采用 u32 选择器来匹配不同的数据流,sport表示匹配的是sport字段, 如果该字段与 0xffff的与操作结果是 ${v_port}

#flowid 1:12 表示将该数据流分配给类别 1:12

这种方式共创建了两个类别,1:11 和 1:12, 1:11给为未分类的流量使用,1:12给分类的流量使用;这两个类别的数据流之间是互斥的,即当 1:11 的数据流没有达到最大流量配额时,剩余的带宽不能被 1:12 数据流使用,造成了带宽浪费。

3. 多个数据流共享一定的带宽

3.1 针对网卡建立根htb队列:

v_port=9001

veth=eth0

tc qdisc add dev ${veth} root handle 1:0 htb default 11

3.2 为根队列创建根类别

tc class add dev ${veth} parent 1:0 classid 1:1 htb rate 128mbps ceil 128mbps burst 1280k

tc class add dev ${veth} parent 1:1 classid 1:11 htb rate 64mbps ceil 128mbps burst 640k

tc class add dev ${veth} parent 1:1 classid 1:12 htb rate 64mbps ceil 128mbps burst 640k

# 类别 1:11 和 1:12 是 1:1 的子类别,因此他们可以共享分配的 128M带宽,同时,又确保当需要时,自身的带宽至少有 64M。

3.3 为类别设置过滤器

tc filter add dev ${veth} protocol ip parent 1:0 prio 1 u32 match ip sport ${v_port} 0xffff flowid 1:12

这种方式下带宽在各个类别之间进行共享,同时又确保各进程有一定的基础带宽。

4. desc

4.1 显示队列状况

tc -s qdisc ls dev ${veth}

4.2 显示分类状况

tc -s class ls dev ${veth}

4.3 显示过滤器的状况

tc -s filter ls dev ${veth}

5. 维护操作

5.1 过滤器删除

tc filter del dev ${veth} parent 1:0 prio 1 u32 match ip sport ${v_port} 0xffff

5.2 类别删除

5.3 队列删除

tc qdisc del dev ${veth} root

## 队列删除之后,该队列上的类别、过滤器都会被删除

6. 对CPU进行限制

isolcpus 是将指定的CPU从内核调度算法中删除,使得操作系统不会向指定的CPU上调度任务,将指定的CPU孤立出来。同时,通过taskset亲和性设置将指定的进程指定到特定的CPU上运行;通过这种方式,确保redis进程和系统进程 、监控进程等互相隔离,同时确保各redis进程之间互相隔离。

6.1 设置方式:
a.  centos6: 在 /boot/grub/grub.conf 文件中定位到 kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=08143ae2-e0ba-4181-a1f7-02ec210cded6 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet   这一行,在这一行后面添加启动参数 isolcpus=2,3,4 来设置需要孤立的CPU;而后重启系统,通过 cat /proc/cmdline 命令来进行验证。

b. 在进程启动后通过 taskset -pc ${cpunum} ${pid} 来设置CPU亲和。

redis在物理机部署模式下如何进行资源[cpu、网卡]隔离的更多相关文章

  1. Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip

    目录 Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip 场景 过程还原 结论 参考资料 Nginx+Docker部署模式下 asp.net core 获取真实的客户端 ...

  2. Apache Spark技术实战之8:Standalone部署模式下的临时文件清理

    未经本人同意严禁转载,徽沪一郎. 概要 在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件,这些临时目录和文件又是在什么时候被清理,本文将就这些问题做深入细致的解答. 从 ...

  3. Apache Spark技术实战之6 --Standalone部署模式下的临时文件清理

    问题导读 1.在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件? 2.在Standalone部署模式下分为几种模式? 3.在client模式和cluster模式下有什么 ...

  4. Apache Spark源码走读之15 -- Standalone部署模式下的容错性分析

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就standalone部署方式下的容错性问题做比较细致的分析,主要回答standalone部署方式下的包含哪些主要节点,当某一类节点出现问题时,系统是如 ...

  5. vmware桥接模式下主机有多个网卡导致虚拟机网络不通

    桥接模式下,vmware会绑定一个物理网卡,因此有多个物理网卡时就要注意当前绑定的物理网卡.打开如下vmware菜单 可以看到VMnet0是桥接模式用的,然后他可以选择绑定一个物理网卡,注意要正确选择 ...

  6. IIS8集成模式下打开静态资源被aspx处理程序处理,StaticFileModule失效问题分析

    问题描述: 打开js,css,jpg之类的静态资源文件触发了asp.net mvc的权限认证,并不是直接返回静态内容 问题分析: StaticFileModule 失效 ,可能是文件权限问题 问题解决 ...

  7. win10的VMware虚机host-only模式下,虚拟机无法ping通物理机,而物理机能ping通虚机

    1.打开控制面板—->Windows防火墙(win10操作系统) 2.点击最上面的”允许应用或功能通过xxxxx” 3.勾上上图的“文件和打印机共享” 然后点确定.

  8. redis 学习笔记3(哨兵模式下分布式锁的实现以及全局唯一id的生成)

    redis实现分布式锁和全局唯一id应该是较为常见的应用. 实现基于redis的setNX,以及incr命令.还是比较简单的! 搭建环境以及配置好sping整合,做了下测试,有兴趣的载下来看看,自己做 ...

  9. redis几种模式的部署(Windows下实现)

    <参考>http://www.cnblogs.com/ruiati/p/6374152.html 1.   自行下载redis客户端.redis官方不支持Windows系统,所以官网上是下 ...

随机推荐

  1. maven——使用阿里云镜像

    1.在本地的仓库目录下找到settings.xml文件,添加 <mirrors> <mirror> <id>alimaven</id> <name ...

  2. 萌新看过来,你还学不懂VScode插件吗?

    一.前言 VSCode是微软家一个非常轻量化的编辑器,体量虽轻,但是却有异常强大的功能.原因在于VSCode许多强大功能都是基于插件实现的,IDE只提供一个最基本的框架和基本功能,我们需要使用插件来丰 ...

  3. 4月4日 python学习总结 os pickle logging

    1.序列化和反序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickl ...

  4. HT4936S锂电池充放电芯片,充电宝芯片

    应用电路 引脚定义 参考 http://www.hotchip.com.cn/products/

  5. bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机)

    bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条 ...

  6. 什么是GUI?

    图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面.图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠 ...

  7. chrome删除保存的密码

    chrome删除保存的密码 关于谷歌密码管理器 该管理器是将我们的密码管理在google的账号中,当然,谷歌是说用了加密技术保存的,不会存储明文. https://passwords.google.c ...

  8. Java BlockingQueue是什么?

    Java BlockingQueue是一个并发集合util包的一部分.BlockingQueue队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素.

  9. 百度移动统计调用api教程,少进坑(82001错误)

    相信很多小伙伴使用了百度统计,来查看自己应用使用的情况,但是会发现百度移动统计在官网没有api调用取数据的接口, 现在我就以自己成功调用api并且成功拿到数据,将这个步骤给大家参考,(末尾有调用移动统 ...

  10. vue中基于sortablejs与el-upload实现文件上传后拖拽排序

    今天做冒烟测试的时候发现商品发布有一个拖拽图片排序功能没做,赶紧加上 之前别的同事基于 vuedraggable 实现过这个功能,我这里自己深度封装了 el-upload ,用这种方式改动很大,而且感 ...