2016-11-15 1 views
2

Ich schreibe einen SSH-Server mit Twisted Conch. Aber stieß auf ein schwieriges Problem. Angenommen, Benutzer A und Benutzer B melden sich über den Befehl ssh beim twisted ssh-Server an. Dann Benutzer A Schwanz oder Katze eine große Datei (größer als 100M) auf dem Server, die viel Echo durch die twisted SSH-Server verursachen wird, wodurch python ssh Prozess (twisted.conch) CPU-Auslastung ist sehr hoch (größer als 95% oder sogar 100%), dann wird der Benutzer B blockiert, lange keine Antwort. Gibt es eine Möglichkeit, die Sitzung von BenutzerA zu schlafen (0,5 Sekunden), wenn der Benutzer A eine große Anzahl von Echos durch den twisted ssh-Server findet und die anderen verbundenen Benutzer nicht blockiert.Python SSH Server (twisted.conch) nimmt hohe CPU-Auslastung, wenn eine große Anzahl von Echo

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() 

Antwort

2

Dies ist effektiv ein Fehler in Twisted. Ein Benutzer, der den Server verwendet, sollte nicht so viel laden, dass er nicht auf alle anderen reagiert.

Es ist jedoch nicht einfach zu beheben. Es gibt ein paar Lösungen.

Bevor Sie irgendetwas anderes tun, sollten Sie zunächst sicherstellen, dass Ihr Code PyPy verwendet. Dadurch erhalten Sie möglicherweise die zusätzliche Leistung, die Sie benötigen, um mehr Benutzer zu unterstützen. Auch wenn es nicht ausreicht, sollte es in Kombination mit diesen anderen Lösungen hilfreich sein.

Eine ist, dass Sie diesen Code in mehreren Prozessen ausführen können, mit einer Strategie like this, mit der Sie den Prozess auf mehrere Kerne präventiv ausführen können. Das lässt Sie natürlich nicht viel gleichzeitig in einem Prozess arbeiten.

Eine weitere Option ist, dass Sie twisted.protocols.htb verwenden können, die Sie unter sshFactory verwenden können, um den eingehenden Datenverkehr zu begrenzen und sicherzustellen, dass er fair zwischen konkurrierenden Verbindungen verarbeitet wird.

Bitte teilen Sie alle Fortschritte, die Sie dabei machen, da ich sicher bin, dass es für andere Twisted-Nutzer interessant wäre!

Verwandte Themen