Increase PACKETS_PER_BUFFER to 65536 95/34195/4
authorZhijiang Hu <hu.zhijiang@zte.com.cn>
Thu, 4 May 2017 04:55:33 +0000 (00:55 -0400)
committerZhijiang Hu <hu.zhijiang@zte.com.cn>
Thu, 4 May 2017 05:14:50 +0000 (01:14 -0400)
1) This mainly increase PACKETS_PER_BUFFER to 65536 to reduce the
frequency of TCP client acks.

2) Also kills TCP_BUFF_SIZE and define each buffer size in a
more intuitive way.

3) Free more unused memory to prevent being killed by oom-killer
after enlarged PACKETS_PER_BUFFER.

4) Increase client's select() timeout to 20 secs, since we encountered
timeout due to CPU busy in the same BM but with 20 VMs.

Tested this PS in a 10 VM node env, and it can multicast a 2.7G
file to 10 VMs in 6 minutes, while unicast needs 30+ minutes.

Change-Id: Iaf862fb1f1259cc770f720ccdd95dcc281aef262
Signed-off-by: Zhijiang Hu <hu.zhijiang@zte.com.cn>
ci/build_rpm/build_rpms.sh
code/jasmine/buffer.h
code/jasmine/client.c
code/jasmine/server-tcp.c

index e4b0cae..2175bd9 100755 (executable)
@@ -38,6 +38,10 @@ function cleanup_container {
         echo "Stopping containers... $containers_to_kill"
         sudo docker stop -t 2 ${containers_to_kill}
         echo "Removing containers... $containers_to_kill"
+
+        # Prevent "removal of container daisy is already in progress"
+        sleep 10
+
         sudo docker rm -v -f ${containers_to_kill}
 
         if [[ ! -z "$volumes_to_remove" ]]; then
index e899fe6..c0b527e 100755 (executable)
@@ -21,7 +21,7 @@
 /* Exclude padding */
 #define PACKET_PAYLOAD_SIZE (((PACKET_SIZE) - sizeof(struct packet_ctl)) & ~0x3)
 
-#define PACKETS_PER_BUFFER 1024
+#define PACKETS_PER_BUFFER 65536
 
 #define DEF_PORT 18383 /* for both UDP and TCP */
 
@@ -51,6 +51,9 @@ struct request_ctl {
     uint32_t req_count; /* Requested packet slot count */
 };
 
+#define MAX_REQ_SIZE (sizeof(struct request_ctl) + \
+                      PACKETS_PER_BUFFER * sizeof(uint32_t))
+
 extern struct buffer_ctl buffctl;
 extern struct packet_ctl *packetctl[PACKETS_PER_BUFFER];
 
index 20bd358..4f51ab6 100755 (executable)
@@ -107,7 +107,7 @@ void tcp_retransmition(int tcp_socket,
 {
     struct request_ctl *reqctl;
     uint32_t *reqbody;
-    uint8_t rqbuf[sizeof(struct request_ctl) + PACKETS_PER_BUFFER * sizeof(uint32_t)];
+    uint8_t rqbuf[MAX_REQ_SIZE];
     uint32_t l;
 
     reqctl = (struct request_ctl *)rqbuf;
@@ -174,7 +174,7 @@ int recv_mcast(int tcp_socket, int udp_socket,
         do {
             FD_SET(tcp_socket, &rfds);
             FD_SET(udp_socket, &rfds);
-            tv.tv_sec = 5;
+            tv.tv_sec = 20;
             tv.tv_usec = 0;
 
             res = select(maxfd, &rfds, 0, 0, &tv);
index c48de77..49fa4e5 100755 (executable)
@@ -25,7 +25,6 @@
 #include "server.h"
 
 #define MAX_CLIENTS 128 /* Clients per TCP server */
-#define TCP_BUFF_SIZE 65536
 
 struct cdata {
     struct tcpq *tx;
@@ -219,8 +218,9 @@ void accept_clients_may_spawn(struct server_status_data *sdata)
 
 void keep_on_receiving_client_request(struct server_status_data *sdata)
 {
-    char buf[TCP_BUFF_SIZE];
+    char buf[MAX_REQ_SIZE];
     void *cpy;
+    void *anscpy;
     struct request_ctl *req;
     uint32_t *rqb;
     struct packet_ctl *ans;
@@ -270,10 +270,11 @@ void keep_on_receiving_client_request(struct server_status_data *sdata)
             total_sz = ans->data_size + sizeof(struct packet_ctl);
             log(6, "Send packet %u (%u bytes) on %d",
                 rqb[rq_index], ans->data_size, sdata->cindex);
-            cpy = wrapper_malloc(total_sz);
-            memcpy(cpy, ans, total_sz);
-            tcpq_queue_tail(cd->tx, cpy, total_sz);
+            anscpy = wrapper_malloc(total_sz);
+            memcpy(anscpy, ans, total_sz);
+            tcpq_queue_tail(cd->tx, anscpy, total_sz);
         }
+        free(cpy);
 
         if (rq_index > 0) {
             /* Data need to be sent out */
@@ -394,7 +395,7 @@ void handle_pullin_event(struct server_status_data *sdata)
 
 void handle_pullout_event(struct server_status_data *sdata)
 {
-    char buf[TCP_BUFF_SIZE];
+    char buf[PACKET_SIZE];
     struct pollfd *ds;
     struct cdata *cd;
     long transmit_sz;