【问题标题】:Evaluating SMI (System Management Interrupt) latency on Linux-CentOS/Intel machine在 Linux-CentOS/Intel 机器上评估 SMI(系统管理中断)延迟
【发布时间】:2014-10-13 11:56:13
【问题描述】:

我有兴趣在运行 CentOS 并用于(非常)软实时应用程序的 Linux 机器上评估 SMI 处理的行为(延迟、频率)。

  1. 推荐使用哪些工具(CentOS 的 hwlatdetect?),最好的做法是什么?

  2. 如果 CentOS 没有可用的好工具,我是否正确假设安装一个 同一台机器上的不同操作系统应该产生相同的结果,因为底层硬件/bios是相同的?

  3. 这些参数是否有大致数据来源。

机器是X86_64架构,运行CentOS 6.4(内核2.6.32-358.23.2.el2.centos.plus.x86_64。)

【问题讨论】:

  • 我不确定 SMI 在正常运行期间在 Linux 上是否重要。恕我直言,它仅在上电时使用(也许用于 ACPI 相关的事情)。但我可能是错的。
  • @BasileStarynkevitch 你错了。在某些系统上,SMI 用于all kinds of things,可能会在系统正常和异常操作期间定期使用。包括但不限于电源管理功能的控制和监控。

标签: linux centos x86-64 interrupt


【解决方案1】:

SMI 肯定会在正常操作期间发生。我的家用台式机每隔半秒就有一个芯片组驱动的 SMI,它在芯片组中启用。由于 BIOS 驱动的 CPU 频率缩放方案,我还看到一些服务器每秒运行两次。但是,某些系统可以运行很长时间而不会发生 SMI,因此这真的取决于。

问题 #1:hwlatdetect 是一种检测系统上发生的 SMI 延迟的选项。 BIOSBITS 是另一种选择,它是一张可引导 CD,可以识别是否正在发生 SMI。您还可以通过创建一个在循环中旋转并获取时间戳(使用 RDTSC)的内核模块来编写自己的测试。如果您看到两个时间戳读数之间的间隔很长,您可以查询 CPU MSR 0x34 以查看 SMI 计数器是否增加,这表明发生了 SMI。

如果你想生成一个 SMI,你可以制作一个内核模块,对端口 0xb2 执行 OUT CPU 指令,例如将值 0 写入此端口。 (您还可以通过在写入端口 0xB2 之前和之后收集时间戳来计时此 SMI)。

问题 #2,SMI 在操作系统下方运行,因此您选择的操作系统不应该有任何影响。

问题 #3:BIOSBITS 建议将 SMI 延迟保持在 150 微秒以下。

【讨论】:

    【解决方案2】:

    SMI 会将您的系统置于 SMM(系统管理模式)模式,这将推迟 在 SMI 处理时间段内正常执行内核。换句话说,SMM 既不是实模式也不是保护模式,因为我们知道内核的正常运行, 相反,它执行一些保存在 SMRAM 中的特殊指令(存储在 Bios 固件中)。要检测它的延迟,您可以尝试触发 SMI(它可以是软件生成的)并尝试捕捉在 SMM 模式下花费的总时间。为此,您可以编写一个 Linux 内核模块,因为您需要一些特殊权限才能发出 SMI(我认为)。

    对于实时系统,我认为如果你能避免像 SMI 这样的中断,那就太好了。

    【讨论】:

    • 感谢您的意见。您是否知道任何不需要自己编写 ko 的工具来执行此操作?同样以这种方式测量延迟并不能说明它调用的频率。
    • 我不知道这些工具。是的,它不会给你任何指示它被调用的频率。请记住,它与任何其他中断不同,它通常用于处理关键系统问题。
    • @AviPerel 在最近的 CPU 上,有一个 MSR_SMI_COUNT 寄存器为您提供已发生的 SMI 数量。它不会为您提供延迟信息,但可以指示它们发生的频率。 Here 是一个轮询该寄存器并每秒打印一次其值的工具。
    • 使用现代 Linux,您可以使用 sudo rdmsr -d 0x34 获取自 CPU 启动以来的 SMI 计数。如果系统完全启动后该数字没有改变,则您的 BIOS 没问题。如果它在正常工作负载期间增加,则您的 BIOS 不适合硬实时操作。例如,我的系统在正常运行 9 天后输出6
    【解决方案3】:

    您可以使用turbostat 检查是否处理了System Management 中断(SMI)。例如:

    # turbostat sleep 120
    [check column SMI for value greater than 0]
    

    当然,您也可以从中计算出 SMI 频率。

    了解 SMI 实际以特定速率发生是重要信息。但是您还想知道系统管理模式 (SMM) 在这些中断中花费了多少时间。例如,如果 SMI 中断非常短,可能与您的实时应用程序无关。另一方面,如果您的硬件具有长时间的 SMI 中断,您可能需要与供应商交谈,以不同的方式配置固件(如果可能),或切换到具有较少干扰 SMM 的其他硬件。

    perf 工具有一个模式,用于测量在 SMI 期间在 SMM 中花费了多少周期(使用信息 provided by certain CPU counters)。示例:

    # perf stat -a -A --smi-cost -- sleep 120
     Performance counter stats for 'system wide':
    
                   SMI cycles%                 SMI# 
    CPU0                      0.0%                    0 
    CPU1                      0.0%                    0 
    CPU2                      0.0%                    0
    CPU3                      0.0%                    0
    
        120.002927948 seconds time elapsed
    

    您还可以通过以下方式查看原始值:

    # perf stat -a -A --smi-cost --metric-only -- sleep 120
    

    据此,您可以计算 SMI 在您的机器上平均花费的时间。 (周期差除以每个时间单位的周期数)。

    将基于 CPU 计数器的结果与经验结果进行交叉检查当然是有意义的。

    您可以使用集成在 Linux 内核中的Linux Hardware Latency Detector。使用示例:

    # echo hwlat > /sys/kernel/debug/tracing/current_tracer
    # echo 1 > /sys/kernel/debug/tracing/tracing_thresh
    # watch -d -n 5 cat /sys/kernel/debug/tracing/tracing_max_latency
    # echo "Don't forget to disable it again"
    # echo nop > /sys/kernel/debug/tracing/current_tracer
    

    这些工具在 CentOS/RHEL 7 上可用,并且应该在其他发行版上也可用。

    关于大致数据:最近我遇到了一台 HP 2011-ish ProLiant Gen8 Xeon 服务器,它每分钟触发 504 个 SMI。 Perf 在 SMM 中计算的速率为 0.1 %,根据计数器值,在 SMI 中花费的平均时间高达几微秒 - 但 Linux hwlat 检测器在该系统上没有检测到如此高的中断。

    该 SMI 比率与惠普在其 Configuring and tuning HPE ProLiant Servers for low-latency applications 指南(2017 年 10 月)中记录的内容相符:

    禁用处理器的系统管理中断提供了一种 对低延迟环境的最大好处。 禁用处理器电源和利用率监控 SMI 具有最大的 因为它在 G6 中生成处理器中断每秒八次 和更高版本的服务器。

    (强调我的;该指南还记录了其他 SMI 来源)

    在配备英特尔凌动 C3758 和我的英特尔 NUC (i5-4250U) 系统的 Supermicro 主板上,计算的 SMI 恰好为零。

    在基于 Intel i7-6600U 的戴尔笔记本电脑上,系统每分钟报告 8 个 SMI,但 aperf 计数器低于(未暂停)周期计数器,这是不应该发生的。

    【讨论】:

      【解决方案4】:

      实际上,SMI 不仅仅用于键盘仿真。服务器使用 SMI 报告和纠正 ECC 内存错误,ACPI 使用 SMI 与 BIOS 通信并执行一些任务,甚至启用和禁用 ACPI 也是通过 SMI 完成的,BIOS 经常通过 SMI 拦截电源状态变化......还有更多,这只是举几个例子。

      【讨论】:

      • 性能影响也很大。我只是从hwlatdetect 得到结果,它始终测量超过 300 毫秒(!)延迟,这又与 ECC 内存清理错误事件相关(通过mcelog)。在这种特殊情况下,它可能是一个卡住位,因为错误总是发生在同一个地址上。这也可以解释为什么修正速度很慢。
      【解决方案5】:

      根据System Management Mode 上的维基页面,在正常操作期间不使用 SMI,除非可能用 USB 物理键盘模拟 PS/2 键盘。

      并且大多数 Linux 系统都能够在没有该仿真的情况下驱动真正的 USB 键盘。你可以配置你的 BIOS 来禁用它。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-19
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      相关资源
      最近更新 更多