.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_TW.rst :Original: Documentation/admin-guide/cputopology.rst :ç¿»è¯: å”è—舟 Tang Yizhou <tangyeechou@gmail.com> ========================== 如何通éŽsysfså°‡CPU拓撲導出 ========================== CPU拓撲信æ¯é€šéŽsysfså°Žå‡ºã€‚é¡¯ç¤ºçš„é …ï¼ˆå±¬æ€§ï¼‰å’ŒæŸäº›æž¶æ§‹çš„/proc/cpuinfoè¼¸å‡ºç›¸ä¼¼ã€‚å®ƒå€‘ä½æ–¼ /sys/devices/system/cpu/cpuX/topology/。請閱讀ABI文件: Documentation/ABI/stable/sysfs-devices-system-cpu。 drivers/base/topology.cæ˜¯é«”ç³»çµæ§‹ä¸æ€§çš„,它導出了這些屬性。然而,dieã€clusterã€book〠drawé€™äº›å±¤æ¬¡çµæ§‹ç›¸é—œçš„æ–‡ä»¶åƒ…åœ¨é«”ç³»çµæ§‹æä¾›äº†ä¸‹æ–‡æè¿°çš„å®çš„æ¢ä»¶ä¸‹è¢«å‰µå»ºã€‚ å°æ–¼æ”¯æŒé€™å€‹ç‰¹æ€§çš„é«”ç³»çµæ§‹ï¼Œå®ƒå¿…é ˆåœ¨include/asm-XXX/topology.hä¸å®šç¾©é€™äº›å®ä¸çš„一部分:: #define topology_physical_package_id(cpu) #define topology_die_id(cpu) #define topology_cluster_id(cpu) #define topology_core_id(cpu) #define topology_book_id(cpu) #define topology_drawer_id(cpu) #define topology_sibling_cpumask(cpu) #define topology_core_cpumask(cpu) #define topology_cluster_cpumask(cpu) #define topology_die_cpumask(cpu) #define topology_book_cpumask(cpu) #define topology_drawer_cpumask(cpu) ``**_id macros`` 的類型是int。 ``**_cpumask macros`` 的類型是 ``(const) struct cpumask *`` 。後者和æ°ç•¶çš„ ``**_siblings`` sysfså±¬æ€§å°æ‡‰ï¼ˆé™¤äº†topology_sibling_cpumask(),它和thread_siblings å°æ‡‰ï¼‰ã€‚ çˆ²äº†åœ¨æ‰€æœ‰é«”ç³»çµæ§‹ä¸Šä¿æŒä¸€è‡´ï¼Œinclude/linux/topology.hæä¾›äº†ä¸Šè¿°æ‰€æœ‰å®çš„默èªå®šç¾©ï¼Œä»¥é˜² 它們未在include/asm-XXX/topology.hä¸å®šç¾©: 1) topology_physical_package_id: -1 2) topology_die_id: -1 3) topology_cluster_id: -1 4) topology_core_id: 0 5) topology_book_id: -1 6) topology_drawer_id: -1 7) topology_sibling_cpumask: 僅入åƒCPU 8) topology_core_cpumask: 僅入åƒCPU 9) topology_cluster_cpumask: 僅入åƒCPU 10) topology_die_cpumask: 僅入åƒCPU 11) topology_book_cpumask: 僅入åƒCPU 12) topology_drawer_cpumask: 僅入åƒCPU æ¤å¤–,CPU拓撲信æ¯ç”±/sys/devices/system/cpuæä¾›ï¼ŒåŒ…å«ä¸‹è¿°æ–‡ä»¶ã€‚è¼¸å‡ºå°æ‡‰çš„å…§éƒ¨æ•¸æ“šæºæ”¾åœ¨ 方括號("[]")ä¸ã€‚ =========== ================================================================== kernel_max: å…§æ ¸é…ç½®å…許的最大CPU下標值。[NR_CPUS-1] offline: ç”±æ–¼ç†±æ’æ‹”移除或者超éŽå…§æ ¸å…許的CPU上é™ï¼ˆä¸Šæ–‡æè¿°çš„kernel_max) 導致未上線的CPU。[~cpu_online_mask + cpus >= NR_CPUS] online: 在線的CPU,å¯ä¾›èª¿åº¦ä½¿ç”¨ã€‚[cpu_online_mask] possible: 已被分é…資æºçš„CPU,如果它們CPU實際å˜åœ¨ï¼Œå¯ä»¥ä¸Šç·šã€‚ [cpu_possible_mask] present: 被系統è˜åˆ¥å¯¦éš›å˜åœ¨çš„CPU。[cpu_present_mask] =========== ================================================================== ä¸Šè¿°è¼¸å‡ºçš„æ ¼å¼å’Œcpulist_parse()兼容[åƒè¦‹ <linux/cpumask.h>]。下é¢çµ¦äº›ä¾‹å。 在本例ä¸ï¼Œç³»çµ±ä¸æœ‰64個CPU,但是CPU 32-63è¶…éŽäº†kernel_maxå€¼ï¼Œå› çˆ²NR_CPUSé…ç½®é …æ˜¯32, å–值範åœè¢«é™åˆ¶çˆ²0..31。æ¤å¤–注æ„CPU2å’Œ4-31未上線,但是å¯ä»¥ä¸Šç·šï¼Œå› çˆ²å®ƒå€‘åŒæ™‚å˜åœ¨æ–¼ presentå’Œpossible:: kernel_max: 31 offline: 2,4-31,32-63 online: 0-1,3 possible: 0-31 present: 0-31 在本例ä¸ï¼ŒNR_CPUSé…ç½®é …æ˜¯128ï¼Œä½†å…§æ ¸å•“å‹•æ™‚è¨ç½®possible_cpus=144ã€‚ç³»çµ±ä¸æœ‰4個CPU, CPU2被手動è¨ç½®ä¸‹ç·šï¼ˆä¹Ÿæ˜¯å”¯ä¸€ä¸€å€‹å¯ä»¥ä¸Šç·šçš„CPU):: kernel_max: 127 offline: 2,4-127,128-143 online: 0-1,3 possible: 0-127 present: 0-3 閱讀Documentation/core-api/cpu_hotplug.rstå¯çžè§£é–‹æ©Ÿåƒæ•¸possible_cpus=NUMï¼ŒåŒæ™‚é‚„ å¯ä»¥çžè§£å„種cpumask的信æ¯ã€‚