diff options
| author | Qiuwen Lu <[email protected]> | 2017-10-31 12:53:09 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-10-31 12:53:09 +0800 |
| commit | 3b1b53e49d84a42132e6f502ba900b59e56ea657 (patch) | |
| tree | 9102dfa63b60e0f12f7fde223a62e549affb222e | |
| parent | 6e59c3209be1b7a6a8ac6cb8a4e8b6278baf8290 (diff) | |
增加内存池在线调试功能,用以解决内存池Buffer泄露的问题。v4.2.30-20171031
- 增加APP线程在用MBUF计算功能;
- 增加MBUF申请失败后,显示各内存池可用Buffer数量的功能。
| -rw-r--r-- | app/src/monit.c | 10 | ||||
| -rw-r--r-- | app/src/mrb.c | 18 |
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]); |
