DPDK是以网卡收发机为中心进行的性能优化,多进程部署一般是每台server上部署一个primary进程,其他进程为secondary进程。主进程负责全部大叶内存的初始化,次进程只进行大叶内存的attach。这种结构需要primary进程保持相当的运行可靠度。否则,一旦primary进程down掉,primary进程自此启动要不要清大叶内存重新初始化,清的话会影响正在运行的secondary进程,不清能够保证内存长期可用。多进程部署情况下会对运行维护及程序可靠性逻辑带来相当的复杂度,降低了应用进程运行可靠性。
为了解决这一问题,需要实现
(1)大叶内存分配大小需要实现可配,不能像DPDK默认逻辑初始化全部大叶内存。
(2)多进程在大叶内存上进行隔离,每个进程初始化并维护属于自己的大叶内存,一个进程重启清空自己的大叶内存不影响其他进程的运行。
于此我对DPDK大叶内存初始化代码做了一些修改,主要涉及两点:
(1) 对要创建的大叶内存文件名增加可配置的前缀(internal_config.hugefile_prefix),这样每个进程创建的大叶内存文件就不会相互冲突。每次重启只需要在进程中增加删除/mnt/huge/下自己前缀的大叶内存文件操作,然后调用EAL接口重新进行大叶内存重新初始化,这样就不会影响其他进程。
(2)每个进程要初始化的大叶内存大小可配置(internal_config.memory ), 进程根据配置的大小进行内存初始化,不占用全部大叶内存,给其他进程大叶内存资源。
以下就是对代码文件进行的修改(dpdk-2.2.0\lib\librte_eal\common\eal_common_cpuflags.c)
--- cmp2/eal_hugepage_info.c 2015-12-16 01:06:58.000000000 +0800
+++ cmp1/eal_hugepage_info.c 2017-06-14 14:35:09.000000000 +0800
@@ -200,7 +200,20 @@
DIR *dir;
struct dirent *dirent;
int dir_fd, fd, lck_result;
- const char filter[] = "*map_*"; /* matches hugepage files */
+ /* BEGIN: Modified by Yichang Zang, 2016/5/18 PN:Muti-process huge-page memory management */
+// const char filter[] = "*map_*"; /* matches hugepage files */
+ char filter[256]; /* matches hugepage files */
+
+
+ if ((strlen(internal_config.hugefile_prefix) + 8) >= sizeof(filter))
+ {
+ RTE_LOG(ERR, EAL, "Hugepage file prefix is too long %s\n",
+ internal_config.hugefile_prefix);
+ goto error;
+ }
+
+ sprintf(filter, "*%smap_*", internal_config.hugefile_prefix);
+ /* END: Modified by Yichang Zang, 2016/5/18 */
/* open directory */
dir = opendir(hugedir);
@@ -339,6 +352,21 @@
hpi->num_pages[0] = RTE_MIN(hpi->num_pages[0],
RTE_PGSIZE_1G / hpi->hugepage_sz);
#endif
+ /* BEGIN: Added by Yichang Zang, 2016/5/18 PN:Muti-process huge-page memory management */
+ if (0 != internal_config.memory)
+ {
+ uint32_t hugepage_num;
+ hugepage_num = internal_config.memory / hpi->hugepage_sz;
+ if (0 != (internal_config.memory % hpi->hugepage_sz))
+ {
+ hugepage_num += 1;
+ }
+ if (hugepage_num < hpi->num_pages[0])
+ {
+ hpi->num_pages[0] = hugepage_num;
+ }
+ }
+ /* END: Added by Yichang Zang, 2016/5/18 */
num_sizes++;
}
应用进程调用样例如下所示,每个进程都是primary,且互不影响。注意需要在进程大叶内存初始化前做清/mnt/huge/下自己内存的操作。
rte_eal_init(8, “./processor, -c, 0x7ff, --proc-type=primary, -m, 30720, --file-prefix, 123”);
版权声明:本文为博主原创文章,承蒙转载请注明作者和出处https://blog.csdn.net/zangchang/article/details/80085857