我用Twisted Conch写一个SSH服务器。但遇到了一个难题。假设用户A和用户B通过ssh命令登录到twisted ssh服务器。然后用户A尾巴或猫在服务器上的一个大文件(大于100M),这将通过扭曲的ssh服务器引起很多回声,使得python ssh进程(twisted.conch)的cpu使用率非常高(大于95%) ,甚至100%),那么用户B将被阻止,很长一段时间没有响应。当找到用户A通过扭曲的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()
答案 0 :(得分:2)
这实际上是Twisted中的一个错误。使用服务器的一个用户不应该产生太多的负载,而是对其他人没有响应。
但是,要解决这个问题并不容易。有几种解决方案。
首先,在您执行任何其他操作之前,应确保您的代码使用PyPy,这可能会为您提供支持更多用户所需的所有其他性能。即使这还不够,但与其他解决方案相结合应该会有所帮助。
一个是您可以使用策略like this在多个进程中运行此代码,这将允许您在多个核心上抢先运行该进程。当然,这不会让你在一个过程中同时做很多事情。
另一个选择是,您可以使用sshFactory
来.filter('minutes2hm', function () {
return function (min, apply) {
if (apply === false) {
return min;
}
var h = Math.floor(min / 60).toString();
min = (min - (h * 60)).toString();
return '' + '00'.substring(0, 2 - h.length) + h + ':' + '00'.substring(0, 2 - min.length) + min;
};
对{}进行限速,并确保在竞争连接之间公平处理。
请分享您对此所做的任何进展,因为我相信其他Twisted用户会感兴趣!