Подтвердить что ты не робот

Appengine, ухудшение производительности с помощью python27

Я хотел протестировать python27 на appengine, поэтому я перенесла свое приложение из python25. Для каждого запроса производительность превышала 2 раза медленнее! Затем я вернулся к python25, и производительность снова такая же, как и раньше. Вот изображение:

enter image description here (миллисекунды/запрос) (cgi handler python 27, затем python25)

Мое приложение использует Werkzeug, Jinja2, а memcache используется довольно много. Какие причины могут привести к столь резкому снижению производительности? Или это только потому, что python2.7 на appengine все еще находится в бета-версии?

Некоторые сведения о приложении:

Это довольно простой интернет-магазин. Есть некоторые отложенные задачи с созданием pdf, однако это не влияет на общий график, потому что на первой странице попадает большинство просмотров. Почти все memcached. Для загрузки страницы с помощью python 2.5 требуется ~ 0,8 с пустого кеша. Не кэшированные страницы занимают много времени, главным образом, потому что существует много запросов db. Загрузка кешированных страниц в 60 ~ 100 мс. Среднее время загрузки ~ 150 мс. С python 2.7 производительность ужасна. Не кэшированные страницы занимают 2 + сек для загрузки. Загрузка кешированных страниц в 200+ ms.

К сожалению, у меня нет профилирующих данных, и я не могу сказать, что именно замедляет работу в python 2.7.

Мои номера для времени загрузки страницы собираются с живой страницы, которая обслуживает ~ 10 req/sec, а 1 резидентный экземпляр python25 легко справляется с этой загрузкой.

Я также тестировал python 2.7 с помощью wsgi и threadsafe:yes, но производительность немного улучшилась по сравнению с python 2.7 и cgi.

4b9b3361

Ответ 1

Где-то в Usenet Я читал такое выражение из Google: "Он работает в Python 2.7 медленнее, чем среда исполнения Python 2.5 в некоторых случаях и быстрее в других." Публикация причин, по которым на данный момент". Кажется, никто не нашел до сих пор сценарий, где 2.7 быстрее 2.5, таким образом...

Я прочитал это

  • Google знает о проблеме преформации.
  • Они не уверены, как с этим справиться.

Мое профилирование показывает, что многопоточные приложения python 2.7 проводят ca. 35% их времени в {method 'acquire' of 'thread.lock' objects} - и, похоже, это происходит в коде RPC googles. Также есть признаки того, что импорт имеет серьезные проблемы с блокировкой.

В принципе, вы ничего не можете с этим поделать, кроме того, что AppEngine должен его исправить. См. Также эту исчерпывающую документацию об замедлении.

Факторы, которые почти наверняка не играют существенной роли в этом:

  • Загрузка файлов pyc (инфраструктура GAE делает это для вас)
  • подготовка сервера (GAE - такой масштабный масштаб и даже в закрытом бета-версии 2.7 был медленным)
  • WSGI против CGI (не будет объяснять такой огромный успех)

Уродливая вещь заключается в том, что Google совершил массовое повышение цен за два шага, но сказал нам: "используя многопоточный python 2.7, вы можете работать гораздо эффективнее, чем новые цены, которые выглядят не так уж плохо". К сожалению, Python 2.7. runtime по-прежнему помечены как "экспериментальные" и не обеспечивают производительность качества продукции.

Ответ 2

Поддержка Python 2.7 все еще экспериментальна. Один из аспектов нового и экспериментального заключается в том, что у него не было выпечки и настройки производительности, которые Python 2.5 имеет.

Ответ 3

Вы перенесли приложение для использования WSGI вместо CGI при запуске на python 2.7?

Возможно, что интерфейс CGI - это всего лишь оболочка WSGI, которая теперь включена для версии 2.7.

Ответ 4

С помощью swtiching на python2.7 производительность моего приложения при загрузке в 3 раза хуже.

С 2.5:

Время соединения (мс)             мин среднее [+/- sd] медианное значение max Подключение: 36 48 15,4 41 109 Обработка: 685 3010 1893,3 2657 9255 Ожидание: 685 3009 1893,3 2656 9255 Итого: 725 3058 1900,5 2711 9333

Процент запросов, поданных в течение определенного времени (мс) 50% 2711 66% 3287 75% 3896 80% 4521 90% 6146 95% 7078 98% 7934 99% 8413  100% 9333 (самый длинный запрос)

С 2.7:

Время соединения (мс)             мин среднее [+/- sd] медианное значение max Подключение: 35 46 11,4 41 96 Обработка: 1076 7614 4190,5 6711 32284 Ожидание: 1075 7614 4190,5 6711 32283 Итого: 1124 7660 4195,5 6764 32353

Процент запросов, поданных в течение определенного времени (мс) 50% 6764 66% 7790 75% 8751 80% 9392 90% 10844 95% 13139 98% 25219 99% 27259  100% 32353 (самый длинный запрос)

Ответ 5

Цитата из самого google

Experimental!

Время исполнения Python 2.7 - экспериментальное, инновационное, и быстро меняющаяся новая функция для App Engine. К сожалению, будучи на краю кровотечения означает, что мы можем сделать назад-несовместимые изменения. Сообщаем об этом сообществу, как только среда исполнения Python 2.7 уже не экспериментальный.

Они еще не сделали это для использования в производстве, как бета-тестирование.

Итак, держите свое приложение в python2.7 до завершения экспериментальной фазы.

Вы также можете попробовать загрузить только скомпилированные файлы .pyc, поскольку время выполнения python27 поддерживает байтовую загрузку

Ответ 6

Насколько я знаю, Python 2.7 должен быть быстрее 2.5. Однако есть некоторые факторы, которые могут влиять на скорость:

  • Способ компиляции двоичного файла:
  • Будут ли ваши библиотеки (такие как Memcache) скомпилированы как C (++) или Python. Модуль С++, конечно, быстрее, чем эквивалент Python;
  • Сервер, на котором он включен - я никогда не использовал App Engine, но предполагаю, что на сервере работает только Python 2.5 или Python 2.7, поскольку смешивание их было бы пустой тратой ресурсов. Если серверы 2.7 используются намного больше, чем 2.5 сервера, и App Engine не компенсировал это, вы заметите, что производительность также снизилась.

Это первые 3 вещи, которые я придумал, но есть много факторов. Даже погода может теоретически влиять на производительность.