使用 Ubuntu 18.04 上标准的 scp
(版本:1:7.6p1-4ubuntu0.3
)将110GB文件传输到另一台主机大约需要6-8分钟。
使用 Go 的 pkg/sftp
进行传输时,需要的时间翻倍:
示例:
package main
import (
"fmt"
"github.com/melbahja/goph"
"golang.org/x/crypto/ssh"
"io"
"log"
"os"
"time"
)
func main() {
auth, err := goph.Key("your/key", "")
if err != nil {
log.Fatalln(err)
}
client, err := goph.NewConn(&goph.Config{
User: "someUser",
Addr: "someHostname",
Port: 22,
Auth: auth,
//Timeout: time.Duration(timeout) * time.Second,
Callback: ssh.InsecureIgnoreHostKey(),
})
if err != nil {
log.Fatalln(err)
}
file := "/some/file"
start := time.Now()
local, err := os.Open(file)
if err != nil {
return
}
defer local.Close()
ftp, err := client.NewSftp()
// VARIATION 1 => ftp, err := client.NewSftp(sftp.MaxPacketUnchecked(1 << 16))
if err != nil {
return
}
defer ftp.Close()
remote, err := ftp.Create(file)
if err != nil {
return
}
defer remote.Close()
/*
VARIATION 1 => buffer := make([]byte, 1 << 16)
VARIATION 1 => _, err = io.CopyBuffer(remote, local, buffer)
*/
_, err = io.Copy(remote, local)
if err != nil {
log.Fatalln(err)
}
duration := time.Since(start)
fmt.Println(duration)
}
注意:我甚至尝试使用已被注释掉的代码行(参见
VARIATION 1
)来增加读取缓冲区的大小(以及TCP最大数据包大小),但没有任何改进。有任何想法为什么这样做,并如何加快Go语言的等效运行速度?
bufio.Reader
中,但加速管道可能是所需的。 - JimB