改进调度器日志¶
https://blueprints.launchpad.net/nova/+spec/improve-sched-logging
Nova 调度器包含许多非常复杂的过滤器,其失败模式并不明显(特别是 NUMATopologyFilter)。可能会出现实例无法调度的情况,并且不立即清楚导致失败的具体原因。因此,我们建议允许可选的详细消息,精确说明调度器过滤器为何会失败。
问题描述¶
如果 Nova 调度器无法为实例找到合适的计算节点,那么弄清楚问题所在有时会很棘手。对于简单的过滤器(CPU/RAM/磁盘),检查相对简单,但对于更复杂的过滤器(PCI、IO 操作,以及特别是与 NUMA 相关的 CPU pinning、huge pages 和超线程),从日志中手动确定失败原因很困难。即使启用了调试日志,在某些情况下,NUMATopologyFilter 过滤器也可能在没有有用日志的情况下失败。
例如,如果 NUMATopologyFilter 过滤器使计算节点失败,它会记录一条相当通用的消息
“%(host)s, %(node)s 无法满足 NUMA 拓扑要求。该实例无法在此主机上运行。”
有很多不同的方式可能导致这种情况,而不会发出任何其他日志。例如,在 objects.numa.NUMACell.can_fit_hugepages() 中,存在一种情况,可能会引发 exception.MemoryPageSizeNotSupported 异常。如果发生这种情况,我们建议提供更详细的错误信息,例如
“%(host)s, %(node)s 不支持页面大小 %(size)d。”
或者,如果 NUMA 节点没有足够的 CPU/RAM 来满足要求,我们建议在日志中指示确切的问题
“%(host)s, %(node)s 可用 CPU(%d) < 需要(%d)”
用例¶
主要用例是当最终用户尝试执行需要调度实例的操作,并且操作失败时。然后他们会询问部署者失败的原因,但日志中没有明显的失败原因。
提议的变更¶
正如在峰会上讨论的那样,该提案包含两个方面。
首先,我们将尝试确保所有调度器过滤器失败都有一个有用的日志消息,描述过滤器为何针对该主机失败。
其次,我们建议添加一个新的“sched_detailed_log_only_on_failure”选项,该选项默认值为 True。当此选项设置为 True 时,我们将把调试日志累积在内存中(当前计划是使用特定于调度器过滤器的日志记录机制,但如果 https://review.openstack.org/#/c/227766/ 或类似内容合并,我们也可以使用它),然后在整体调度操作失败时(即引发 exception.NoValidHost 异常)发出这些日志。如果调度操作成功,这些日志将被丢弃。由于日志记录仅在失败时发生,我们建议将详细的过滤器日志记录在“info”级别。(实际的 NoValidHost 错误日志仍将以当前的日志记录级别记录。)如果此配置选项设置为 False,我们将完全按照当前的方式发出日志。
第三,为了进一步减少日志记录,我们建议添加一个新的“scheduler_suppressed_log_filters”配置选项。它将包含一个过滤器名称列表(类似于“scheduler_default_filters”),我们希望抑制其调试日志记录。这样,操作员就可以避免记录由于缺乏 CPU/RAM/磁盘等琐碎原因而失败的情况。我们建议此选项默认值为 [‘CoreFilter’, ‘RamFilter’, ‘DiskFilter’, ‘ComputeFilter’]。此选项无论“仅在失败时记录”配置选项如何设置,都将适用,原因如下
仅在 NoValidHost 上记录时,我们仍然需要进行工作来存储成功路径的日志,因此这将提供一种减少开销并减少调度器失败时日志记录量的方法。
如果操作员决定他们不需要来自特定过滤器的日志记录,那么无论是否仅在失败时记录,可能并不重要。
如果操作员希望在更改“sched_detailed_log_only_on_failure”配置选项时更改抑制的过滤器,他们可以选择这样做。
备选方案¶
另一种方法是增强现有的调试日志,以便涵盖所有失败情况。为了使其有用,部署者需要使用调试日志记录启用状态运行调度器,并且额外的日志记录将适用于所有情况,包括最终成功的情况。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
预计会很低,假设简单的过滤器(CPU/RAM/磁盘等)的日志被抑制。在处理日志和调度期间消耗的内存方面会有一些额外的 CPU 时间。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
cbf123 (aka cfriesen)
- 其他贡献者
lbeliveau
工作项¶
添加新的配置选项。
添加核心调度器代码以记录错误消息(如果有的话),如果调度器无法找到合适的计算节点。
对于每个过滤器,确保所有失败模式都包含在错误消息中。这可以并行化,因为每个过滤器的日志记录基本上与其他过滤器无关。
依赖项¶
无
测试¶
不应有任何最终用户可见的更改,因此当前的 Tempest 和功能测试足以证明正确性。
为了练习额外的日志记录,将添加一些额外的单元测试,涵盖各种战略场景,其中不同的过滤器失败。
文档影响¶
将更新操作指南,其中包含有关配置选项存在及其如何简化调度失败调试的信息。
正在引入一个新的配置选项,因此需要对其进行适当的记录。
参考资料¶
无
历史¶
发布名称 |
描述 |
|---|---|
Newton |
引入 |