Vraag Hoge frequentie voer een script uit op een andere server


In mijn applicatie heb ik twee servers (privé en extern) en er is een behoefte voor de privé server om een ​​script op de externe server uit te voeren.

Met behulp van ssh probeer ik de limieten te testen van het aantal verbindingen dat het zal bevatten:

while (1)
  foreach k (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 )
    ssh -i /path/to/key user@host "ls;sleep 0.3" &
    sleep 0.06  # <=16.6 times/sec
  end
end

De externe server (2 core CPU, 4 GB ram), slaagt er in om de inkomende verbindingen te behouden wanneer ze ongeveer 16 / sec zijn. Alles sneller dan dat, het heeft verbindingsproblemen, en CPU-belasting wordt van het dak gehaald (totale taken & zombie-proceshoeveelheden beginnen zich te accumuleren. Het geheugengebruik lijkt echter laag).

Het foutbericht dat we op de privéserver zien na een paar seconden aan hoogfrequente verbindingen is

 ssh_exchange_identification: Connection closed by remote host

met hetzelfde testscript op de externe server, zien we geen probleem met die snelheid (cpu-belasting is ongeveer 7%, geen zombies).

Ervan uitgaande dat het een ssh-probleem is, hebben we deze in het ssh-configuratiebestand toegevoegd en de ssh-service opnieuw gestart, maar het heeft niet geholpen:

MaxStartups 20:50:100
MaxSessions 100

BIJWERKEN

Zoals voorgesteld probeerde ik ControlMaster te gebruiken. Dit is wat ik deed:

Toegevoegd aan de ~ / .ssh / config in de private server:

Host <external_host_ip>
       ControlMaster auto
       ControlPath ~/.ssh/cm_socket/%r@%h:%p
       ControlPersist 600

De eerste verbinding gemaakt:

 ssh -M -S /home/user/.ssh/cm_socket/user@host_ip:22 -i ~/key.pem  user@host_ip

Ik controleerde en er gebeurde iets in de map 'cm_socket':

$ ll ~/.ssh/cm_socket/
srw------- 1 user user    0 Oct 18 18:10 user@host_ip:22=

maar toen ik een volgende ssh zonder de sleutel probeerde te doen, werkte het niet:

$ ssh -M -S /home/user/.ssh/cm_socket/user@host_ip:22 user@host_ip
Permission denied (publickey).

Is er een manier om de doorvoer te vergroten die met deze setup kan worden afgehandeld?


1
2017-10-18 14:48


oorsprong


Gebruik ControlMaster functionaliteit van client OpenSSH. - Jakuje
Bedankt voor de reactie. Ik probeerde het, om de een of andere reden werkte het niet. Ik heb de vraag met het resultaat bijgewerkt, ik zou blij zijn als je een kijkje kunt nemen - mimusheli
Gebruik makend van -M voorkomt dat de tweede verbinding wordt aangesloten op de bestaande socket. - Jakuje


antwoorden:


Gebruik ControlMaster:

Host <external_host_ip>
   ControlMaster auto
   ControlPath ~/.ssh/cm_socket/%r@%h:%p
   ControlPersist 600
   User user
   IdentityFile ~/key.pem

En dan verbinden alleen gebruiken ssh host_ip. De eerste sessie initieert de verbinding, de andere (maximaal 100 opeenvolgende volgens uw opstelling) zullen de eerste opnieuw gebruiken. Het zou een stuk sneller moeten worden.


0
2017-10-18 18:24



uitstekend. Het werkte! Omdat ik niet wil dat de verbinding wordt afgesloten, gebruik ik ControlPersist = ja. Deze ssh-tunnel moet altijd open worden gehouden. Ik heb gelezen over 'autossh'. Om zeker te zijn, is er hier behoefte aan 'autossh', of is de ControlMaster-oplossing goed genoeg? - mimusheli
autossh herstelt de verbinding in het geval van een storing (voor tunnels). Voor een normale verbinding heb je dat niet nodig. Ook wat ServerAliveTimeout en ServerAliveInterval zal de verbinding tot stand brengen in tijden van inactiviteit. - Jakuje
Dankje voor het antwoord. Nu heb ik een ander gerelateerd probleem link - mimusheli
link naar het probleem => hier (was niet erg duidelijk in eerdere opmerking) - mimusheli