我的Python自学之路生活不易 我用python

OFTest(四):一种测试交换机流表下发速率的方法

2016-06-14  本文已影响357人  ljyfree

引言:对于OpenFlow交换机,流表下发速率是一个非常重要的指标。虽然OpenFlow交换机的Spec定义了barrier_request和barrier_reply机制来查询交换机是否操作完毕,但是可信度是存疑的。最有说服力的方法是用匹配流表的报文来做检测。此处提供一种使用OFTest套件来测试流表下发速率的方法供参考。

环境搭建

Paste_Image.png

组包发包

测试思路

脚本实现

class FlowAddRate(base_tests.SimpleDataPlane):
    def timekeeping(self,requests):
        detect_pkt = simple_tcp_packet(pktlen=100,eth_dst="00:00:ff:ff:ff:ff" )
        ignore_list = [(6,99)]
        start_time = time.time()
        for request in requests:    
            self.controller.message_send(request)
        while True:
           (rcv_port,rcv_pkt,pkt_time) = self.dataplane.poll_ignore_parts(port_number=self.out_port1,
           timeout=1,exp_pkt=str(detect_pkt),ignore_list=ignore_list)
           if rcv_pkt is not None:    #说明还有flow没有生效,重新poll
               continue
           else:                      #在等待的1秒时间内,没有报文再从port1转发出来,说明4000条flow全部生效
               break
        end_time = time.time()
        return TEST_FLOW_NUM / (end_time - start_time-1)  #这里需要减去多等待的1秒
    def rateVerify(self):
        requests = []
        for flow_num in range(1,TEST_FLOW_NUM+1):
            match = ofp.match([
                                ofp.oxm.in_port(ofp_port_ixia_mac_inc),
                                ofp.oxm.eth_src([0x00, 0x00, 0x00, 0x00,flow_num/256,flow_num%256])
              ])
            actions =  [ofp.action.output(self.out_port2)]
            request = ofp.message.flow_add(
                    table_id=test_param_get("table", 0),
                    match=match,
                    instructions=[
                        ofp.instruction.apply_actions(actions)],
                    buffer_id=ofp.OFP_NO_BUFFER,
                    priority=1000)
            requests.append(request)
        return self.timekeeping(requests)
    def checkNoForward(self,chk_port):  
        detect_pkt = simple_tcp_packet(pktlen=100,eth_dst="00:00:ff:ff:ff:ff" )
        ignore_list = [(6,99)]
        while True:
           (rcv_port,rcv_pkt,pkt_time) = self.dataplane.poll_ignore_parts(port_number=chk_port,
                                     timeout=1,exp_pkt=str(detect_pkt),ignore_list=ignore_list)
           if rcv_pkt  is not None:  
               continue
           else:
               return
    def runTest(self):
        self.out_port1, self.out_port2= openflow_ports(2)
        test_time = 10
        
        #test priority increase
        record = []
        for i in range(test_time):
            delete_all_flows(self.controller,timeout=20)
            self.checkNoForward(self.out_port2)   #确保没有报文转发出来
            self.checkNoForward(self.out_port1)
            match =  ofp.match([ofp.oxm.in_port(ofp_port_ixia_mac_inc), ])
            actions = [ofp.action.output(self.out_port1)]
            request = ofp.message.flow_add(
                         table_id=test_param_get("table", 0),
                         match=match,
                         instructions=[
                             ofp.instruction.apply_actions(actions)],
                         buffer_id=ofp.OFP_NO_BUFFER,
                         priority=0)
            self.controller.message_send(request) #添加priority=0的flow,将流量都转发到port1
            (rcv_port,rcv_pkt,pkt_time)  = self.dataplane.poll(port_number=self.out_port1,exp_pkt=None)
            self.assertTrue(rcv_pkt  is not None,"Please keep transmitting source mac increase flow before test!")
            
            s=self.rateVerify()
            record.append(s)   #将每次测试结果存在列表中
             
        logging.info("~~~~~ veirfy priority fix~~~~~~~" )
        for s in record:
            logging.info("%f flows per second" % s)
        logging.info("!!!avarage=%f flows per second" % (sum(record)/test_time))
        logging.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" )
centec@centec-28:~/workshop/oftest-new$ sudo ./oft -p 6653 -P remote -V 1.3 --test-dir tests-1.3-advance performance_validation.FLOW_ADD_RATE --log-file=flow_add_rate.txt
......
centec@centec-28:~/workshop/oftest-new$ more flow_add_rate.txt
17:43:34.908  root      : INFO    : ~~~~~ veirfy priority fix~~~~~~~
17:43:34.908  root      : INFO    : 1030.014116 flows per second
17:43:34.908  root      : INFO    : 973.554838 flows per second
17:43:34.909  root      : INFO    : 976.370872 flows per second
17:43:34.909  root      : INFO    : 1074.302799 flows per second
17:43:34.909  root      : INFO    : 1013.381452 flows per second
17:43:34.909  root      : INFO    : 1023.900947 flows per second
17:43:34.909  root      : INFO    : 1018.519737 flows per second
17:43:34.909  root      : INFO    : 957.920226 flows per second
17:43:34.910  root      : INFO    : 1025.500571 flows per second
17:43:34.910  root      : INFO    : 969.328993 flows per second
17:43:34.910  root      : INFO    : !!!avarage=1006.279455 flows per second
17:43:34.910  root      : INFO    : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

扩展

不同priority的排列

删除流表速率

本文首发于SDNLAB http://www.sdnlab.com/17103.html

上一篇 下一篇

猜你喜欢

热点阅读