• redis在物理机部署模式下如何进行资源[cpu、网卡]隔离


    上周末晚上运营做直播,业务代码不规范,访问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亲和。  
     

  • 相关阅读:
    爬过的第一个坑
    Ecshop后台邮件群发
    ECShop 首页调用积分商城里面的的商品
    隐藏select右边的箭头按钮
    让IE6支持PNG透明图片
    PHP替换函数,一些正则!
    php判断终端是手机还是电脑访问网站代码
    ECshop在文章列表页调用文章简介
    Ecshop删除no_license点击查看 云登陆失败,您未有license
    Ecshop商品相册鼠标经过小图切换显示大图
  • 原文地址:https://www.cnblogs.com/juanmaofeifei/p/13589958.html
Copyright © 2020-2023  润新知