* [Qemu-devel] [PATCH V6 1/3] net/colo-compare.c: Optimize unpredictable tcp options comparison
2017-09-05 6:31 [Qemu-devel] [PATCH V6 0/3] Optimize COLO-compare performance Zhang Chen
@ 2017-09-05 6:31 ` Zhang Chen
2017-09-05 6:31 ` [Qemu-devel] [PATCH V6 2/3] net/colo-compare.c: Adjust net queue pop order for performance Zhang Chen
2017-09-05 6:31 ` [Qemu-devel] [PATCH V6 3/3] net/colo-compare.c: Fix comments and scheme Zhang Chen
2 siblings, 0 replies; 4+ messages in thread
From: Zhang Chen @ 2017-09-05 6:31 UTC (permalink / raw)
To: qemu devel, Jason Wang; +Cc: Zhang Chen, Zhang Chen, Li Zhijian
When network is busy, some tcp options(like sack) will unpredictable
occur in primary side or secondary side. it will make packet size
not same, but the two packet's payload is identical. colo just
care about packet payload, so we skip the option field.
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
net/colo-compare.c | 39 +++++++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/net/colo-compare.c b/net/colo-compare.c
index ca67c68..d088262 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -186,7 +186,10 @@ static int packet_enqueue(CompareState *s, int mode)
* return: 0 means packet same
* > 0 || < 0 means packet different
*/
-static int colo_packet_compare_common(Packet *ppkt, Packet *spkt, int offset)
+static int colo_packet_compare_common(Packet *ppkt,
+ Packet *spkt,
+ int poffset,
+ int soffset)
{
if (trace_event_get_state(TRACE_COLO_COMPARE_MISCOMPARE)) {
char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
@@ -201,12 +204,13 @@ static int colo_packet_compare_common(Packet *ppkt, Packet *spkt, int offset)
sec_ip_src, sec_ip_dst);
}
- offset = ppkt->vnet_hdr_len + offset;
+ poffset = ppkt->vnet_hdr_len + poffset;
+ soffset = ppkt->vnet_hdr_len + soffset;
- if (ppkt->size == spkt->size) {
- return memcmp(ppkt->data + offset,
- spkt->data + offset,
- spkt->size - offset);
+ if (ppkt->size - poffset == spkt->size - soffset) {
+ return memcmp(ppkt->data + poffset,
+ spkt->data + soffset,
+ spkt->size - soffset);
} else {
trace_colo_compare_main("Net packet size are not the same");
return -1;
@@ -263,13 +267,22 @@ static int colo_packet_compare_tcp(Packet *spkt, Packet *ppkt)
* so we just need skip this field.
*/
if (ptcp->th_off > 5) {
- ptrdiff_t tcp_offset;
+ ptrdiff_t ptcp_offset, stcp_offset;
- tcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
- + (ptcp->th_off * 4) - ppkt->vnet_hdr_len;
- res = colo_packet_compare_common(ppkt, spkt, tcp_offset);
+ ptcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
+ + (ptcp->th_off * 4) - ppkt->vnet_hdr_len;
+ stcp_offset = spkt->transport_header - (uint8_t *)spkt->data
+ + (stcp->th_off * 4) - spkt->vnet_hdr_len;
+
+ /*
+ * When network is busy, some tcp options(like sack) will unpredictable
+ * occur in primary side or secondary side. it will make packet size
+ * not same, but the two packet's payload is identical. colo just
+ * care about packet payload, so we skip the option field.
+ */
+ res = colo_packet_compare_common(ppkt, spkt, ptcp_offset, stcp_offset);
} else if (ptcp->th_sum == stcp->th_sum) {
- res = colo_packet_compare_common(ppkt, spkt, ETH_HLEN);
+ res = colo_packet_compare_common(ppkt, spkt, ETH_HLEN, ETH_HLEN);
} else {
res = -1;
}
@@ -329,6 +342,7 @@ static int colo_packet_compare_udp(Packet *spkt, Packet *ppkt)
* the ip payload here.
*/
ret = colo_packet_compare_common(ppkt, spkt,
+ network_header_length + ETH_HLEN,
network_header_length + ETH_HLEN);
if (ret) {
@@ -366,6 +380,7 @@ static int colo_packet_compare_icmp(Packet *spkt, Packet *ppkt)
* the ip payload here.
*/
if (colo_packet_compare_common(ppkt, spkt,
+ network_header_length + ETH_HLEN,
network_header_length + ETH_HLEN)) {
trace_colo_compare_icmp_miscompare("primary pkt size",
ppkt->size);
@@ -403,7 +418,7 @@ static int colo_packet_compare_other(Packet *spkt, Packet *ppkt)
sec_ip_src, sec_ip_dst);
}
- return colo_packet_compare_common(ppkt, spkt, 0);
+ return colo_packet_compare_common(ppkt, spkt, 0, 0);
}
static int colo_old_packet_check_one(Packet *pkt, int64_t *check_time)
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH V6 2/3] net/colo-compare.c: Adjust net queue pop order for performance
2017-09-05 6:31 [Qemu-devel] [PATCH V6 0/3] Optimize COLO-compare performance Zhang Chen
2017-09-05 6:31 ` [Qemu-devel] [PATCH V6 1/3] net/colo-compare.c: Optimize unpredictable tcp options comparison Zhang Chen
@ 2017-09-05 6:31 ` Zhang Chen
2017-09-05 6:31 ` [Qemu-devel] [PATCH V6 3/3] net/colo-compare.c: Fix comments and scheme Zhang Chen
2 siblings, 0 replies; 4+ messages in thread
From: Zhang Chen @ 2017-09-05 6:31 UTC (permalink / raw)
To: qemu devel, Jason Wang; +Cc: Zhang Chen, Zhang Chen, Li Zhijian
The packet_enqueue() use g_queue_push_tail() to
enqueue net packet, so it is more efficent way use
g_queue_pop_head() to get packet for compare.
That will improve the success rate of comparison.
In my test the performance of ftp put 1000M file
will increase 10%
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
net/colo-compare.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/colo-compare.c b/net/colo-compare.c
index d088262..c31adc6 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -483,7 +483,7 @@ static void colo_compare_connection(void *opaque, void *user_data)
while (!g_queue_is_empty(&conn->primary_list) &&
!g_queue_is_empty(&conn->secondary_list)) {
- pkt = g_queue_pop_tail(&conn->primary_list);
+ pkt = g_queue_pop_head(&conn->primary_list);
switch (conn->ip_proto) {
case IPPROTO_TCP:
result = g_queue_find_custom(&conn->secondary_list,
@@ -521,7 +521,7 @@ static void colo_compare_connection(void *opaque, void *user_data)
* until next comparison.
*/
trace_colo_compare_main("packet different");
- g_queue_push_tail(&conn->primary_list, pkt);
+ g_queue_push_head(&conn->primary_list, pkt);
/* TODO: colo_notify_checkpoint();*/
break;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH V6 3/3] net/colo-compare.c: Fix comments and scheme
2017-09-05 6:31 [Qemu-devel] [PATCH V6 0/3] Optimize COLO-compare performance Zhang Chen
2017-09-05 6:31 ` [Qemu-devel] [PATCH V6 1/3] net/colo-compare.c: Optimize unpredictable tcp options comparison Zhang Chen
2017-09-05 6:31 ` [Qemu-devel] [PATCH V6 2/3] net/colo-compare.c: Adjust net queue pop order for performance Zhang Chen
@ 2017-09-05 6:31 ` Zhang Chen
2 siblings, 0 replies; 4+ messages in thread
From: Zhang Chen @ 2017-09-05 6:31 UTC (permalink / raw)
To: qemu devel, Jason Wang; +Cc: Zhang Chen, Zhang Chen, Li Zhijian
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
net/colo-compare.c | 59 ++++++++++++++++++++++++++++--------------------------
1 file changed, 31 insertions(+), 28 deletions(-)
diff --git a/net/colo-compare.c b/net/colo-compare.c
index c31adc6..d5fcfea 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -41,27 +41,27 @@
#define REGULAR_PACKET_CHECK_MS 3000
/*
- + CompareState ++
- | |
- +---------------+ +---------------+ +---------------+
- |conn list +--->conn +--------->conn |
- +---------------+ +---------------+ +---------------+
- | | | | | |
- +---------------+ +---v----+ +---v----+ +---v----+ +---v----+
- |primary | |secondary |primary | |secondary
- |packet | |packet + |packet | |packet +
- +--------+ +--------+ +--------+ +--------+
- | | | |
- +---v----+ +---v----+ +---v----+ +---v----+
- |primary | |secondary |primary | |secondary
- |packet | |packet + |packet | |packet +
- +--------+ +--------+ +--------+ +--------+
- | | | |
- +---v----+ +---v----+ +---v----+ +---v----+
- |primary | |secondary |primary | |secondary
- |packet | |packet + |packet | |packet +
- +--------+ +--------+ +--------+ +--------+
-*/
+ * + CompareState ++
+ * | |
+ * +---------------+ +---------------+ +---------------+
+ * | conn list + - > conn + ------- > conn + -- > ......
+ * +---------------+ +---------------+ +---------------+
+ * | | | | | |
+ * +---------------+ +---v----+ +---v----+ +---v----+ +---v----+
+ * |primary | |secondary |primary | |secondary
+ * |packet | |packet + |packet | |packet +
+ * +--------+ +--------+ +--------+ +--------+
+ * | | | |
+ * +---v----+ +---v----+ +---v----+ +---v----+
+ * |primary | |secondary |primary | |secondary
+ * |packet | |packet + |packet | |packet +
+ * +--------+ +--------+ +--------+ +--------+
+ * | | | |
+ * +---v----+ +---v----+ +---v----+ +---v----+
+ * |primary | |secondary |primary | |secondary
+ * |packet | |packet + |packet | |packet +
+ * +--------+ +--------+ +--------+ +--------+
+ */
typedef struct CompareState {
Object parent;
@@ -75,14 +75,14 @@ typedef struct CompareState {
SocketReadState sec_rs;
bool vnet_hdr;
- /* connection list: the connections belonged to this NIC could be found
- * in this list.
- * element type: Connection
+ /*
+ * Record the connection that through the NIC
+ * Element type: Connection
*/
GQueue conn_list;
- /* hashtable to save connection */
+ /* Record the connection without repetition */
GHashTable *connection_track_table;
- /* compare thread, a thread for each NIC */
+ /* This thread just do packet compare job */
QemuThread thread;
GMainContext *worker_context;
@@ -444,8 +444,11 @@ static int colo_old_packet_check_one_conn(Connection *conn,
(GCompareFunc)colo_old_packet_check_one);
if (result) {
- /* do checkpoint will flush old packet */
- /* TODO: colo_notify_checkpoint();*/
+ /* Do checkpoint will flush old packet */
+ /*
+ * TODO: Notify colo frame to do checkpoint.
+ * colo_compare_inconsistent_notify();
+ */
return 0;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread