URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 97974
[ Назад ]

Исходное сообщение
"ускорение импорта данных в RDS MySQL с помощью ssh proxy"

Отправлено Alexander , 24-Май-24 17:56 
Коллеги,

Поделитесь своими мыслями по поводу следующего сценария.

Есть EC2 instance в регионе us-east-1 (ec2-use1), где лежит дамп базы mysql. Есть инстанс RDS в регионе ap-southeast-2 (rds-apse2).

Импорт данных идет скоростью примерно 2.5MB/sec с пиками до 3:
[user@ec2-use1]$ pv user_service.dump | mysql --defaults-file=mysqlroot.cnf -h rds-apse2 -u sp user_service

Но если поднять EC2 инстанс в регионе RDS (ec2-apse2) и импортировать данные через pipe, то скорость вырастает в 2 раза (в серднем 5.5MB/sec с пиками до 10):
[user@ec2-use1]$ pv user_service.dump | ssh ec2-user@ec2-apse2 mysql --defaults-file=mysqlroot.cnf -h rds-apse2 -u sp user_service

Если же импортировать данные через ssh-тоннель, то скорость такая же, как и без ssh:
[user@ec2-use1]$ ssh -L 3306:rds-apse2:3306 ec2-user@ec2-apse2
[user@ec2-use1]$ pv user_service.dump | mysql --defaults-file=mysqlroot.cnf -h localhost -u sp user_service

Есть идеи, почему скорость вырастает при работе через ssh прокси?


Содержание

Сообщения в этом обсуждении
"ускорение импорта данных в RDS MySQL с помощью ssh proxy"
Отправлено Аноним , 25-Май-24 01:38 
> Есть идеи, почему скорость вырастает при работе через ssh прокси?

Поставь в /etc/ssh/ssh_config
Compression no
и попробуй измерить снова


"ускорение импорта данных в RDS MySQL с помощью ssh proxy"
Отправлено Alexander , 27-Май-24 09:43 
>> Есть идеи, почему скорость вырастает при работе через ssh прокси?
> Поставь в /etc/ssh/ssh_config
> Compression no
> и попробуй измерить снова

Ничего не изменилось:
# pv user_service.dump | ssh -o Compression=no ec2-user@ec2-apse2 mysql --defaults-file=mysqlroot.cnf -h rds-apse2 -u sp user_service
390MiB 0:01:14 [5.20MiB/s] [===================================================================================================================>] 100%


"ускорение импорта данных в RDS MySQL с помощью ssh proxy"
Отправлено Tron is Whistling , 25-Май-24 09:14 
Попробуй Nagle отключить

"ускорение импорта данных в RDS MySQL с помощью ssh proxy"
Отправлено Alexander , 27-Май-24 09:43 
> Попробуй Nagle отключить

Как и где именно это сделать?


"ускорение импорта данных в RDS MySQL с помощью ssh proxy"
Отправлено Alexander , 27-Май-24 10:11 
> Попробуй Nagle отключить

чатгпт посоветовал сделать через LD_PRELOAD и выдал такой код:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

int socket(int domain, int type, int protocol) {
    // Оригинальная функция socket
    int (*original_socket)(int, int, int);
    original_socket = dlsym(RTLD_NEXT, "socket");

    // Вызов оригинальной функции
    int sockfd = original_socket(domain, type, protocol);
    if (sockfd < 0) {
        return sockfd;
    }

    // Установка TCP_NODELAY для созданного сокета
    if (domain == AF_INET && type == SOCK_STREAM) {
        int opt = 1;
        if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)) < 0) {
            perror("setsockopt TCP_NODELAY");
        }
    }

    return sockfd;
}

gcc -shared -fPIC -o tcp_nodelay.so tcp_nodelay.c -ldl

Судя по strace'у код рабочий:
...
connect(5, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("172.16.7.170")}, 16) = 0
setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
setsockopt(5, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
...

Но не помогло:
# pv user_service.dump | LD_PRELOAD=/home/ec2-user/tcp_nodelay.so mysql --defaults-file=mysqlroot.cnf -h rds-apse2 -u sp user_service
^C.5MiB 0:00:23 [2.99MiB/s] [==============>                                                                                                      ] 13% ETA 0:02:31
^C -- query aborted