move to active flows
authorHanoh Haim <[email protected]>
Wed, 8 Feb 2017 13:21:11 +0000 (15:21 +0200)
committerHanoh Haim <[email protected]>
Thu, 9 Feb 2017 07:56:00 +0000 (09:56 +0200)
Signed-off-by: Hanoh Haim <[email protected]>
src/bp_sim.cpp
src/bp_sim.h
src/gtest/tuple_gen_test.cpp
src/tuple_gen.cpp
src/tuple_gen.h

index aa80c47..f540f21 100755 (executable)
@@ -3541,6 +3541,8 @@ bool CFlowGenListPerThread::Create(uint32_t           thread_id,
     /* split the clients to threads */
     CTupleGenYamlInfo * tuple_gen = &m_flow_list->m_yaml_info.m_tuple_gen;
 
+    double active_flows_per_core = flow_list->get_worse_case_active_flows()/(double)m_max_threads;
+
     m_smart_gen.Create(0,m_thread_id);
 
     /* split the clients to threads using the mask */
@@ -3553,8 +3555,7 @@ bool CFlowGenListPerThread::Create(uint32_t           thread_id,
         m_smart_gen.add_client_pool(tuple_gen->m_client_pool[i].m_dist,
                                     portion.m_ip_start,
                                     portion.m_ip_end,
-                                    get_longest_flow(i,true),
-                                    get_total_kcps(i,true)*1000,
+                                    active_flows_per_core,
                                     m_flow_list->m_client_config_info,
                                     tuple_gen->m_client_pool[i].m_tcp_aging_sec,
                                     tuple_gen->m_client_pool[i].m_udp_aging_sec
@@ -3567,13 +3568,12 @@ bool CFlowGenListPerThread::Create(uint32_t           thread_id,
         m_smart_gen.add_server_pool(tuple_gen->m_server_pool[i].m_dist,
                         portion.m_ip_start,
                         portion.m_ip_end,
-                        get_longest_flow(i,false),
-                        get_total_kcps(i,false)*1000,
+                        active_flows_per_core,
                         tuple_gen->m_server_pool[i].m_is_bundling);
     }
 
 
-    init_from_global(portion);
+    init_from_global();
 
     CMessagingManager * rx_dp=CMsgIns::Ins()->getRxDp();
 
@@ -3645,7 +3645,7 @@ void CFlowGenListPerThread::defer_client_port_free(CGenNode *p){
 
 
 /* copy all info from global and div by num of threads */
-void CFlowGenListPerThread::init_from_global(CIpPortion& portion){
+void CFlowGenListPerThread::init_from_global(){
     /* copy generator , it is the same */
     m_yaml_info =m_flow_list->m_yaml_info;
 
@@ -5002,6 +5002,25 @@ void CFlowGenList::dump_client_config(FILE *fd) {
     m_client_config_info.dump(fd);
 }
 
+/* take the total CPS and multi by the longest flow */
+double CFlowGenList::get_worse_case_active_flows(){
+    CFlowStats sum;
+    CFlowStats stats;
+    int i;
+    double max_duration=-1.0;
+
+    for (i=0; i<(int)m_cap_gen.size(); i++) {
+        CFlowGeneratorRec * lp=m_cap_gen[i];
+        lp->getFlowStats(&stats);
+        
+        if ( stats.duration_sec > max_duration){
+            max_duration=stats.duration_sec;
+        }
+        sum.Add(stats);
+    }
+    return (sum.m_cps*max_duration);
+}
+
 int CFlowGenList::update_active_flows(uint32_t active_flows){
     double d_active_flow=(double)active_flows;
     CFlowStats stats;
index 217446e..a515379 100755 (executable)
@@ -4000,7 +4000,7 @@ private:
     void terminate_nat_flows(CGenNode *node);
 
 
-    void init_from_global(CIpPortion &);
+    void init_from_global();
     void defer_client_port_free(CGenNode *p);
     void defer_client_port_free(bool is_tcp,uint32_t c_ip,uint16_t port,
                                 uint8_t pool_idx, CTupleGeneratorSmart*gen);
@@ -4142,6 +4142,8 @@ public:
 public:
     /* update ipg in a way for */ 
     int update_active_flows(uint32_t active_flows);
+    double get_worse_case_active_flows();
+
     double get_total_kcps();
     double get_total_pps();
     double get_total_tx_bps();
index fa760c6..b350f74 100755 (executable)
@@ -173,7 +173,7 @@ TEST(CClientInfoLTest, get_new_free_port) {
 TEST(tuple_gen,clientPoolL) {
     CClientPool gen;
     gen.Create(cdSEQ_DIST, 
-               0x10000001,  0x10000f01, 64000,1, g_dummy, 
+               0x10000001,  0x10000f01, 64000, g_dummy, 
                0,0);
     CTupleBase result;
     uint32_t result_src;
@@ -197,7 +197,7 @@ TEST(tuple_gen,clientPoolL) {
 TEST(tuple_gen,clientPool) {
     CClientPool gen;
     gen.Create(cdSEQ_DIST, 
-               0x10000001,  0x10000021, 64000,1000, g_dummy,
+               0x10000001,  0x10000021, 64000000, g_dummy,
                0,0);
     CTupleBase result;
     uint32_t result_src;
@@ -221,7 +221,7 @@ TEST(tuple_gen,clientPool) {
 TEST(tuple_gen,serverPool) {
     CServerPool gen;
     gen.Create(cdSEQ_DIST, 
-               0x30000001,  0x30000ff1, 64000,10);
+               0x30000001,  0x30000ff1, 6400000);
     CTupleBase result;
     uint32_t result_dest;
 
@@ -236,7 +236,7 @@ TEST(tuple_gen,serverPool) {
     gen.Delete();
 
     gen.Create(cdSEQ_DIST, 
-               0x30000001,  0x30000003, 64000,1000);
+               0x30000001,  0x30000003, 64000000);
 
     for(int i=0;i<10;i++) {
         gen.GenerateTuple(result);
@@ -253,7 +253,7 @@ TEST(tuple_gen,serverPool) {
 TEST(tuple_gen,servePoolSim) {
     CServerPoolSimple gen;
     gen.Create(cdSEQ_DIST, 
-               0x30000001,  0x40000001, 64000,10);
+               0x30000001,  0x40000001, 640000);
     CTupleBase result;
     uint32_t result_dest;
 
@@ -268,7 +268,7 @@ TEST(tuple_gen,servePoolSim) {
     gen.Delete();
 
     gen.Create(cdSEQ_DIST, 
-               0x30000001,  0x30000003, 64000,1000);
+               0x30000001,  0x30000003, 64000000);
 
     for(int i=0;i<10;i++) {
         gen.GenerateTuple(result);
@@ -289,12 +289,12 @@ TEST(tuple_gen,GenerateTuple2) {
     CClientPool c_gen;
     CClientPool c_gen_2;
     c_gen.Create(cdSEQ_DIST, 
-               0x10000001,  0x1000000f, 64000,4, g_dummy,
+               0x10000001,  0x1000000f, 64000*4, g_dummy,
                0,0);
     CServerPool s_gen;
     CServerPool s_gen_2;
     s_gen.Create(cdSEQ_DIST, 
-               0x30000001,  0x30000ff1, 64000,10);
+               0x30000001,  0x30000ff1, 640000);
     CTupleBase result;
 
     uint32_t result_src;
@@ -318,10 +318,10 @@ TEST(tuple_gen,GenerateTuple2) {
     c_gen.Delete();
 //    EXPECT_EQ((size_t)0, gen.m_clients.size());
     c_gen.Create(cdSEQ_DIST, 
-               0x10000001,  0x1000000f, 64000,400, g_dummy, 
+               0x10000001,  0x1000000f, 64000*400, g_dummy, 
                0,0);
     s_gen.Create(cdSEQ_DIST, 
-               0x30000001,  0x30000001, 64000,10);
+               0x30000001,  0x30000001, 640000);
     for(int i=0;i<200;i++) {
         s_gen.GenerateTuple(result);
         c_gen.GenerateTuple(result);
@@ -404,8 +404,8 @@ TEST(tuple_gen,split2) {
 TEST(tuple_gen,template1) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1); 
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,4, g_dummy, 0, 0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000, g_dummy, 0, 0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
     template_1.SetSingleServer(true,0x12121212,0,0);
@@ -429,8 +429,8 @@ TEST(tuple_gen,template1) {
 TEST(tuple_gen,template2) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1);
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
     template_1.SetW(10);
@@ -458,8 +458,8 @@ TEST(tuple_gen,template2) {
 TEST(tuple_gen,no_free) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1);
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x10000001,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x400000ff,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x10000001,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x400000ff,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
 
@@ -480,8 +480,8 @@ TEST(tuple_gen,no_free) {
 TEST(tuple_gen,try_to_free) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1); 
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x10000001,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x400000ff,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x10000001,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x400000ff,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
 
@@ -507,8 +507,8 @@ TEST(tuple_gen,try_to_free) {
 TEST(tuple_gen_2,GenerateTuple) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1); 
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x10000f01,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x10000f01,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
     CTupleBase result;
@@ -535,8 +535,8 @@ TEST(tuple_gen_2,GenerateTuple) {
 TEST(tuple_gen_2,GenerateTuple2) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1);
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
     CTupleBase result;
@@ -559,8 +559,8 @@ TEST(tuple_gen_2,GenerateTuple2) {
     gen.Delete();
 //    EXPECT_EQ((size_t)0, gen.m_clients.size());
     gen.Create(1, 1); 
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,false);
     template_1.Create(&gen,0,0);
     for(int i=0;i<200;i++) {
         template_1.GenerateTuple(result);
@@ -582,8 +582,8 @@ TEST(tuple_gen_2,GenerateTuple2) {
 TEST(tuple_gen_2,template1) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1); 
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
     template_1.SetSingleServer(true,0x12121212,0,0);
@@ -609,8 +609,8 @@ TEST(tuple_gen_2,template1) {
 TEST(tuple_gen_2,template2) {
     CTupleGeneratorSmart gen;
     gen.Create(1, 1);
-    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,4,g_dummy,0,0);
-    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,4,false);
+    gen.add_client_pool(cdSEQ_DIST,0x10000001,0x1000000f,64000,g_dummy,0,0);
+    gen.add_server_pool(cdSEQ_DIST,0x30000001,0x40000001,64000,false);
     CTupleTemplateGeneratorSmart template_1;
     template_1.Create(&gen,0,0);
     template_1.SetW(10);
index a450958..14d51c3 100755 (executable)
@@ -26,17 +26,26 @@ limitations under the License.
 #include "bp_sim.h"
 #include "tuple_gen.h"
 
+static bool _enough_ips(uint32_t total_ip,
+                       double active_flows){
+    /* Socket utilization is lower than 20% */
+    if ( (active_flows/((double)total_ip*(double)MAX_PORT))>0.10 ) {
+        return(false);
+    }
+    return (true);
+}
+
 void CServerPool::Create(IP_DIST_t  dist_value,
             uint32_t min_ip,
             uint32_t max_ip,
-            double l_flow,
-            double t_cps) {
+            double active_flows
+            ) {
     gen = new CIpPool();
     gen->set_dist(dist_value);
     uint32_t total_ip = max_ip - min_ip +1;
     gen->m_ip_info.resize(total_ip);
 
-    if (total_ip > ((l_flow*t_cps/MAX_PORT))) {
+    if ( _enough_ips(total_ip,active_flows) ) {
         for(int idx=0;idx<total_ip;idx++){
             gen->m_ip_info[idx] = new CServerInfoL();
             gen->m_ip_info[idx]->set_ip(min_ip+idx);
@@ -55,8 +64,7 @@ void CServerPool::Create(IP_DIST_t  dist_value,
 void CClientPool::Create(IP_DIST_t       dist_value,
                          uint32_t        min_ip,
                          uint32_t        max_ip,
-                         double          l_flow,
-                         double          t_cps,
+                         double          active_flows,
                          ClientCfgDB     &client_info,
                          uint16_t        tcp_aging,
                          uint16_t        udp_aging) {
@@ -66,7 +74,7 @@ void CClientPool::Create(IP_DIST_t       dist_value,
     set_dist(dist_value);
 
     uint32_t total_ip  = max_ip - min_ip +1;
-    bool is_long_range = total_ip > (l_flow * t_cps / MAX_PORT);
+    bool is_long_range = _enough_ips(total_ip,active_flows);
 
     m_ip_info.resize(total_ip);
 
@@ -148,8 +156,7 @@ void CClientPool::allocate_configured_clients(uint32_t        min_ip,
 bool CTupleGeneratorSmart::add_client_pool(IP_DIST_t      client_dist,
                                           uint32_t        min_client,
                                           uint32_t        max_client,
-                                          double          l_flow,
-                                          double          t_cps,
+                                          double          active_flows,
                                           ClientCfgDB     &client_info,
                                           uint16_t        tcp_aging,
                                           uint16_t        udp_aging) {
@@ -158,8 +165,7 @@ bool CTupleGeneratorSmart::add_client_pool(IP_DIST_t      client_dist,
     pool->Create(client_dist,
                  min_client,
                  max_client,
-                 l_flow,
-                 t_cps,
+                 active_flows,
                  client_info,
                  tcp_aging,
                  udp_aging);
@@ -171,8 +177,7 @@ bool CTupleGeneratorSmart::add_client_pool(IP_DIST_t      client_dist,
 bool CTupleGeneratorSmart::add_server_pool(IP_DIST_t  server_dist,
                                           uint32_t min_server,
                                           uint32_t max_server,
-                                          double l_flow,
-                                          double t_cps,
+                                          double   active_flows,
                                           bool is_bundling){
     assert(max_server>=min_server);
     CServerPoolBase* pool;
@@ -181,8 +186,8 @@ bool CTupleGeneratorSmart::add_server_pool(IP_DIST_t  server_dist,
     else
         pool = new CServerPoolSimple();
     // we currently only supports mac mapping file for client
-    pool->Create(server_dist, min_server, max_server,
-                 l_flow, t_cps);
+    pool->Create(server_dist, min_server, max_server,active_flows);
+
     m_server_pool.push_back(pool);
     return(true);
 }
index e9dc8d4..59f9758 100755 (executable)
@@ -513,8 +513,7 @@ public:
     void Create(IP_DIST_t       dist_value,
                 uint32_t        min_ip,
                 uint32_t        max_ip,
-                double          l_flow,
-                double          t_cps,
+                double          active_flows,
                 ClientCfgDB     &client_info,
                 uint16_t        tcp_aging,
                 uint16_t        udp_aging); 
@@ -547,8 +546,7 @@ class CServerPoolBase {
     virtual void Create(IP_DIST_t  dist_value,
                uint32_t min_ip,
                uint32_t max_ip,
-               double l_flow,
-               double t_cps) = 0; 
+               double active_flows) = 0; 
  
 };
 
@@ -557,8 +555,8 @@ public:
     void Create(IP_DIST_t  dist_value,
                uint32_t min_ip,
                uint32_t max_ip,
-               double l_flow,
-               double t_cps) {
+                double active_flows
+               ) {
         m_max_server_ip = max_ip;
         m_min_server_ip = min_ip;
         m_cur_server_ip = min_ip;
@@ -598,8 +596,7 @@ public:
     void Create(IP_DIST_t  dist_value,
                 uint32_t min_ip,
                 uint32_t max_ip,
-                double l_flow,
-                double t_cps); 
+                double active_flows); 
  
     void Delete() {
         if (gen!=NULL) {
@@ -690,8 +687,7 @@ public:
     bool add_client_pool(IP_DIST_t     client_dist,
                          uint32_t      min_client,
                          uint32_t      max_client,
-                         double        l_flow,
-                         double        t_cps,
+                         double        active_flows,
                          ClientCfgDB   &client_info,
                          uint16_t      tcp_aging,
                          uint16_t      udp_aging);
@@ -699,8 +695,7 @@ public:
     bool add_server_pool(IP_DIST_t  server_dist,
                          uint32_t   min_server,
                          uint32_t   max_server,
-                         double     l_flow,
-                         double     t_cps,
+                         double     active_flows,
                          bool       is_bundling);
 
     CClientPool* get_client_pool(uint8_t idx) {