Сервер не AWS подключается к базе данных AWS RDS намного медленнее - PullRequest
0 голосов
/ 08 мая 2019

Я мигрирую из хостинговой компании, которая в настоящее время размещает мое веб-приложение на основе PHP и базу данных MySQL на одном сервере. Их характеристики сервера приличные: сервер работает на SSD, 11 ГБ ОЗУ и 8-ядерный ЦП (GenuineIntel, версия QEMU Virtual CPU (cpu64-rhel6), 2399,996 МГц, 4096 КБ).

Я не могу переместить все сразу, поэтому просто хочу переместить базу данных в AWS RDS и обновить хост в моей конфигурации PHP до конечной точки AWS.

Я настроил это с помощью базовых пакетов, доступных в AWS для тестирования - t2.micro EC2 (для тестирования / тестирования сценариев PHP) и db.t2.micro RDS.

Все работает, но очень медленно, когда я подключаюсь с моего удаленного сервера, не AWS. Те же таблицы базы данных, в которых используется одна и та же версия MariaDB с одинаковым количеством строк в таблицах, дают следующие результаты:

AWS EC2 -> AWS RDS (fully AWS)
Connected via PDO in 0.04 seconds
Queried 1000 rows in 0.63 seconds

Remote Server -> AWS RDS (part AWS)
Connected via PDO in 0.16 seconds
Queried 1000 rows in 5.49 seconds

Remote Server -> Database running on same server (non AWS)
Connected via PDO in 0.00 seconds
Queried 1000 rows in 2.70 seconds

Как видите, установка AWS является самой быстрой, даже в пакетах бесплатного уровня.

Полностью удаленная настройка сервера медленнее, но все же не ужасна.

Удаленный сервер -> Настройка AWS самая медленная.

Поскольку я новичок в AWS, я был бы очень признателен, если бы кто-нибудь дал мне знать, если это ожидается. Всегда ли вызовы не AWS на AWS RDS будут намного медленнее?

Может ли что-то на любом сервере замедлять скорость?

PS. Удаленный сервер находится в Великобритании, и регион AWS установлен на EU-West, поэтому я не думаю, что это связано с задержкой на расстоянии.

EDIT Рик Джеймс спросил в комментариях ниже о кеше запросов и т. Д. Кэширование отключено, но, чтобы убедиться, что я изменил свой скрипт, он выполняет следующие действия:

$mysqli = mysqli_connect($dbhost,$username,$password,$dbname) or die ("could not connect to mysql");

$tableCreate = "CREATE TABLE IF NOT EXISTS test_tbl (id int(11) NOT NULL auto_increment, RandomTxt TEXT, PRIMARY KEY (id))";
$queryResult = mysqli_query($mysqli , $tableCreate);

for ($i = 1; $i <= 1000; $i++) {
    mysqli_query($mysqli,"INSERT INTO `test_tbl` (RandomTxt) VALUES ('abcdefghijklmnopqrstuvwxyz')" )  ;
}

$result = mysqli_query($mysqli , 'SELECT * FROM test_tbl') ;
$arrayResults = array() ;
while ($row = $result->fetch_assoc()) {
    array_push($arrayResults , $row['RandomTxt']);
}

$dropTable = "DROP TABLE `test_tbl`";
$queryResult = mysqli_query($mysqli , $dropTable);

После каждого запроса у меня есть скрипт таймера PHP. Результаты этого обновленного скрипта:

AWS EC2 -> AWS RDS (fully AWS)
Db connection established at : 0.04184008
Table created at : 0.05363607
Data inserted into the table at : 3.64998102
Data is read from table and inserted into an array at : 3.65190291
Table dropped at : 3.66061902

Remote Server -> AWS RDS (part AWS)
Db connection established at : 0.08496714
Table created at : 0.11568093
Data inserted into the table at : 21.78033495
Data is read from table and inserted into an array at : 21.82050204
Table dropped at : 21.84762096

Remote Server -> Database running on same server (non AWS)
Db connection established at : 0.00079298
Table created at : 0.00664401
Data inserted into the table at : 0.15589213
Data is read from table and inserted into an array at : 0.16134501
Table dropped at : 0.16468596

Я просто хочу повторить, что я новичок в использовании AWS, и, если люди ожидают этих результатов, пожалуйста, дайте мне знать. Мне нужно знать, должно ли соединение с RDS с сервера, не принадлежащего AWS, быть достаточно быстрым для производственного использования, поскольку на данный момент это, конечно, не так.

РЕДАКТИРОВАТЬ 2 Я также побежал time nc -vz xxx.xxx.eu-west-1.rds.amazonaws.com 3306, чтобы проверить время. Результат от не AWS-хоста был:

real    0m0.227s
user    0m0.014s
sys     0m0.005s

Результат от EC2 к RDS был:

real    0m0.112s
user    0m0.002s
sys     0m0.000s

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

После долгой отладки этого моим хостом они пришли к выводу, что это невозможно решить с помощью любой службы в их центре обработки данных, если AWS не добавит свое собственное оборудование в ближайший центр обработки данных.

Существует возможность перенести приложение на один из их серверов в их лондонском дата-центре, который имеет меньшую задержку на AWS.

Так что в принципе это было ненормально, и можно использовать RDS с не- размещенное приложение AWS, но при этом важно, где находится хост, не принадлежащий AWS.

0 голосов
/ 24 мая 2019

Для «дистанционного» теста, я удивлен, что через пруд прошло всего 5,49 секунды. У вас есть 1002 поездки между США и Великобританией. Это подразумевает 5,5 мс на время пинга; Я думал, что это было больше, чем это. Если вы поместите все 1000 вставок в один оператор , все сроки вставки значительно улучшатся. Это изменение поможет даже локальному коду, но не так сильно (только в 10 раз вместо почти в 1000 раз).

Как я понимаю в описании различных конфигураций, время пинга (до 5,5 мс) является самым большим фактором скорости.

Второй по величине номер совершает транзакцию. «Локальные» 150 мс для фиксации 1000 строк по одной означают очень быстрые 0,15 мс. Это должно быть SSD.

Я бы предпочел синхронизацию с microtime(true) до и после каждого шага, затем выведите разницу. Пахнет, как будто есть дополнительные издержки в числах, которые вы предоставили.

Еще одна вещь, которую нужно проверить: была ли таблица ENGINE = InnoDB (не MyISAM) в всех тестах? Было бы лучше, чтобы было явно указано на CREATE TABLE.

Итак ... Пакетируйте INSERTs и делайте другие вещи, чтобы уменьшить количество поездок туда и обратно. Есть и другие советы, но нам нужно увидеть код real , а не искусственный тест. Другой совет - объединить несколько операторов в хранимую процедуру; затем есть одна поездка туда и обратно CALL, а не несколько.

...