summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-10-31 12:53:09 +0800
committerQiuwen Lu <[email protected]>2017-10-31 12:53:09 +0800
commit3b1b53e49d84a42132e6f502ba900b59e56ea657 (patch)
tree9102dfa63b60e0f12f7fde223a62e549affb222e
parent6e59c3209be1b7a6a8ac6cb8a4e8b6278baf8290 (diff)
增加内存池在线调试功能,用以解决内存池Buffer泄露的问题。v4.2.30-20171031
- 增加APP线程在用MBUF计算功能; - 增加MBUF申请失败后,显示各内存池可用Buffer数量的功能。
-rw-r--r--app/src/monit.c10
-rw-r--r--app/src/mrb.c18
2 files changed, 26 insertions, 2 deletions
diff --git a/app/src/monit.c b/app/src/monit.c
index 89ce937..cd4648d 100644
--- a/app/src/monit.c
+++ b/app/src/monit.c
@@ -202,6 +202,15 @@ static cJSON * monit_app_stat(struct mr_instance * instance)
_trans_app_stat(mbuf_alloc_count);
_trans_app_stat(mbuf_free_count);
+ /* 在用Buffer数量统计 */
+ 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];
+ }
+
#define _json_generate(item) \
do { \
cJSON_AddItemToObject(j_root, #item, __create_uint64_array( \
@@ -216,6 +225,7 @@ do { \
_json_generate(packet_send_drop);
_json_generate(mbuf_alloc_count);
_json_generate(mbuf_free_count);
+ _json_generate(mbuf_in_use_count);
#undef _trans_app_stat
#undef _trans_app_stat_array
diff --git a/app/src/mrb.c b/app/src/mrb.c
index 6c596d4..0b86419 100644
--- a/app/src/mrb.c
+++ b/app/src/mrb.c
@@ -44,8 +44,22 @@ int marsio_buff_malloc_device(struct mr_vdev * vdev, marsio_buff_t *marsio_buff[
int ret = rte_pktmbuf_alloc_bulk(vdev->vdi->direct_pool,
(struct rte_mbuf **)marsio_buff, nr_mbufs);
- assert(ret == 0);
- if(ret < 0) return ret;
+#ifndef NDEBUG
+
+ /* 多线程锁,多线程同时失败时,只有一个线程能竞争到这个锁 */
+ static pthread_mutex_t __mempool_list_dump_lock = PTHREAD_MUTEX_INITIALIZER;
+
+ /* 申请内存失败,打印内存池数量分布情况统计 */
+ if (unlikely(ret < 0))
+ {
+ pthread_mutex_lock(&__mempool_list_dump_lock);
+ rte_mempool_list_dump(stderr);
+ rte_panic("Cannot alloc mbufs from pool %p", vdev->vdi->direct_pool);
+ }
+
+#endif
+
+ if(unlikely(ret < 0)) return ret;
for(int i = 0; i < nr_mbufs; i++)
marsio_buff_reset(marsio_buff[i]);