【问题标题】:tail -f over ssh with Paramiko has an increasing delay使用 Paramiko 在 ssh 上的 tail -f 延迟越来越大
【发布时间】:2013-10-24 08:43:49
【问题描述】:

我正在尝试检查正在运行的嵌入式系统的日志文件中是否存在错误。

我已经在我的脚本中实现了 paramiko,因为有人告诉我这是在 python 中使用 ssh 的最佳方式。

现在,当我跟踪日志文件时,我发现有很大的延迟。每分钟增加约 30 秒。

我已经使用 grep 来减少打印的行数,因为我认为我收到了太多输入,但事实并非如此。

如何在运行时减少此延迟或阻止延迟增加。我想拖上几个小时……

def mkssh_conn(addr):
    """returns an sshconnection"""
    paramiko.util.logging.getLogger('paramiko').setLevel(logging.WARN)
    sshcon = paramiko.SSHClient()
    sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    sshcon.connect(addr , username, password)
    return sshcon

while True:
    BUF_SIZE = 1024
    client = mkssh_conn() #returns a paramiko.SSHClient()
    transport = client.get_transport()
    transport.set_keepalive(1)
    channel = transport.open_session()
    channel.settimeout(delta)
    channel.exec_command( 'killall tail')
    channel = transport.open_session()
    channel.settimeout(delta)
    cmd = "tail -f /log/log.log | grep -E 'error|statistics'"
    channel.exec_command(cmd)
    while transport.is_active():
        print "transport is active"
        rl, wl, xl = select.select([channel], [], [], 0.0)
        if len(rl) > 0:
            buf = channel.recv(BUF_SIZE)
            if len(buf) > 0:
                lines_to_process = LeftOver + buf
                EOL = lines_to_process.rfind("\n")
                if EOL != len(lines_to_process)-1:
                    LeftOver = lines_to_process[EOL+1:]
                    lines_to_process = lines_to_process[:EOL]
                else:
                    LeftOver = ""
                for line in lines_to_process.splitlines():
                    if "error" in line:
                        report_error(line)
                    print line
    client.close()          

【问题讨论】:

    标签: python ssh paramiko tail


    【解决方案1】:

    我找到了解决方案: 似乎如果我将 BUF_SIZE 降低到 256 延迟会减少。明显地。 我需要重新检查在运行时延迟是否仍然增加。

    【讨论】:

      【解决方案2】:

      BUFFER_SIZE 应该设置在较高端以减少 CPU 周期(进而减少由于网络延迟导致的整体延迟),以防您使用高吞吐量的尾管。

      进一步将 BUFFER_SIZE 设置为更高的数字,不应降低性能。 (如果 paramiko 直到缓冲区填满低吞吐量管道才哭泣)

      @studioj 的回答与这个矛盾,可能是由于 paramiko 的升级(现已修复)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-02
        • 2017-10-15
        • 2019-07-01
        • 2019-01-04
        • 1970-01-01
        • 2017-01-28
        • 2016-11-25
        • 1970-01-01
        相关资源
        最近更新 更多