Prędkości przesyłania SCP wydają się być znacznie ograniczone w bibliotece, z tego, do czego służy program narzędziowy scp. Rozumiem, że jest to Ruby (1.9.2-p0), ale Net :: SCP jest około 8 razy wolniejsze niż narzędzie Linux (widziane z dużych plików ... zobacz poniżej). Jestem ciekawy (szybko rzuciłem okiem na kod), jeśli tak wygląda gniazdo w Ruby lub czy można multipleksować gniazda Net :: SCP lepiej?Problemy z wydajnością w przypadku transferów Ruby i Net :: transfery SCP (gniazda)
Zauważyłem, że niezależnie od tego, jaki styl przesyłania próbowałem (seryjne przesyłanie, kanały działające asynchronicznie, przy użyciu wielu wystąpień obiektu scp) Nigdy nie mogłem uzyskać ponad 9 megabajtów/sekundę szybkości przesyłania na przesyłanie SCP. Teraz ... pozwól mi wyjaśnić szczegóły mojego dochodzenia:
1) Wypróbowane różnych algorytmów szyfrowania
używałem różnych typów szyfrowania bez większego istotna zmiana prędkości Przykład: mogę przesłać mój plik testowy 1GB za pomocą command scp (algorytm szyfrowania = arcfour128) i uzyskaj transfer na poziomie 73,3 megabajtów/s na moim wewnętrznym połączeniu gigabitowym. Nigdy nie uzyskałem więcej niż około 9 megabajtów na moim wewnętrznym łączu gigabitowym przy użyciu biblioteki Net :: SCP.upload.
2) Próbowałem różnych hostów/systemów operacyjnych
Okazało się, że Linux - przesłane> Linux był najszybszy. Serwer ssh SUHA (Windows) mógł zapewnić mi maksymalną prędkość wysyłania wynoszącą 13,5megabajtów/s (Linux -> Windows, używając algorytmu arcfour w linii poleceń scp), natomiast Linux -> Linux (używając linii poleceń arcfour, w/scp) był płonący 73,3megabajtów na sekundę. Należy wspomnieć, że te okna i maszyny Linux są dokładnie ten sam model, sprzętu, itp
3) Próbowałem różnych metod SCP przesyłania
-> używany 2 synchronicznego przesyłania! połączenia, jedna po drugiej została zakończona. -> użył 2 asynchronicznych wywołań wgrywających, jeden po drugim zaczął -> użył 2 obiektów Net :: SCP i przesłał plik do nieblokującej/asynchronicznej wersji wgrywania (tak, że działały równolegle) Żadna z tych różnych metod dać znaczący wzrost wydajności, co jest frustrujące.
Oto wyniki testu (tekst wzmocniona dla czytelności, ale podobny do wyjścia kod dostarczony):
Net::SCP
Done creating channels
Starting transfer of /home/seth/afpcases/systeme.afp # two upload! calls, one after another
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 126.07707 seconds (8.7168903909331 megabytes/s) should show transfer speed of serial uploads
Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls, one after another, with a wait on both channels after both have started
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 122.588784 seconds (8.964931082112699 megabytes/s) should show transfer speed of simultaneous async channels.
Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls on two separate Net::SCP objects, one after another, with a wait on both channels after both have started
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 122.822663 seconds (8.947860054133495 megabytes/s) should show transfer speed of simultaneous SCP instances
Finished in 371.761262 seconds
Jeśli masz duży plik (użyłem pliku ~ 1GB), możesz użyć tych testów rspec (w scp_spec.rb) lub zmienić je na wszelkie znane ci uprzęże testowe, aby zobaczyć spadek wydajności.
Jeśli nie wiesz, jak można ulepszyć tę wydajność w bibliotece, masz więcej pomysłów na temat otwarcia dodatkowej równoległej prędkości przesyłania SCP poza wywołaniem narzędzia scp za pomocą podpowłoki?
rspec Test tutaj: https://gist.github.com/703966