2

我用 Twisted Conch 编写了一个 SSH 服务器。但是遇到了一个棘手的问题。假设用户A和用户B通过ssh命令登录到twisted ssh服务器。然后用户A tail 或者 cat 服务器上的一个大文件(大于100M),会通过twisted ssh服务器造成大量echo,使得python ssh进程(twisted.conch)cpu使用率很高(大于95%) ,甚至100%),那么用户B就会被屏蔽,很长时间没有反应。当发现用户A通过twisted ssh服务器有大量回声并且不阻塞其他连接的用户时,有没有办法让用户A的会话(0.5秒)休眠。

import sys  
import checkers  
from twisted.python import components, log, logfile  
from twisted.cred import portal  
from twisted.internet import reactor  
from twisted.conch.ssh import factory, keys, session, filetransfer  
from twisted.conch.unix import UnixSSHRealm, SSHSessionForUnixConchUser, UnixConchUser  
import keyvalue  
if __name__ == "__main__":  
   sshFactory = factory.SSHFactory()  
   sshFactory.portal = portal.Portal(UnixSSHRealm())  
   sshFactory.portal.registerChecker(checkers.UsernamePasswordChecker())  

   sshFactory.publicKeys = {
    'ssh-rsa': keys.Key.fromString(keyvalue.publicKey)}
   sshFactory.privateKeys = {
    'ssh-rsa': keys.Key.fromString(keyvalue.privateKey)}
   components.registerAdapter(
    SSHSessionForUnixConchUser, UnixConchUser, session.ISession)
   log.startLogging(sys.stdout)

   reactor.listenTCP(2222, sshFactory)
   reactor.run()
4

1 回答 1

2

这实际上是 Twisted 中的一个错误。使用服务器的一个用户不应该产生太多的负载,以至于它对其他所有人都没有响应。

但是,要修复它并不容易。有几个解决方案。

首先,在您做任何其他事情之前,您应该确保您的代码使用PyPy,这可能会为您提供支持更多用户所需的所有额外性能。即使这还不够,与这些其他解决方案结合使用也应该会有所帮助。

一个是您可以使用这样的策略在多个进程中运行此代码这将允许您在多个内核上抢先运行该进程。当然,这不会让你在一个进程中同时做很多事情。

另一种选择是您可以使用twisted.protocols.htb,您可以使用 on sshFactory,来限制传入流量并确保在竞争连接之间公平地处理它。

请分享您在这方面取得的任何进展,因为我相信其他 Twisted 用户会对此感兴趣!

于 2016-11-16T08:41:41.023 回答