понимание использования памяти и классов экземпляров Frontend в GAEJ - PullRequest
1 голос
/ 17 марта 2012

Я пытаюсь найти лучший способ настройки экземпляров моего приложения на GAE.

Я запускаю Saas на GWT / GAEJ.У меня есть небольшое количество опытных пользователей, которые интенсивно используют приложение в течение всего дня (а не большое количество пользователей, которые используют приложение в течение нескольких минут каждый день).

Поэтому я пытаюсь найтилучший способ настроить использование классов экземпляров Frontend, чтобы сделать его максимально эффективным и обеспечить лучший пользовательский опыт.

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

Я выясню, могу ли я сделать это более эффективно.

Однако это фон, мои настоящие вопросы таковы;Если я смотрю на использование памяти для моих экземпляров, они регулярно говорят 136 МБ и т. Д. (Они начинаются с около 66 МБ).Так что я думаю, у меня есть утечки памяти, чтобы найти.Но, в частности, я хотел бы знать:

  1. Я также использую Memcache, предположительно, эта память учитывается в приведенном выше расчете?

  2. В настоящее время я использую классы экземпляров F1, которые имеют объем памяти 128 МБ.Так что же это означает для моих экземпляров, размер которых составляет около 136 МБ?Будут ли они работать намного медленнее, поскольку они будут все время выгружаться на диск?По этой причине лучше бы мне запустить один экземпляр F2 вместо двух экземпляров F1?

  3. Я очень досадно обнаружил, что GAE запускает новые экземпляры, хотя у меня есть 2 свободных экземпляра.Это несмотря на то, что я установил минимальную задержку очень высокой (7,5 сек).Я прочитал в документации, что этот параметр будет иметь небольшой эффект, когда я использую неактивные экземпляры, но как тогда я могу гарантировать, что используются только неиспользуемые экземпляры, не прибегая к запуску новых (что всегда приводит к большей задержке из-за проблем инициализации хранилища данныхупомянутое выше)?(и увеличил стоимость для меня из-за большего количества времени экземпляра)

Я что-то неправильно понимаю?Большое спасибо за любую помощь.

Ответы [ 2 ]

5 голосов
/ 17 марта 2012

Несколько заметок:

а. JVM получает память по требованию, но редко возвращает ее обратно в ОС . Это не утечка памяти.

б. Вы можете настроить количество ожидающих экземпляров и время отклика. Это дает вам некоторый контроль над количеством запущенных экземпляров. См. Документы по настройкам производительности .

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

Теперь на вопросы:

  1. Memcache - это служба, внешняя по отношению к экземплярам внешнего интерфейса, и AFAIK не хранит объекты в экземпляре внешнего интерфейса. Таким образом, общее количество объектов в Memcache не должно отражаться на памяти, используемой экземпляром внешнего интерфейса.

  2. Фактическая базовая реализация экземпляров внешнего интерфейса неизвестна (по крайней мере, вне Google), но я сомневаюсь, что они используют локальные диски для подкачки. Вы всегда можете попробовать использовать экземпляры F2 и посмотреть, как это работает.

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

2 голосов
/ 08 мая 2012

У меня также была проблема с тем, что инициализация JDO / DataNucleus сделала первый запрос к экземпляру очень медленным.Я использую MemCache для кеширования практически всего, что есть в хранилище данных.Предварительная загрузка всего (на данный момент, когда данные растут, я изменю это на предварительную загрузку важных вещей и только касаюсь не столь важных объектов для инициализации JDO) в запросе на разогрев, решил проблему для меня, что 1 резидентный экземпляр, который я получил только несколькозапрос.Теперь использование моего 1-го резидента и других экземпляров по требованию гораздо лучше распределено - тем не менее, экземпляр-резидент получает только одну треть запросов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...