Skip to content

Latest commit

 

History

History
93 lines (70 loc) · 3.12 KB

002-cpu拓扑.md

File metadata and controls

93 lines (70 loc) · 3.12 KB

#CPU拓扑

Erlang作为一门高并发的语言,对CPU的整个拓扑结构非常重视。在整个Erts环境初始化的初期,会进行多项CPU信息探测,从而找出最合适的调度线程数。 在这里会对CPU的信息探测进行分析。

##CPU拓扑

typedef struct 
{
	int node;
	int processor;
	int processor_node;
	int core;
	int thread;
	int logical;
} erts_cpu_topology_t;

node 表示在SMP系统中某个CPU物理节点 processer 表示在SMP系统中某个CPU的物理节点 core 表示在CPU物理节点上的逻辑节点(单CPU多核心) logical 表示自己的CPU线程ID其中包含逻辑线程(单核心多逻辑线程)

此处举例说明: 2个CPU,每个CPU含有2个核心,每个核心有2个逻辑线程 那么就会有 node = 0, processer = 0, core = 0, logical = 0 node = 0, processer = 0, core = 0, logical = 1 node = 0, processer = 0, core = 1, logical = 2 node = 0, processer = 0, core = 1, logical = 3 node = 1, processer = 1, core = 2, logical = 4 node = 1, processer = 1, core = 2, logical = 5 node = 1, processer = 1, core = 3, logical = 6 node = 1, processer = 1, core = 3, logical = 7

CPU拓扑自动探测会受到系统的限制,目前只支持Linux,Solaris,FreeBSD和Windows,并且在Windows上只能探测少于32个逻辑节点的系统。

在Linux上 erts通过读取/sys/devices/system/node路径下面的节点信息来探测CPU的拓扑

在FreeBSD上 erts通过使用kstat来获取CPU的拓扑

在Windows上 erts通过使用kernel32中的GetLogicalProcessorInformation获取CPU拓扑

在其它结构上都不进行CPU拓扑探测

##CPU亲缘性 CPU 亲缘性就是指在 Linux 系统中能够将一个或多个进程绑定到一个或多个处理器上运行。 进程可以通过 CPU 集合决定将在哪个或哪几个 CPU 上运行。 其中cpu_set_t 结构体来表示一个 CPU 集合。

##CPU信息 struct erts_cpu_info_t_ { int configured; int online; int available; int topology_size; erts_cpu_topology_t *topology; #if defined(ERTS_HAVE_MISC_UTIL_AFFINITY_MASK__) char *affinity_str; char affinity_str_buf[CPU_SETSIZE/4+2]; cpu_set_t cpuset; #if defined(HAVE_SCHED_xETAFFINITY) pid_t pid; #endif

#elif defined(HAVE_PSET_INFO)
	processorid_t *cpuids;
#endif

};

configured 表示系统中被配置的CPU数量(包括不可用的数量) online 表示当前系统中真正可用CPU的数量 topology_size 表示有多少个逻辑线程,topology数组的大小 available 在不使用CPU亲缘时候等于online,使用CPU亲缘性的时候,available会小于等于online

在POSIX系统上可以通过下面方法获取信息 sysconf(_SC_NPROCESSORS_CONF) 返回系统可以使用的核数,但是其值会包括系统中禁用的核的数目,因此该值并不代表当前系统中可用的核数。 sysconf(_SC_NPROCESSORS_ONLN) 返回值真正的代表了系统当前可用的核数。

在Windows系统上使用GetSystemInfo函数获取信息

CPU亲缘性问题在这里先暂时不讨论

参考文件 lib_src/common/erl_misc_utils.c