Назад | Перейти на главную страницу

Отправка данных очень медленная или 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 db:

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:

Отправка данных

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

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
  • Масштабируйте по горизонтали, добавляйте реплики для чтения, если ввод-вывод на вашем главном устройстве становится узким местом
  • Реализуйте кэширование данных в своем приложении