Отправка чрезвычайно медленных Данных или RDS

У меня есть следующие два профиля для основного SELECT ОПЕРАТОР:

select count(*) from mturk_completion;

Вот два профиля:

# My Local machine, using a local db
Status                Duration
starting              0.000045
checking permissions  0.000006
Opening tables        0.000015
init                  0.000011
System lock           0.000006
optimizing            0.000004
statistics            0.000011
preparing             0.000009
executing             0.000002
Sending data          0.034015 ########
end                   0.000012
query end             0.000006
closing tables        0.000011
freeing items         0.000036
cleaning up           0.000010

И затем здесь это находится на моем AWS ec2 большой экземпляр с помощью RDS mysql дб:

starting                0.000068
checking permissions    0.000016
Opening tables          0.000028
init                    0.000024
System lock             0.000018
optimizing              0.000015
statistics              0.000022
preparing               0.000022
executing               0.000012
Sending data            0.446171 #########
end                     0.000036
query end               0.000018
closing tables          0.000023
freeing items           0.00009
cleaning up             0.000013

Большинство чисел сопоставимо кроме Передающей части данных, больше чем в десять раз медленнее на экземпляре RDS!! Что могло составлять это, и как я зафиксирую это?

Вот информация об экземпляре RDS:

enter image description here

1
задан 13 February 2015 в 01:20
1 ответ

Sending data

Sending data

The thread is read and processing rows for a SELECT statement, and посылать данные клиенту. Потому что операции, происходящие во время этого это состояние имеет тенденцию выполнять большие объемы доступа к диску (считывания) , это состояние Часто это самое длительное состояние за время жизни конкретного запроса.

http://dev.mysql.com/doc/refman/5.0/en/general-thread-states.html

Подозреваю, что разница в скорости доступа к диску.

В первом тесте кажется, что у вас есть локальная машина, подключенная к локальному серверу БД с локальным жёстким диском. Во втором тесте вы подключаетесь к удаленному серверу БД с удаленным жестким диском (т.е. EBS).

EBS (который RDS использует для хранения) значительно медленнее чем хранение экземпляров, которое, как я полагаю, все еще может быть медленнее, чем разгруженный локальный диск на вашей рабочей станции (особенно, если у вас есть SSD).

Однако в обмен на потерю производительности вы получаете ряд преимуществ, обусловленных абстрактной природой ELB:

  • Способность делать снимки вашего экземпляра и запускать новые экземпляры со снимка
  • Способность изменять размер вашего диска
  • Способность изменять производительность вашего диска (с помощью IOPS)
  • Способность прозрачно перемещать ваш экземпляр RDS на новый хост, который может произойти во время перезагрузки или изменения типа экземпляра

Именно поэтому большинство людей принимают штраф за потерю производительности. Если потеря производительности значительна, то вы можете попробовать несколько вещей:

  • провайдерская IOPS
  • Запустите свой собственный экземпляр MySQL на EC2, используя хранилище экземпляров. Я не рекомендую это делать, так как будет очень сложно избежать потери данных, если ваш экземпляр будет остановлен, и вы не сможете изменить размер вашего диска, если данные будут расти.
  • Запустите свой собственный MySQL экземпляр на EC2, используя EBS в RAID
  • Масштабирование по горизонтали, добавьте читаемые реплики, если IO на вашем хозяине становится узким местом
  • Реализуйте кэширование данных в вашем приложении
3
ответ дан 3 December 2019 в 18:40

Теги

Похожие вопросы