예제 #1
0
    def test_one_rxq(self):
        # retrieve pmd object.
        pmd = self.pmd_map[self.core_id]

        # one dummy port is required for this test.
        port_name = 'virtport'

        # create port class of name 'virtport'.
        dataif.make_dataif_port(port_name)

        # add port object into pmd.
        fx_port = pmd.add_port(port_name)
        fx_port.numa_id = pmd.numa_id

        # add a dummy rxq into port.
        fx_rxq = fx_port.add_rxq(0)

        # add some cpu consumption for this rxq.
        for i in range(0, config.ncd_samples_max):
            fx_rxq.cpu_cyc[i] = (1000 + (100 * i))

        dataif.update_pmd_load(self.pmd_map)
        variance_value = dataif.pmd_load_variance(self.pmd_map)

        self.assertEqual(variance_value, 0)

        # del port object from pmd.
        pmd.del_port(port_name)
예제 #2
0
    def test_one_rxq_rnuma(self):
        # set different numa for pmds
        pmd1 = self.pmd_map[self.core1_id]
        pmd2 = self.pmd_map[self.core2_id]

        pmd1.numa_id = 0
        pmd2.numa_id = 1

        fx_2pmd_for_1rxq_each(self)

        dataif.update_pmd_load(self.pmd_map)
        variance_value = dataif.pmd_load_variance(self.pmd_map)

        self.assertEqual(int(variance_value), 17)
        pmd1.del_port('virtport1')
        pmd2.del_port('virtport2')
예제 #3
0
    def test_one_rxq_lnuma(self):
        # set different numa for pmds
        pmd1 = self.pmd_map[self.core1_id]
        pmd2 = self.pmd_map[self.core2_id]

        pmd1.numa_id = 0
        pmd2.numa_id = 0

        fx_2pmd_for_1rxq_each(self)

        dataif.update_pmd_load(self.pmd_map)
        variance_value = dataif.pmd_load_variance(self.pmd_map)

        self.assertEqual(int(variance_value), 17)

        # del port object from pmd.
        # TODO: create fx_ post deletion routine for clean up
        pmd1.del_port('virtport1')
        pmd2.del_port('virtport2')
예제 #4
0
    def test_two_rxq_lnuma(self, mock_open):
        mock_open.side_effect = [
            mock.mock_open(read_data=_FX_CPU_INFO).return_value
        ]

        # set different numa for pmds
        pmd1 = self.pmd_map[self.core1_id]
        pmd2 = self.pmd_map[self.core2_id]

        pmd1.numa_id = 0
        pmd2.numa_id = 0

        fx_1pmd_for_2rxq(self)

        dataif.update_pmd_load(self.pmd_map)
        variance_value = dataif.pmd_load_variance(self.pmd_map)

        self.assertEqual(int(variance_value), 17)

        # del port object from pmd.
        # TODO: create fx_ post deletion routine for clean up
        pmd1.del_port('virtport1')
        pmd1.del_port('virtport2')
예제 #5
0
def collect_data(n_samples, s_sampling):
    """
    Collect various stats and rxqs mapping of every pmd in the vswitch.

    Parameters
    ----------
    n_samples : int
        number of samples

    s_sampling: int
        sampling interval
    """

    ctx = dataif.Context
    rctx = RebalContext

    # collect samples of pmd and rxq stats.
    idx_max = n_samples
    idx_gen = (o for o in range(0, idx_max))
    while True:
        try:
            next(idx_gen)
        except StopIteration:
            break

        try:
            dataif.get_port_stats()
            dataif.get_interface_stats()
            dataif.get_pmd_stats(ctx.pmd_map)
            dataif.get_pmd_rxqs(ctx.pmd_map)
        except (error.OsCommandExc, error.ObjCreateExc,
                error.ObjConsistencyExc, error.ObjParseExc,
                error.ObjModelExc) as e:
            # report error event
            now = datetime.now()
            now_ts = now.strftime("%Y-%m-%d %H:%M:%S")
            if isinstance(e, error.OsCommandExc):
                nlog.warn("unable to collect data: %s" % e)
                ctx.events.append(("switch", "error", now_ts))
                raise error.NcdShutdownExc

            elif isinstance(e, error.ObjCreateExc):
                nlog.warn("unable to create object: %s" % e)
                ctx.events.append(("ncd", "error", now_ts))
                raise error.NcdShutdownExc

            elif isinstance(e, error.ObjConsistencyExc):
                nlog.warn("inconsistency in collected data: %s" % e)
                ctx.events.append(("ncd", "error", now_ts))
                raise error.NcdShutdownExc

            elif isinstance(e, error.ObjModelExc):
                nlog.warn("switch states changed: %s" % e)
                ctx.events.append(("ncd", "retry_model", now_ts))

                # reset collected data
                ctx.pmd_map.clear()
                ctx.port_to_cls.clear()
                ctx.port_to_id.clear()

                # restart iterations
                idx_gen.close()
                idx_max = config.ncd_samples_max
                idx_gen = (o for o in range(0, idx_max))
                continue

            elif isinstance(e, error.ObjParseExc):
                nlog.warn("unable to parse info: %s" % e)
                ctx.events.append(("ncd", "retry_parse", now_ts))

                # reset collected data
                ctx.pmd_map.clear()
                ctx.port_to_cls.clear()
                ctx.port_to_id.clear()

                # restart iterations
                idx_gen.close()
                idx_max = config.ncd_samples_max
                idx_gen = (o for o in range(0, idx_max))
                time.sleep(s_sampling)
                continue

            else:
                nlog.error("unhandled exception: %s" % e)
                ctx.events.append(("ncd", "exception", now_ts))
                raise error.NcdShutdownExc

        time.sleep(s_sampling)

    now = datetime.now()
    ctx.last_ts = now.strftime("%Y-%m-%d %H:%M:%S")
    dataif.update_pmd_load(ctx.pmd_map)
    rctx.rebal_tick += n_samples

    return ctx