重新启动一个CPU,最终在不明显过程中无反应



我正在处理一组内核更改,使我可以在运行时低估CPU。我经常面临的极端低调的结果是,CPU完全没有反应。

我尝试使用函数cpu_upcpu_down,以期要求内核还原CPU,但无济于事。

有什么方法可以从该状态中恢复CPU?内核是否有任何例程可以从这种不响应状态中带回CPU?

首先,要成功从低估中受益,每次少量降低电压很重要(例如5-10 mV之间(。然后,在减少每一步之后,您应该检查一个或多个硬件错误指标的更改(通常是CPU缓存错误率(。通常情况下,当电压缓慢降低时,错误率应逐渐增加。但是,在某个时候,将发生错误,无法通过ECC纠正(或处理器正在使用的任何硬件校正机制(。这是执行不可靠的时候。Linux通过惊慌而响应此类错误(系统将自动重新启动,否则它将挂起(。因此,您可能仍然有机会检测错误并选择继续执行,但是即使您立即增加了电压,也不能保证正确性。因此,这将是一件非常非常危险的事情。它可能很快变得非常讨厌。处理其他错误时可能会发生错误(也许是因为处理错误的代码,因此最安全的事情是中止,请参阅Peter的评论(。

现代处理器提供了配置和处理可更正和不可纠正的硬件错误的机制。特别是,X86提供机器检查体系结构(MCA(。默认情况下,在Linux中,当发生不可纠正的机器检查时,请调用机器检查异常处理程序,这可能会中止系统(尽管它将尝试查看它是否可以安全地恢复以某种方式(。您无法在没有其他工具的情况下在用户模式下处理该操作。

这是Linux支持的不同X86 MCE公差水平:

struct mca_config mca_cfg __read_mostly = {
    .bootlog  = -1,
    /*
     * Tolerant levels:
     * 0: always panic on uncorrected errors, log corrected errors
     * 1: panic or SIGBUS on uncorrected errors, log corrected errors
     * 2: SIGBUS or log uncorrected errors (if possible), log corr. errors
     * 3: never panic or SIGBUS, log all errors (for testing only)
     */
    .tolerant = 1,
    .monarch_timeout = -1
};

请注意,默认的tolerant值为1。但是,由于您正在修改内核,因此可以通过更改tolerant级别或处理代码本身来更改Linux处理MCE的方式。您可以开始使用Machine_check_poll和do_machine_check函数。

用户模式工具可能使您能够配置并可能响应机器检查,包括McElog和McEdaemon。在第3卷第15章和英特尔手册的第16章中讨论了MCA。对于ARM,您还可以介绍此处讨论的缓存ECC错误。

非常重要的是要了解相同芯片的不同核心在将电压降低到标称值之外时的表现可能会有所不同。这是由于过程变化。因此,不要以为降压降压会在同一芯片或芯片跨芯片的核心上起作用。您将必须在每个芯片的每个核心上测试(如果您有多个插座(。

我尝试使用函数CPU_UP和CPU_DOWN,以期询问 恢复CPU的内核,但无济于事。

这些功能是热销CPU基础架构的一部分。在这里没有真正有用的。

答案取决于CPU。我的答案仅限于X86_64和S390:

极端低调基本上是在拔下CPU,才能将其恢复,您必须确保配置CONFIG_HOTPLUG_CPU = y

另外,根据您使用的内核版本,您可能会随时使用不同的拆卸或设置选项。如果您使用的是4.x,请查看 <linux/cpuhotplug.h>中的cpuhp_*例程,特别是 cpuhp_setup_state_state_multi as well as cpuhp_setup_state_state_nocalls CC_10 ___cpuhp_setup_setup_state`

相关内容

最新更新