Коллеги,Поделитесь своими мыслями по поводу следующего сценария.
Есть 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 прокси?
> Есть идеи, почему скорость вырастает при работе через ssh прокси?Поставь в /etc/ssh/ssh_config
Compression no
и попробуй измерить снова
>> Есть идеи, почему скорость вырастает при работе через 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%
Попробуй Nagle отключить
> Попробуй Nagle отключитьКак и где именно это сделать?
> Попробуй 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