我用Twisted Conch编写了一个SSH服务器。但是遇到了一个难题。假设用户A和用户B通过ssh命令登录到扭曲的ssh服务器。然后用户A尾部或猫的服务器上的一个大文件(大于100M),这将造成很多回声通过扭曲的ssh服务器,使得python ssh进程(twisted.conch )的cpu使用率非常高(大于95%,甚至100%),然后用户B将被阻塞,很长时间没有响应。当发现用户A通过扭曲的ssh服务器有大量回声并且不阻塞其他连接的用户时,有没有办法让userA的会话休眠(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()发布于 2016-11-16 16:41:41
这实际上是Twisted中的一个bug。一个使用服务器的用户不应该产生如此多的负载,以至于它对其他所有人都没有响应。
然而,这并不是一个容易解决的问题。有几种解决方案。
首先,在执行其他操作之前,您应该确保您的代码使用的是PyPy,这可能会为您提供支持更多用户所需的所有额外性能。即使这还不够,它与其他解决方案结合起来也应该是有帮助的。
其中之一是,您可以使用策略like this在多个进程中运行此代码,这将允许您在多个内核上抢先运行进程。当然,这不会让您在一个进程中并发执行太多操作。
另一种选择是,您可以使用可以在sshFactory上使用的twisted.protocols.htb来限制传入流量的速率,并确保它在竞争连接之间得到公平处理。
请分享你在这方面的任何进展,因为我相信其他Twisted用户也会感兴趣!
https://stackoverflow.com/questions/40601119
复制相似问题