linux – NUMA内存页面迁移开销
发布时间:2020-12-14 02:12:35 所属栏目:Linux 来源:网络整理
导读:我必须在 Linux下找到与NUMA内存页迁移相关的开销. 你能告诉我哪些工具可以使用吗? 如果可能,你能展示一个例子. 解决方法 如果您想了解您的系统是否正在进行过多的远程节点内存访问并且您正在使用intel CPU,Intel’s PMU有一个名为vtbwrun的实用程序来报告Q
我必须在
Linux下找到与NUMA内存页迁移相关的开销.
你能告诉我哪些工具可以使用吗? 如果可能,你能展示一个例子. 解决方法
如果您想了解您的系统是否正在进行过多的远程节点内存访问并且您正在使用intel CPU,Intel’s PMU有一个名为vtbwrun的实用程序来报告QPI /非核心活动.
如果要查看执行页面迁移所需的时间,可以测量对numa_move_pages的调用持续时间(由numactl包提供). 这是an example: /* * Test program to test the moving of a processes pages. * * (C) 2006 Silicon Graphics,Inc. * Christoph Lameter <clameter@sgi.com> */ #include <stdio.h> #include <stdlib.h> #include "../numa.h" #include <unistd.h> #include <errno.h> unsigned int pagesize; unsigned int page_count = 32; char *page_base; char *pages; void **addr; int *status; int *nodes; int errors; int nr_nodes; struct bitmask *old_nodes; struct bitmask *new_nodes; int main(int argc,char **argv) { int i,rc; pagesize = getpagesize(); nr_nodes = numa_max_node()+1; old_nodes = numa_bitmask_alloc(nr_nodes); new_nodes = numa_bitmask_alloc(nr_nodes); numa_bitmask_setbit(old_nodes,1); numa_bitmask_setbit(new_nodes,0); if (nr_nodes < 2) { printf("A minimum of 2 nodes is required for this test.n"); exit(1); } setbuf(stdout,NULL); printf("migrate_pages() test ......n"); if (argc > 1) sscanf(argv[1],"%d",&page_count); page_base = malloc((pagesize + 1) * page_count); addr = malloc(sizeof(char *) * page_count); status = malloc(sizeof(int *) * page_count); nodes = malloc(sizeof(int *) * page_count); if (!page_base || !addr || !status || !nodes) { printf("Unable to allocate memoryn"); exit(1); } pages = (void *) ((((long)page_base) & ~((long)(pagesize - 1))) + pagesize); for (i = 0; i < page_count; i++) { if (i != 2) /* We leave page 2 unallocated */ pages[ i * pagesize ] = (char) i; addr[i] = pages + i * pagesize; nodes[i] = 1; status[i] = -123; } /* Move to starting node */ rc = numa_move_pages(0,page_count,addr,nodes,status,0); if (rc < 0 && errno != ENOENT) { perror("move_pages"); exit(1); } /* Verify correct startup locations */ printf("Page location at the beginning of the testn"); printf("------------------------------------------n"); numa_move_pages(0,NULL,0); for (i = 0; i < page_count; i++) { printf("Page %d vaddr=%p node=%dn",i,pages + i * pagesize,status[i]); if (i != 2 && status[i] != 1) { printf("Bad page state before migrate_pages. Page %d status %dn",status[i]); exit(1); } } /* Move to node zero */ numa_move_pages(0,0); printf("nMigrating the current processes pages ...n"); rc = numa_migrate_pages(0,old_nodes,new_nodes); if (rc < 0) { perror("numa_migrate_pages failed"); errors++; } /* Get page state after migration */ numa_move_pages(0,0); for (i = 0; i < page_count; i++) { printf("Page %d vaddr=%lx node=%dn",(unsigned long)(pages + i * pagesize),status[i]); if (i != 2) { if (pages[ i* pagesize ] != (char) i) { printf("*** Page contents corrupted.n"); errors++; } else if (status[i]) { printf("*** Page on the wrong noden"); errors++; } } } if (!errors) printf("Test successful.n"); else printf("%d errors.n",errors); return errors > 0 ? 1 : 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |