如何在 Python 中使用 /usr/bin/time 测量服务器进程从启动到 SIGINT 的最大内存使用量

问题描述 投票:0回答:1

我有一个服务器程序(让我们称之为

my-server
)我无法更改,我有兴趣测量它从启动到某个外部事件发生时的最大内存使用量。

我可以通过以下方式在我的 shell 上手动执行此操作:

  • 跑步

    /usr/bin/time -f "%M" my-server

  • 触发外部事件

  • INT

    +

    CTRL
     
    向进程发送 
    C

    信号
  • 读取标准错误

我想使用 Python 以编程方式执行此操作。如果不可能,我想找到一种替代的简单方法来达到相同的结果。

我尝试启动与子进程相同的命令并向其发送

INT
信号:

import signal
import subprocess

proc = subprocess.Popen(
    ["/usr/bin/time", "-f", "%M", "my-server"],
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
    text=True
)
# ...wait for external event
proc.send_signal(signal.SIGINT)
out, err = proc.communicate()  # both out and err are ""

但是

out
err
都是空的。

相同的脚本适用于终止的进程:

proc = subprocess.Popen(
    ["/usr/bin/time", "-f", "%M", "echo", "hello"],
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
    text=True
)
out, err = proc.communicate()  # out is "hello", err is "1920"

但是对于需要通过信号终止的进程,我不确定如何在发出终止后检索 stderr。 (甚至在它之前,尽管没有用)

以下有些等效的示例可能对测试有用:

terminate-me.py

import signal
import sys

def signal_handler(sig, frame):
    print('Terminated', file=sys.stderr) # Need to read this 
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
print('Send SIGINT to terminate')
signal.pause()

main.py

import signal
import subprocess

proc = subprocess.Popen(
    ["python", "terminate-me.py"],
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
    text=True
)
# No need to wait for any external event
proc.send_signal(signal.SIGINT)
out, err = proc.communicate()
print(out)
print(err)
python linux performance signals popen
1个回答
0
投票

如果我获取您的两个示例片段并修改

main.py
并从
outside
发送 INT 我会得到输出...?

cat main.py 
#!/usr/bin/env python3
import signal
import subprocess

proc = subprocess.Popen(
    ["/usr/bin/time","-f","%M","python", "terminate-me.py"],
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
    text=True
)
out, err = proc.communicate()
print(out)
print(err)


cat terminate-me.py 
import signal
import sys

def signal_handler(sig, frame):
    print('Terminated', file=sys.stderr) # Need to read this 
    sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print('Send SIGINT to terminate')
signal.pause()

在第二个终端中,我找到进程 PID 和

kill -INT PID
并得到:

python main.py
Send SIGINT to terminate

Terminated
9732
© www.soinside.com 2019 - 2024. All rights reserved.