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 ed7c2cafa..517895a56 100644 --- a/internal/backend/sftp/config.go +++ b/internal/backend/sftp/config.go @@ -16,13 +16,17 @@ type Config struct { Layout string `option:"layout" help:"use this backend directory layout (default: auto-detect)"` Command string `option:"command" help:"specify command to create sftp connection"` - 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 3e127ef05..e8e7b72a1 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) }