diff options
| author | 童宗振 <[email protected]> | 2024-03-13 10:46:27 +0000 |
|---|---|---|
| committer | 童宗振 <[email protected]> | 2024-03-13 10:46:27 +0000 |
| commit | 468c21fa9ca6c37b66839635dbf8cac8479c0c6c (patch) | |
| tree | 7615fd431a39a0b54cea96fdc3b46103aca73ca7 /app | |
| parent | dde974556876ed3e6e10b8051dff9dbead329f69 (diff) | |
Dp trace perf opti
Diffstat (limited to 'app')
| -rw-r--r-- | app/include/mrdp_trace.h | 4 | ||||
| -rw-r--r-- | app/src/dp_trace.c | 63 | ||||
| -rw-r--r-- | app/src/monit.c | 216 | ||||
| -rw-r--r-- | app/src/mrb.c | 7 | ||||
| -rw-r--r-- | app/src/rawio.c | 13 |
5 files changed, 188 insertions, 115 deletions
diff --git a/app/include/mrdp_trace.h b/app/include/mrdp_trace.h index ff95c9f..7bcfef5 100644 --- a/app/include/mrdp_trace.h +++ b/app/include/mrdp_trace.h @@ -6,4 +6,6 @@ int marsio_dp_trace_init(struct mr_instance * instance); void marsio_dp_trace_record_write(struct mr_instance * instance, marsio_buff_t * mbuf); void marsio_rte_pktmbuf_free(struct rte_mbuf * m); void marsio_rte_mempool_generic_put(struct rte_mempool * mp, void * const * obj_table, unsigned int n, - struct rte_mempool_cache * cache);
\ No newline at end of file + struct rte_mempool_cache * cache); +thread_id_t marsio_thread_id_get(); +cJSON * marsio_dp_trace_monit_loop(struct mr_instance * instance);
\ No newline at end of file diff --git a/app/src/dp_trace.c b/app/src/dp_trace.c index cd55012..ab16f25 100644 --- a/app/src/dp_trace.c +++ b/app/src/dp_trace.c @@ -1,6 +1,8 @@ #include "mrapp.h" #include "mrdp_trace.h" +extern __thread struct mr_thread_info thread_info; + int marsio_dp_trace_init(struct mr_instance * mr_instance) { mr_instance->trace = dp_trace_process_create(DP_TRACE_PROCESS_APP); @@ -20,7 +22,7 @@ int marsio_dp_trace_record_emit_str(struct mr_instance * mr_instance, marsio_buf struct dp_record_meta meta = {}; snprintf(meta.appsym, sizeof(meta.appsym), "%s", mr_instance->appsym); snprintf(meta.module, sizeof(meta.module), "%s", module); - return dp_trace_record_emit_str(mr_instance->trace, (struct rte_mbuf *)mbuf, &meta, str); + return dp_trace_record_emit_str(mr_instance->trace, (struct rte_mbuf *)mbuf, marsio_thread_id_get(), &meta, str); } int marsio_dp_trace_record_emit_fmt(struct mr_instance * mr_instance, marsio_buff_t * mbuf, const char * module, @@ -36,7 +38,8 @@ int marsio_dp_trace_record_emit_fmt(struct mr_instance * mr_instance, marsio_buf if (unlikely(ret < 0 || ret >= sizeof(buffer))) { - rte_atomic64_inc(&trace->inst->statistics.record_emit_failed_trace_length_too_long); + thread_id_t thread_id = marsio_thread_id_get(); + trace->statistics[thread_id].record_emit_failed_trace_oversize++; return -1; } @@ -44,18 +47,18 @@ int marsio_dp_trace_record_emit_fmt(struct mr_instance * mr_instance, marsio_buf snprintf(meta.appsym, sizeof(meta.appsym), "%s", mr_instance->appsym); snprintf(meta.module, sizeof(meta.module), "%s", module); - ret = dp_trace_record_emit_str(trace, (struct rte_mbuf *)mbuf, &meta, buffer); + ret = dp_trace_record_emit_str(trace, (struct rte_mbuf *)mbuf, marsio_thread_id_get(), &meta, buffer); return ret; } void marsio_dp_trace_filter_exec(struct mr_instance * instance, marsio_buff_t * mbuf) { - dp_trace_filter_exec(instance->trace, (struct rte_mbuf *)mbuf, 0); + dp_trace_filter_exec(instance->trace, (struct rte_mbuf *)mbuf, 0, marsio_thread_id_get()); } void marsio_dp_trace_record_write(struct mr_instance * mr_instance, marsio_buff_t * mbuf) { - return dp_trace_record_write(mr_instance->trace, (struct rte_mbuf *)mbuf); + return dp_trace_record_write(mr_instance->trace, (struct rte_mbuf *)mbuf, marsio_thread_id_get()); } void marsio_rte_pktmbuf_free(struct rte_mbuf * m) @@ -76,4 +79,54 @@ void marsio_rte_mempool_generic_put(struct rte_mempool * mp, void * const * obj_ marsio_dp_trace_record_write(mr_instance, (struct rte_mbuf *)obj_table[i]); } rte_mempool_generic_put(mp, obj_table, n, cache); +} + +thread_id_t marsio_thread_id_get() +{ + return thread_info.thread_id; +} + +cJSON * marsio_dp_trace_monit_loop(struct mr_instance * instance) +{ + cJSON * json_root = cJSON_CreateObject(); + struct dp_trace_process * trace = instance->trace; + + struct dp_trace_stat monit_statistics = {}; + + for (unsigned int i = 0; i < RTE_MAX_LCORE; i++) + { + struct dp_trace_stat * statistics_i = &trace->statistics[i]; + monit_statistics.filter_exec_hit += statistics_i->filter_exec_hit; + monit_statistics.filter_exec_miss += statistics_i->filter_exec_miss; + monit_statistics.reach_pkt_cnt_limit += statistics_i->reach_pkt_cnt_limit; + monit_statistics.record_buf_alloc_failed_no_mem += statistics_i->record_buf_alloc_failed_no_mem; + monit_statistics.record_buf_alloc_success += statistics_i->record_buf_alloc_success; + monit_statistics.ring_enqueue_failed += statistics_i->ring_enqueue_failed; + monit_statistics.ring_enqueue_success += statistics_i->ring_enqueue_success; + monit_statistics.record_emit_failed_trace_oversize += statistics_i->record_emit_failed_trace_oversize; + monit_statistics.record_emit_failed_no_space_in_buf += statistics_i->record_emit_failed_no_space_in_buf; + monit_statistics.record_emit_success += statistics_i->record_emit_success; + } + + cJSON_AddBoolToObject(json_root, "trace_enable", trace->inst->enable); + + cJSON_AddNumberToObject(json_root, "filter_exec_hit", monit_statistics.filter_exec_hit); + cJSON_AddNumberToObject(json_root, "filter_exec_miss", monit_statistics.filter_exec_miss); + + cJSON_AddNumberToObject(json_root, "reach_pkt_cnt_limit", monit_statistics.reach_pkt_cnt_limit); + + cJSON_AddNumberToObject(json_root, "record_buf_alloc_failed_no_mem", + monit_statistics.record_buf_alloc_failed_no_mem); + cJSON_AddNumberToObject(json_root, "record_buf_alloc_success", monit_statistics.record_buf_alloc_success); + + cJSON_AddNumberToObject(json_root, "ring_enqueue_failed", monit_statistics.ring_enqueue_failed); + cJSON_AddNumberToObject(json_root, "ring_enqueue_success", monit_statistics.ring_enqueue_success); + + cJSON_AddNumberToObject(json_root, "record_emit_failed_trace_oversize", + monit_statistics.record_emit_failed_trace_oversize); + cJSON_AddNumberToObject(json_root, "record_emit_failed_no_space_in_buf", + monit_statistics.record_emit_failed_no_space_in_buf); + cJSON_AddNumberToObject(json_root, "record_emit_success", monit_statistics.record_emit_success); + + return json_root; }
\ No newline at end of file diff --git a/app/src/monit.c b/app/src/monit.c index a169ab7..e543b0f 100644 --- a/app/src/monit.c +++ b/app/src/monit.c @@ -1,11 +1,12 @@ /* \brief 应用状态监测数据输出 -* -* \author Lu Qiuwen<[email protected]> -* \date 2016-11-30 -*/ + * + * \author Lu Qiuwen<[email protected]> + * \date 2016-11-30 + */ -#include <mrapp.h> #include <cJSON.h> +#include <mrapp.h> +#include <mrdp_trace.h> unsigned int g_monit_interval = 1; @@ -18,12 +19,12 @@ int vdev_instance_stats_get(struct vdev_instance * vdi, struct vdev_stat_info * stat_info->nr_rxstream = vdi->nr_rxstream; stat_info->nr_txstream = vdi->nr_txstream; - if(vdi->nr_rxstream > 0) + if (vdi->nr_rxstream > 0) { st_cons_rx = vnode_mirror_cons_stat_get(vdi->vnode_rx_cons); } - if(vdi->nr_txstream > 0) + if (vdi->nr_txstream > 0) { st_prod_tx = vnode_mirror_prod_stat_get(vdi->vnode_tx_prod); st_prod_ftx = vnode_mirror_prod_stat_get(vdi->vnode_ftx_prod); @@ -68,14 +69,14 @@ void vdev_instance_stats_last_get(struct vdev_instance * vdi, struct vdev_stat_i static cJSON * __create_uint64_array(const uint64_t * value, int nr_value) { - struct cJSON * uint64_array = cJSON_CreateArray(); - for (int i = 0; i < nr_value; i++) - cJSON_AddItemToArray(uint64_array, cJSON_CreateNumber(value[i])); - return uint64_array; + struct cJSON * uint64_array = cJSON_CreateArray(); + for (int i = 0; i < nr_value; i++) + cJSON_AddItemToArray(uint64_array, cJSON_CreateNumber(value[i])); + return uint64_array; } -static cJSON * __create_uint64_delta_array(const uint64_t * value_large, - const uint64_t * value_small, int nr_value, int interval) +static cJSON * __create_uint64_delta_array(const uint64_t * value_large, const uint64_t * value_small, int nr_value, + int interval) { struct cJSON * uint64_array = cJSON_CreateArray(); for (int i = 0; i < nr_value; i++) @@ -108,19 +109,21 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi) /* Gauge */ struct cJSON * j_vdev_gauge = cJSON_CreateObject(); -#define __JOIN_VDEV_VALUE_STATS_ITEM(item, streams) do { \ - cJSON_AddItemToObject(j_vdev_value, #item, \ - __create_uint64_array(_stat_info.item, streams)); \ -} while(0) - -#define __JOIN_VDEV_VALUE_BYTES_TO_BITS_STAT_ITEM(item, streams) do { \ - uint64_t __bits_item[MR_SID_MAX]; \ - for (int i = 0; i < streams; i++) \ - __bits_item[i] = _stat_info.item[i] * 8; \ - \ - cJSON_AddItemToObject(j_vdev_value, #item, __create_uint64_array( \ - __bits_item, streams)); \ -} while(0) +#define __JOIN_VDEV_VALUE_STATS_ITEM(item, streams) \ + do \ + { \ + cJSON_AddItemToObject(j_vdev_value, #item, __create_uint64_array(_stat_info.item, streams)); \ + } while (0) + +#define __JOIN_VDEV_VALUE_BYTES_TO_BITS_STAT_ITEM(item, streams) \ + do \ + { \ + uint64_t __bits_item[MR_SID_MAX]; \ + for (int i = 0; i < streams; i++) \ + __bits_item[i] = _stat_info.item[i] * 8; \ + \ + cJSON_AddItemToObject(j_vdev_value, #item, __create_uint64_array(__bits_item, streams)); \ + } while (0) __JOIN_VDEV_VALUE_STATS_ITEM(rx_on_line, nr_rx_stream); __JOIN_VDEV_VALUE_STATS_ITEM(rx_deliver, nr_rx_stream); @@ -142,25 +145,28 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi) __JOIN_VDEV_VALUE_STATS_ITEM(ltx_missed, nr_tx_stream); __JOIN_VDEV_VALUE_BYTES_TO_BITS_STAT_ITEM(ltx_total_len, nr_tx_stream); -#define __JOIN_VDEV_SPEED_STATS_ITEM(item, streams) do { \ - cJSON_AddItemToObject(j_vdev_speed, #item, \ - __create_uint64_delta_array(_stat_info.item, \ - _stat_info_last.item, streams, g_monit_interval)); \ -} while(0) - -#define __JOIN_VDEV_SPEED_BYTES_TO_BITS_STAT_ITEM(item, streams) do { \ - uint64_t __bits_item[MR_SID_MAX]; \ - for (int i = 0; i < streams; i++) \ - __bits_item[i] = _stat_info.item[i] * 8; \ - \ - uint64_t __bits_item_last[MR_SID_MAX]; \ - for (int i = 0; i < streams; i++) \ - __bits_item_last[i] = _stat_info_last.item[i] * 8; \ - \ - cJSON_AddItemToObject(j_vdev_speed, #item, \ - __create_uint64_delta_array(__bits_item, \ - __bits_item_last, streams, g_monit_interval)); \ -} while(0) +#define __JOIN_VDEV_SPEED_STATS_ITEM(item, streams) \ + do \ + { \ + cJSON_AddItemToObject( \ + j_vdev_speed, #item, \ + __create_uint64_delta_array(_stat_info.item, _stat_info_last.item, streams, g_monit_interval)); \ + } while (0) + +#define __JOIN_VDEV_SPEED_BYTES_TO_BITS_STAT_ITEM(item, streams) \ + do \ + { \ + uint64_t __bits_item[MR_SID_MAX]; \ + for (int i = 0; i < streams; i++) \ + __bits_item[i] = _stat_info.item[i] * 8; \ + \ + uint64_t __bits_item_last[MR_SID_MAX]; \ + for (int i = 0; i < streams; i++) \ + __bits_item_last[i] = _stat_info_last.item[i] * 8; \ + \ + cJSON_AddItemToObject(j_vdev_speed, #item, \ + __create_uint64_delta_array(__bits_item, __bits_item_last, streams, g_monit_interval)); \ + } while (0) __JOIN_VDEV_SPEED_STATS_ITEM(rx_on_line, nr_rx_stream); __JOIN_VDEV_SPEED_STATS_ITEM(rx_deliver, nr_rx_stream); @@ -183,14 +189,14 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi) __JOIN_VDEV_SPEED_BYTES_TO_BITS_STAT_ITEM(ltx_total_len, nr_tx_stream); cJSON * rx_q_len_array = cJSON_CreateArray(); - for(unsigned int i = 0; i < nr_rx_stream; i++) + for (unsigned int i = 0; i < nr_rx_stream; i++) { cJSON_AddItemToArray(rx_q_len_array, cJSON_CreateNumber(_stat_info.rx_q_len_max[i])); } cJSON_AddItemToObject(j_vdev_gauge, "rx_q_len", rx_q_len_array); cJSON * rx_q_avg_len_array = cJSON_CreateArray(); - for(unsigned int i = 0; i < nr_rx_stream; i++) + for (unsigned int i = 0; i < nr_rx_stream; i++) { cJSON_AddItemToArray(rx_q_avg_len_array, cJSON_CreateNumber(_stat_info.rx_q_len_avg_max[i])); } @@ -207,35 +213,36 @@ static cJSON * __create_vdev_stats(struct vdev_instance * vdi) // 运行时原始报文设备统计计数 static cJSON * monit_vdev(struct mr_instance * instance) { - struct cJSON * j_vdev_array = cJSON_CreateArray(); - for(int i = 0; i < instance->nr_vdevs; i++) - { + struct cJSON * j_vdev_array = cJSON_CreateArray(); + for (int i = 0; i < instance->nr_vdevs; i++) + { struct mr_vdev * vdev = &instance->vdevs[i]; - if (vdev == NULL) continue; - - cJSON * j_vdev = cJSON_CreateObject(); - cJSON_AddStringToObject(j_vdev, "symbol", vdev->devsym); - cJSON_AddNumberToObject(j_vdev, "rxstreams", vdev->nr_rxstream); - cJSON_AddNumberToObject(j_vdev, "txstreams", vdev->nr_txstream); - cJSON_AddItemToObject(j_vdev, "stats", __create_vdev_stats(vdev->vdi)); - cJSON_AddItemToArray(j_vdev_array, j_vdev); - } + if (vdev == NULL) + continue; + + cJSON * j_vdev = cJSON_CreateObject(); + cJSON_AddStringToObject(j_vdev, "symbol", vdev->devsym); + cJSON_AddNumberToObject(j_vdev, "rxstreams", vdev->nr_rxstream); + cJSON_AddNumberToObject(j_vdev, "txstreams", vdev->nr_txstream); + cJSON_AddItemToObject(j_vdev, "stats", __create_vdev_stats(vdev->vdi)); + cJSON_AddItemToArray(j_vdev_array, j_vdev); + } - return j_vdev_array; + return j_vdev_array; } static cJSON * monit_app_stat(struct mr_instance * instance) { struct cJSON * j_root = cJSON_CreateObject(); -#define _trans_app_stat(item) \ - uint64_t __trans_##item[MR_SID_MAX]; \ - for(int i = 0; i < instance->nr_dataplane_thread; i++) \ - { \ - __trans_##item[i] = instance->stat[i].item; \ - } \ +#define _trans_app_stat(item) \ + uint64_t __trans_##item[MR_SID_MAX]; \ + for (int i = 0; i < instance->nr_dataplane_thread; i++) \ + { \ + __trans_##item[i] = instance->stat[i].item; \ + } -#define _trans_app_stat_array(item) __trans_##item +#define _trans_app_stat_array(item) __trans_##item _trans_app_stat(packet_recv_count); _trans_app_stat(packet_recv_length); @@ -252,17 +259,17 @@ static cJSON * monit_app_stat(struct mr_instance * instance) uint64_t __trans_mbuf_in_use_count[MR_SID_MAX]; for (int i = 0; i < instance->nr_dataplane_thread; i++) { - __trans_mbuf_in_use_count[i] = __trans_packet_recv_count[i] + - __trans_mbuf_alloc_count[i] - __trans_packet_send_count[i] - - __trans_mbuf_free_count[i]; + __trans_mbuf_in_use_count[i] = __trans_packet_recv_count[i] + __trans_mbuf_alloc_count[i] - + __trans_packet_send_count[i] - __trans_mbuf_free_count[i]; } -#define _json_generate(item) \ -do { \ - cJSON_AddItemToObject(j_root, #item, __create_uint64_array( \ - _trans_app_stat_array(item), instance->nr_dataplane_thread)); \ -} while(0) \ - +#define _json_generate(item) \ + do \ + { \ + cJSON_AddItemToObject(j_root, #item, \ + __create_uint64_array(_trans_app_stat_array(item), instance->nr_dataplane_thread)); \ + } while (0) + _json_generate(packet_recv_count); _json_generate(packet_recv_length); _json_generate(packet_send_count); @@ -282,45 +289,46 @@ do { \ return j_root; } - static cJSON * monit_app_info(struct mr_instance * instance) { - struct cJSON * j_root = cJSON_CreateObject(); - cJSON_AddStringToObject(j_root, "symbol", instance->appsym); - return j_root; + struct cJSON * j_root = cJSON_CreateObject(); + cJSON_AddStringToObject(j_root, "symbol", instance->appsym); + return j_root; } static cJSON * monit_root(struct mr_instance * instance) { - struct cJSON * j_root = cJSON_CreateObject(); - cJSON_AddItemToObject(j_root, "appinfo", monit_app_info(instance)); - cJSON_AddItemToObject(j_root, "raw", monit_vdev(instance)); + struct cJSON * j_root = cJSON_CreateObject(); + cJSON_AddItemToObject(j_root, "appinfo", monit_app_info(instance)); + cJSON_AddItemToObject(j_root, "raw", monit_vdev(instance)); cJSON_AddItemToObject(j_root, "appstat", monit_app_stat(instance)); + cJSON_AddItemToObject(j_root, "dp-trace-path", marsio_dp_trace_monit_loop(instance)); + + if (instance->neigh != NULL) + { + struct cJSON * j_monit_neigh = neighbour_manager_monit(instance->neigh); + cJSON_AddItemToObject(j_root, "neigh", j_monit_neigh); + } - if (instance->neigh != NULL) - { - struct cJSON * j_monit_neigh = neighbour_manager_monit(instance->neigh); - cJSON_AddItemToObject(j_root, "neigh", j_monit_neigh); - } - - return j_root; + return j_root; } int mrapp_monit_loop(struct mr_instance * instance) { - cJSON * j_root = monit_root(instance); - char * str_json_print = cJSON_Print(j_root); - - FILE * fp_monit = fopen(instance->monit_file_path, "w"); - if (fp_monit == NULL) - { - MR_WARNING("monit file %s open failed, cannot dump program stat info : %s", - instance->monit_file_path, strerror(errno)); return 0; - } - - fprintf(fp_monit, "%s", str_json_print); - cJSON_Delete(j_root); + cJSON * j_root = monit_root(instance); + char * str_json_print = cJSON_Print(j_root); + + FILE * fp_monit = fopen(instance->monit_file_path, "w"); + if (fp_monit == NULL) + { + MR_WARNING("monit file %s open failed, cannot dump program stat info : %s", instance->monit_file_path, + strerror(errno)); + return 0; + } + + fprintf(fp_monit, "%s", str_json_print); + cJSON_Delete(j_root); free(str_json_print); - fclose(fp_monit); - return 0; + fclose(fp_monit); + return 0; }
\ No newline at end of file diff --git a/app/src/mrb.c b/app/src/mrb.c index 504bbb3..c6a22c6 100644 --- a/app/src/mrb.c +++ b/app/src/mrb.c @@ -151,8 +151,11 @@ void marsio_buff_free_v2(struct mr_instance * instance, marsio_buff_t * buff[], struct rte_mbuf * m = (struct rte_mbuf *)buff[i]; struct rte_mbuf * m_next = NULL; - marsio_dp_trace_record_emit_str(instance, m, NULL, "packet dropped by application"); - dp_trace_record_write(instance->trace, m); + if (marsio_dp_trace_record_can_emit(m)) + { + marsio_dp_trace_record_emit_str(instance, m, NULL, "packet dropped by application"); + dp_trace_record_write(instance->trace, m, marsio_thread_id_get()); + } __rte_mbuf_sanity_check(m, 1); while (m != NULL) diff --git a/app/src/rawio.c b/app/src/rawio.c index d2e0dfa..2c3010d 100644 --- a/app/src/rawio.c +++ b/app/src/rawio.c @@ -96,7 +96,11 @@ int marsio_recv_burst(struct mr_vdev * vdev, queue_id_t qid, marsio_buff_t * mbu for (int i = 0; i < nr_mbufs_out; i++) { mbufs[i] = rx_buffer->mbufs[rx_buffer->curser + i]; - marsio_dp_trace_record_emit_fmt(vdev->instance, mbufs[i], NULL, "packet rx, dev=%s, qid=%u", vdev->devsym, qid); + if (unlikely(marsio_dp_trace_record_can_emit(mbufs[i]))) + { + marsio_dp_trace_record_emit_fmt(vdev->instance, mbufs[i], NULL, "packet rx, dev=%s, qid=%u", vdev->devsym, + qid); + } } rx_buffer->curser += nr_mbufs_out; @@ -135,8 +139,11 @@ int marsio_send_buffer_flush(struct mr_vdev * vdev, queue_id_t sid) #if 1 // hash[i] = hash_txq & 0x8000 ? hash_txq & 0x7FFF : hash_usr; hash[i] = tx_buffer->mbufs[i]->hash.usr; - marsio_dp_trace_record_emit_fmt(vdev->instance, tx_buffer->mbufs[i], NULL, - "packet tx, dev=%s , qid=%u, hash=%u", vdev->devsym, sid, hash[i]); + if (marsio_dp_trace_record_can_emit(tx_buffer->mbufs[i])) + { + marsio_dp_trace_record_emit_fmt(vdev->instance, tx_buffer->mbufs[i], NULL, + "packet tx, dev=%s , qid=%u, hash=%u", vdev->devsym, sid, hash[i]); + } #else /* round-robin */ hash[i] = round_robin_counter++; |
