Изменение алгоритмов управления перегрузкой для каждого соединения

Команда 'sysctl' в linux на данный момент глобально изменяет алгоритм управления перегрузкой для всей системы. Но управление перегрузкой, когда размер окна TCP и другие подобные параметры варьируются, обычно выполняется для каждого соединения TCP. Итак, мой вопрос:

  • Существует ли способ изменить алгоритм управления перегрузкой, используемый для TCP-соединения?

Или я пропустил что-то тривиальное здесь? Если так, то, что это?


person Hrishikesh Murali    schedule 14.01.2011    source источник


Ответы (4)


Это делается в iperf с использованием параметра -Z — патч здесь.

Вот как это реализовано (PerfSocket.cpp, строка 93):

    if ( isCongestionControl( inSettings ) ) {
#ifdef TCP_CONGESTION
    Socklen_t len = strlen( inSettings->mCongestion ) + 1;
    int rc = setsockopt( inSettings->mSock, IPPROTO_TCP, TCP_CONGESTION,
                 inSettings->mCongestion, len);
    if (rc == SOCKET_ERROR ) {
        fprintf(stderr, "Attempt to set '%s' congestion control failed: %s\n",
            inSettings->mCongestion, strerror(errno));
        exit(1);
    }
#else
    fprintf( stderr, "The -Z option is not available on this operating system\n");
#endif

Где mCongestion – это строка, содержащая название используемого алгоритма.

person rupello    schedule 07.06.2011

Кажется, это возможно через get/setsockopt. Единственная документация, которую я нашел, это: http://lkml.indiana.edu/hypermail/linux/net/0811.2/00020.html

person Jan    schedule 17.03.2011

В более новых версиях Linux можно установить контроль перегрузки для определенного пункта назначения, используя ip route ... congctl.

Если кто-то знаком с этим подходом, пожалуйста, отредактируйте этот пост.

person FormerNcp    schedule 17.08.2018

В Linux есть подключаемые алгоритмы перегрузки, которые могут изменять используемый алгоритм на лету, но это общесистемная настройка. не за соединение.

person ismail    schedule 14.01.2011
comment
Да, я знаю об этом. $ sudo modprobe tcp_‹congestion_algorithm› добавит указанный алгоритм в качестве записи в /proc/sys/net/ipv4/tcp_available_congestion_control. Но мой вопрос касается настроек конкретного подключения. - person Hrishikesh Murali; 14.01.2011
comment
Ну, это не для каждого соединения, это было бы медленным поиском для каждого соединения. - person ismail; 14.01.2011
comment
Настройка по умолчанию находится в /proc/.../tcp_congestion_control. Алгоритмы, выбираемые через setsockopt, находятся в tcp_available_congestion_control. Есть еще один файл, который содержит все алгоритмы, установленные в ядре. Однако смешивание различных алгоритмов управления перегрузкой на одном устройстве обычно приводит к тому, что один из них забирает большую часть полосы пропускания (reno почти всегда проигрывает). - person symcbean; 31.10.2012