Мы пытались провести сравнительный анализ производительности нашего веб-приложения, написанного с использованием python, который активно использует mongodb, и мы обнаружили следующее.
Мы пробовали использовать серверы первого поколения Extra Large ec2 с 8 ЭБУ и 15 ГБ памяти.
Мы не смогли понять, почему все это происходит. Локальные машины, о которых мы говорим, имеют 8 ГБ ОЗУ и процессоры i5.
ОБНОВИТЬ Мы тестировали python так, что мы запускали цикл, который занимал 10 секунд без чтения или записи на диск. То же самое занимало как минимум на 30% больше времени в каждом испытании.
Это связано с этим?
Есть несколько факторов, по которым машины EC2 работают медленно. Диски не прикрепляются напрямую к экземпляру. Вместо этого тома ebs представляют собой большие сетевые диски, и все, что вы на них пишете, отправляется по сети на эти диски. Обычно задержка довольно низкая, но, конечно, по сравнению с чем-то, что напрямую подключено к вашей машине, она будет появиться медленный.
Это виртуальная машина. Независимо от того, что вы делаете, он должен конкурировать с другими машинами за циклы процессора. Запустите top, если вы используете Linux, и проверьте процент кражи процессора. Ненулевое число будет указывать на высокую конкуренцию за ЦП. В любом случае виртуальные процессоры не так быстры, как реальные процессоры для сопоставимых процессоров.
Еще одно личное наблюдение: удача играет важную роль в EC2 (да!). Иногда вы получаете более старое оборудование, которое работает не так быстро. Другой личный опыт заключается в том, что иногда вы получаете процессоры amd opteron, которые обычно не такие быстрые, как на базе Intel. Я не утверждаю, что процессоры AMD плохие, но, похоже, в этом случае они работают быстрее Intel. Может они нового поколения.
Поддерживая монго на EC2, я полностью понимаю вашу боль. Я бы посоветовал попытаться сохранить как можно больше данных в памяти. В целом EC2 не предназначен для вертикального масштабирования. Полезно иметь много работы по разделению меньших экземпляров, а затем иметь огромный экземпляр, делающий все в одиночку.
Я получил очень хорошие результаты с программным рейдом томов EBS в RAID0 - скорость чтения увеличилась чуть лучше, чем на 50%, а для записи - чуть меньше. У нас было приложение, которое было совершенно бесполезным на AWS, пока мы этого не сделали, и оно спасло нас.
Кроме того, количество операций ввода-вывода будет меняться в зависимости от времени суток и от того, сколько других клиентов используют этот кластер / машину. Насколько я помню, мелкий шрифт AWS гарантирует не более 100 операций в секунду на стандартном томе EBS, хотя в большинстве случаев вы получите гораздо больше. Мой телефон, вероятно, быстрее 100 иопс. Если эти колебания неприемлемы, создайте тома EBS с подготовленным iops. Это немного дороже, но позволяет установить минимальную пропускную способность, с которой может работать ваше приложение, и гарантирует, что вы получите ее независимо от того, что делают другие клиенты AWS.
Что касается этого:
«Python на серверах ec2 как минимум на 30% медленнее, чем локальная машина»
Это также может быть связано с дистрибутивом или конкретно для вашего приложения. Вы не сказали точно, что подразумеваете под «на 30% медленнее». Если ваш тест включал доступ к диску, см. Выше (обещаю, это поможет). Если нет, вы можете предоставить дополнительную информацию о том, что вы тестировали.
Если вас действительно беспокоит дисковый io, AWS предлагает тома Provisioned IO EBS и инстансы, оптимизированные для EBS.
С помощью Provisioned IO вы можете указать среднюю производительность io, необходимую для тома EBS. Обычные тома EBS имеют значение 100, и вы можете указать до 2000. Кроме того, вы можете настроить программные RAID-массивы из нескольких томов Provisioned IO EBS, чтобы получить более высокую пропускную способность. http://aws.amazon.com/about-aws/whats-new/2012/07/31/announcing-provisioned-iops-for-amazon-ebs/
Кроме того, оптимизированные для EBS изображения обеспечивают более быстрое выделенное подключение к EBS со скоростью 500 и 1000 Мбит / с на m1.large, m1.xlarge и m2.4xlarge. http://aws.amazon.com/ebs/
Вы также можете проверить экземпляр с высоким io с подключенными SSD-дисками:
Высокий уровень ввода-вывода, четыре сверхбольших экземпляра 60,5 ГиБ памяти 35 вычислительных блоков EC2 (16 виртуальных ядер *) 2 тома на базе SSD, каждый с 1024 ГБ хранилища экземпляров 64-разрядная платформа Производительность ввода-вывода: очень высокая (10 Gigabit Ethernet) Производительность ввода-вывода хранилища: очень высокая *** Доступно, оптимизировано для EBS: нет ** Имя API: hi1.4xlarge