numactl -hardware源码分析

来源:互联网 发布:淘宝无法用网银支付 编辑:程序博客网 时间:2024/06/05 07:13

https://github.com/jmesmon/numactl/blob/0df3f720e606a3706700e0487ba19d720f50c4b8/numactl.c
可以看到numactl总共支持的命令如下:struct option opts[] = {
    {"interleave", 1, 0, 'i' },
    {"preferred", 1, 0, 'p' },
    {"cpubind", 1, 0, 'c' },
    {"cpunodebind", 1, 0, 'N' },
    {"physcpubind", 1, 0, 'C' },
    {"membind", 1, 0, 'm'},
    {"show", 0, 0, 's' },
    {"localalloc", 0,0, 'l'},
    {"hardware", 0,0,'H' },

    {"shm", 1, 0, 'S'},
    {"file", 1, 0, 'f'},
    {"offset", 1, 0, 'o'},
    {"length", 1, 0, 'L'},
    {"strict", 0, 0, 't'},
    {"shmmode", 1, 0, 'M'},
    {"dump", 0, 0, 'd'},
    {"dump-nodes", 0, 0, 'D'},
    {"shmid", 1, 0, 'I'},
    {"huge", 0, 0, 'u'},
    {"touch", 0, 0, 'T'},
    {"verify", 0, 0, 'V'}, /* undocumented - for debugging */
    { 0 }
};
我们重点看先hardware命令的实现,如下所示
void hardware(void)
{
    int i;
    int numnodes=0;
    int prevnode=-1;
    int skip=0;
    int maxnode = numa_max_node();

        for (i = 0; i <= maxnode; i++) {
        char buf[64];
        long long fr;
        unsigned long long sz = numa_node_size64(i, &fr);
        if (!numa_bitmask_isbitset(numa_nodes_ptr, i))
            continue;

        printf("node %d cpus:", i);
        print_node_cpus(i);
        printf("node %d size: %s\n", i, fmt_mem(sz, buf));
        printf("node %d free: %s\n", i, fmt_mem(fr, buf));
    }
    print_distances(maxnode);
}
原来是通过fr得到free的size,而fr是从numa_node_size64(i, &fr)得到的值
long long numa_node_size64(int node, long long *freep)
{
    size_t len = 0;
    char *line = NULL;
    long long size = -1;
    FILE *f;
    char fn[64];
    int ok = 0;
    int required = freep ? 2 : 1;

    if (freep)
        *freep = -1;
sprintf(fn,"/sys/devices/system/node/node%d/meminfo", node);
}
原来numa_node_size64也是从kernel 里面parse meminfo的值

0 0
原创粉丝点击