diff --git a/changelog/unreleased/pull-4445 b/changelog/unreleased/pull-4445 new file mode 100644 index 000000000..af79a6316 --- /dev/null +++ b/changelog/unreleased/pull-4445 @@ -0,0 +1,9 @@ +Enhancement: allow customizing MaxConcurrentRequestsPerFile and MaxPacket parameters in the sftp backend + +SFTP over long fat links suffers from poor performance due to its by default +overly small max payload size. But implementations such as OpenSSH tend to +accept vastly bigger packets, which improves backup performance for this +kind of situation. Restic now allows customizing the max packet size and +max concurrent requests per file parameters in the sftp backend. + +https://github.com/restic/restic/pull/4445 diff --git a/internal/backend/sftp/config.go b/internal/backend/sftp/config.go index aa8ac7bff..bccb8733f 100644 --- a/internal/backend/sftp/config.go +++ b/internal/backend/sftp/config.go @@ -17,13 +17,17 @@ type Config struct { Command string `option:"command" help:"specify command to create sftp connection"` Args string `option:"args" help:"specify arguments for ssh"` - Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 5)"` + Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 5)"` + MaxConcurrentRequestsPerFile int `option:"max_concurrent_requests_per_file" help:"sets the maximum concurrent requests allowed for a single file (default: 64)"` + MaxPacket int `option:"max_packet" help:"sets the maximum size of the payload, measured in bytes (default: 32768)"` } // NewConfig returns a new config with default options applied. func NewConfig() Config { return Config{ - Connections: 5, + Connections: 5, + MaxConcurrentRequestsPerFile: 64, + MaxPacket: 32768, } } diff --git a/internal/backend/sftp/sftp.go b/internal/backend/sftp/sftp.go index 0a94e4aa3..964aff120 100644 --- a/internal/backend/sftp/sftp.go +++ b/internal/backend/sftp/sftp.go @@ -102,7 +102,10 @@ func startClient(cfg Config) (*SFTP, error) { }() // open the SFTP session - client, err := sftp.NewClientPipe(rd, wr) + client, err := sftp.NewClientPipe(rd, wr, + sftp.MaxConcurrentRequestsPerFile(cfg.MaxConcurrentRequestsPerFile), + sftp.MaxPacketUnchecked(cfg.MaxPacket), + ) if err != nil { return nil, errors.Errorf("unable to start the sftp session, error: %v", err) }