2016-11-15 4 views
2

트위스티드 Conch로 SSH 서버를 작성합니다. 그러나 어려운 문제가 발생했습니다. 사용자 A와 사용자 B가 ssh 명령을 통해 트위스트 된 ssh 서버에 로그인한다고 가정합니다. 그런 다음 사용자 꼬리 또는 꼬리표 고양이가 큰 파일 (100M 이상), 트위스트 ssh 서버를 통해 에코 많은 원인이 될 것입니다, 파이썬 ssh 프로세스 (twisted.conch) cpu 사용법을 만드는 것은 매우 높습니다 (95 % , 또는 심지어 100 %), 사용자 B는 차단 될 것이며 오랜 시간 응답이 없습니다. 사용자 A가 꼬인 ssh 서버를 통해 많은 수의 에코를 갖고 있고 다른 연결된 사용자를 차단하지 않으면 userA의 세션을 잠글 수있는 방법이 있습니까 (0.5 초).많은 수의 에코가있을 때 파이썬 SSH 서버 (twisted.conch)가 높은 CPU 사용량을 차지합니다.

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

답변

2

이것은 사실상 Twisted의 버그입니다. 서버를 사용하는 한 사용자가 너무 많은 부하를 발생 시켜서 다른 모든 사람에게 반응이 없어야합니다.

그러나 쉽게 해결할 수있는 방법은 아닙니다. 몇 가지 해결책이 있습니다.

먼저 다른 작업을 수행하기 전에 코드가 PyPy인지 확인해야합니다. 그러면 더 많은 사용자를 지원하는 데 필요한 모든 추가 성능을 얻을 수 있습니다. 충분하지 않더라도 이러한 다른 솔루션과 함께 사용하면 도움이됩니다.

하나의 전략은 like this 전략을 사용하여 여러 프로세스에서이 코드를 실행할 수 있으므로 다중 코어에서 프로세스를 선제 적으로 실행할 수 있습니다. 물론 이것은 하나의 프로세스 내에서 많은 것을 동시에 수행하도록하지는 않습니다.

sshFactory에서 사용할 수있는 twisted.protocols.htb을 사용하면 들어오는 트래픽의 속도를 제한하고 경쟁 연결 사이에서 공정하게 처리되도록 할 수 있습니다.

나는 다른 Twisted 사용자들에게 흥미로울 것입니다.