diff --git a/changelog/unreleased/issue-4209 b/changelog/unreleased/issue-4209 new file mode 100644 index 000000000..2e49191c1 --- /dev/null +++ b/changelog/unreleased/issue-4209 @@ -0,0 +1,7 @@ +Bugfix: Fix slow sftp upload performance + +Since restic 0.12.1, the upload speed of the sftp backend to a remote server +has regressed significantly. This has been fixed. + +https://github.com/restic/restic/issues/4209 +https://github.com/restic/restic/pull/4782 diff --git a/internal/backend/sftp/sftp.go b/internal/backend/sftp/sftp.go index 0a94e4aa3..efd66f76c 100644 --- a/internal/backend/sftp/sftp.go +++ b/internal/backend/sftp/sftp.go @@ -102,7 +102,12 @@ func startClient(cfg Config) (*SFTP, error) { }() // open the SFTP session - client, err := sftp.NewClientPipe(rd, wr) + client, err := sftp.NewClientPipe(rd, wr, + // write multiple packets (32kb) in parallel per file + // not strictly necessary as we use ReadFromWithConcurrency + sftp.UseConcurrentWrites(true), + // increase send buffer per file to 4MB + sftp.MaxConcurrentRequestsPerFile(128)) if err != nil { return nil, errors.Errorf("unable to start the sftp session, error: %v", err) } @@ -359,7 +364,7 @@ func (r *SFTP) Save(_ context.Context, h backend.Handle, rd backend.RewindReader }() // save data, make sure to use the optimized sftp upload method - wbytes, err := f.ReadFrom(rd) + wbytes, err := f.ReadFromWithConcurrency(rd, 0) if err != nil { _ = f.Close() err = r.checkNoSpace(dirname, rd.Length(), err)