Skip to content

Instantly share code, notes, and snippets.

@ethercflow
Created May 29, 2018 09:45
Show Gist options
  • Save ethercflow/0cb3a231d56bc90b87a946bd84372dac to your computer and use it in GitHub Desktop.
Save ethercflow/0cb3a231d56bc90b87a946bd84372dac to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import os
import threading
def uplink(ucycle, uspeed, ustep):
os.system('sudo tc qd del dev em1 root handle 1')
os.system('sudo tc qdisc replace dev em1 root handle 1: htb default 20')
os.system('sudo tc class replace dev em1 parent 1: classid 1:1 htb rate %skbit' % uspeed)
os.system('sudo tc filter replace dev em1 protocol ip parent 1: prio 1 u32 match ip dst 172.16.21.3 flowid 1:1')
os.system('sudo tc filter replace dev em1 protocol ip parent 1: prio 1 u32 match ip dst 172.16.21.4 flowid 1:1')
os.system('sudo tc filter replace dev em1 protocol ip parent 1: prio 1 u32 match ip dst 172.16.21.5 flowid 1:1')
uspeed += ustep
if uspeed <= 0:
uspeed = 10
t = threading.Timer(ucycle, uplink, (ucycle, uspeed, ustep))
t.start()
def downlink(dcycle, dspeed, dstep):
os.system('sudo tc qdisc replace dev em1 handle ffff: ingress')
os.system('sudo tc filter replace dev em1 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0')
os.system('sudo tc qdisc add dev ifb0 root handle 2: htb')
os.system('sudo tc class replace dev ifb0 parent 2: classid 2:1 htb rate %skbit' % dspeed)
dspeed += dstep
if dspeed <= 0:
dspeed = 10
t = threading.Timer(dcycle, downlink, (dcycle, dspeed, dstep))
t.start()
def delay(lcycle, latency, lstep):
os.system('sudo tc qdisc replace dev ifb0 parent 2:1 handle 11: netem delay %dms' % latency)
os.system('sudo tc filter replace dev ifb0 protocol ip parent 2: prio 1 u32 match ip src 172.16.21.3 flowid 2:1')
os.system('sudo tc filter replace dev ifb0 protocol ip parent 2: prio 1 u32 match ip src 172.16.21.4 flowid 2:1')
os.system('sudo tc filter replace dev ifb0 protocol ip parent 2: prio 1 u32 match ip src 172.16.21.5 flowid 2:1')
latency += lstep
if latency < 0:
latency = 0
t = threading.Timer(lcycle, delay, (lcycle, latency, lstep))
t.start()
def parse_opts():
parser = argparse.ArgumentParser(prog='xiannet')
parser.add_argument('--ubase', type = int, help='base uplink bandwidth')
parser.add_argument('--ustep', type = int, help='base uplink bandwidth step')
parser.add_argument('--dbase', type = int, help='base downlink bandwidth')
parser.add_argument('--dstep', type = int, help='base downlink bandwidth step')
parser.add_argument('--bcycle', type = int, help='bandwidth cycle')
parser.add_argument('--latency', type = int, help='latency')
parser.add_argument('--lstep', type = int, help='latency step')
parser.add_argument('--lcycle', type = int, help='latency cycle')
subparsers = parser.add_subparsers(help='sub-command help')
parser_inc = subparsers.add_parser('inc', help='inc iodelay')
parser_inc.set_defaults(func=inc)
parser_dec = subparsers.add_parser('dec', help='dec iodelay')
parser_dec.set_defaults(func=dec)
return parser.parse_args()
def inc(args):
if args.ubase:
uplink(args.bcycle, args.ubase, args.ustep)
if args.dbase:
downlink(args.bcycle, args.dbase, args.dstep)
if args.latency:
delay(args.lcycle, args.latency, args.lstep)
def dec(ages):
if args.ubase:
uplink(args.bcycle, args.ubase, -args.ustep)
if args.dbase:
downlink(args.bcycle, args.dbase, -args.dstep)
if args.latency:
delay(args.lcycle, args.latency, -args.lstep)
if __name__ == "__main__":
args = parse_opts()
args.func(args)
@ethercflow
Copy link
Author

此脚本控制北京两个机房之间的网络带宽和延迟。
eg:

./beijing.py --ubase 51200  --ustep 10000  --dbase 102400  --dstep 100000 --bcycle 20 --latency 1 --lstep 1 --lcycle 10 inc
./beijing.py --ubase 51200  --ustep 10000  --bcycle 20 inc 
./beijing.py --dbase 51200  --dstep 10000  --bcycle 20 inc 
./beijjing.py  --latency 1 --lstep 1 --lcycle 10 inc

参数说明:

ubase 上行带宽;
ustep 上行带宽变化步长;
dbase 下行带宽;
dstep 下行带宽变化步长;
bcycle 带宽变化周期;
latency 延迟;
lstep 延迟变化步长;
lcycle 延迟变化周期。

注意:
此脚本是仅为北京银行case中北京机房定制的,此脚本只能在亦庄集群上使用。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment