2 votes

Comment spécifier l'algorithme de congestion TCP à utiliser pour mon processus rsync de longue durée ?

J'ai une énorme tâche de rsync où je voudrais synchroniser la collection de fichiers de mon poste de travail et du serveur distant (rsync via ssh). Je prévois que le processus prendra des semaines alors je ne veux pas paralyser mon réseau tout ce temps en augmentant la latence du réseau pour tous les autres processus.

Je sais que si je pouvais convaincre le rsync de passer à un contrôle de congestion à faible priorité (lp), il donnerait automatiquement la plupart de la bande passante du réseau à d'autres processus en cas de congestion.

Je sais que je peux charger le support pour le contrôle de congestion à faible priorité simplement en exécutant sudo modprobe tcp_lp et les applications en mode utilisateur sont autorisées à l'utiliser tant qu'il est répertorié dans /proc/sys/net/ipv4/tcp_allowed_congestion_control.

Cependant, je préfère garder cdg ou vegas comme mon algorithme de contrôle de congestion par défaut. Comment faire pour que rsync (et le ssh sous-jacent) utilisent plutôt l'algorithme de contrôle de congestion lp ?

Mon intention est de permettre à rsync d'aller à pleine vitesse tant que le réseau n'est pas utilisé pour autre chose.

2voto

James Mertz Points 390

Si la destination est connue, spécifiez l'algorithme de contrôle de congestion comme une option de route :

ip route add /32 via  congctl lp

Alternativement, LD_PRELOAD une bibliothèque qui appelle setsockopt(..., TCP_CONGESTION, "lp") sur le socket TCP avant la connexion (probablement un bon endroit pour le faire est en accrochant l'appel setsockopt existant (IP_TOS) que ssh fait déjà), ou patch ssh pour le faire lui-même.

/* gcc -shared -o force_lp.so force_lp.c */

#define _GNU_SOURCE
#include 
#include 
#include 
#include 
#include 

int setsockopt(int fd, int level, int name, const void *value, socklen_t len)
{
    static int (*real_setsockopt)(int, int, int, const void *, socklen_t);
    int r;

    if (!real_setsockopt)
        real_setsockopt = dlsym(RTLD_NEXT, "setsockopt");

    if ((level == SOL_IP && name == IP_TOS) ||
        (level == SOL_IPV6 && name == IPV6_TCLASS))
    {
        /* Il s'agit probablement du socket TCP qui sera utilisé pour SSH. */
        r = real_setsockopt(fd, SOL_TCP, TCP_CONGESTION, "lp", sizeof "lp");
        if (r != 0)
            warn("Could not set congestion control algorithm");
    }

    return real_setsockopt(fd, level, name, value, len);
}

Juste pour préciser, rsync n'a pas son mot à dire dans l'algorithme de congestion car il n'a jamais un accès direct au socket TCP - il fait tout en parlant au processus ssh via stdio.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X