19.8 CPU热插拔
Linux CPU热插拔的功能已经存在相当长的时间了,Linux 3.8之后的内核里一个小小的改进就是CPU0可以热插拔。
在用户空间可以通过/sys/devices/system/cpu/cpun/online节点来操作一个CPU的在线和离线:
# echo 0 > /sys/devices/system/cpu/cpu3/online
CPU 3 is now offline
# echo 1 > /sys/devices/system/cpu/cpu3/online
通过echo 0 > /sys/devices/system/cpu/cpu3/online关闭CPU3时,CPU3上的进程都会被迁移到其他的CPU上,以保证拔除CPU3的过程中,系统仍然能正常运行。
通过echo 1 > /sys/devices/system/cpu/cpu3/online再次开启CPU3,CPU3又可参与系统的负载均衡,分担系统中的任务。
在嵌入式系统中,CPU热插拔可以作为一种省电的方式,在系统负载小的时候,动态关闭CPU,在系统负载增大的时候,再开启之前离线的CPU。目前各个芯片公司可能会根据自身SoC的特点,对内核进行调整,来实现运行时“热插拔”。以Nvidia(英伟达)的Tegra3为例进行说明。
Tegra3采用VSMP(Variable Symmetric Multi Processing)架构,共有5个Cortex-A9处理器,其中4个为高性能设计的G核,1个为低功耗设计的LP核,如图19.7所示。
图19.7 Tegra3的架构
在系统运行过程中,Tegra3的Linux内核会根据CPU负载切换低功耗处理器和高功耗处理器。除此之外,4个高性能ARM核心也会根据运行情况,动态借用Linux内核支持的CPU热插拔进行CPU的插入/拔出操作。
用华硕EeePad运行高负载、低负载应用,通过dmesg查看内核消息也确实验证了多核的热插拔以及G核和LP核之间的动态切换:
<4>[104626.426957] CPU1: Booted secondary processor
<7>[104627.427412] tegra CPU: force EDP limit 720000 kHz
<4>[104627.427670] CPU2: Booted secondary processor
<4>[104628.537005] stop_machine_cpu_stop cpu=0
<4>[104628.537017] stop_machine_cpu_stop cpu=2
<4>[104628.537059] stop_machine_cpu_stop cpu=1
<4>[104628.537702] __stop_cpus: wait_for_completion_timeout+
<4>[104628.537810] __stop_cpus: smp=0 done.executed=1 done.ret =0-
<5>[104628.537960] CPU1: clean shutdown
<4>[104630.537092] stop_machine_cpu_stop cpu=0
<4>[104630.537172] stop_machine_cpu_stop cpu=2
<4>[104630.53773