是否可以安全地监控生产Linux系统上的Python堆栈


开发

期间(即不在生产系统中)性能问题的常见调试技术是随机停止程序并检查堆栈。 如果您经常看到相同或相似的堆栈,则表明性能问题是由程序执行此操作时发生的任何事情引起的。

我想在生产系统中做类似的事情,因为如果可以无损测量,那里的信息可能有助于解决性能问题。

我的第一个想法是向相关进程发送 UNIX 信号。 然后,该信号的信号处理程序将记录堆栈(来自信号处理程序的日志记录会带来其自身的复杂性,但它们可以解决并且与此问题无关)。

但是,这是有问题的,因为信号可能会导致系统调用中断,这可能会通过更改其行为或通过重试降低性能来破坏原本有效的生产代码。 我相信 Python 标准库在很多地方仍然没有正确处理 EINTR,这加剧了这个问题。

有没有办法部分或全部避免这些问题? 答案不需要涉及信号(但我不确定还有另一种方法)。 请注意,使用信号触发堆栈日志记录的部分吸引力在于,这应该有助于揭示由于 I/O 而导致的问题,而不仅仅是由于过度使用 CPU 时间而导致的问题。

似乎有效:

import signal
import traceback
def handler(*_):
  traceback.print_stack()
signal.signal(signal.SIGUSR1, handler)

Python在如何安全地处理信号方面有相当多的专业知识,所以我认为这应该没问题。 它在我对Python 2.7.6的简短测试中起作用。

最新更新