Когда планировщик App Engine использует новый поток вместо нового экземпляра?

Если я установил threadsafe: true в мой файл app.yaml, каковы правила, которые определяют, когда будет создан новый экземпляр для обслуживания запроса, или когда новый поток будет создан в существующем экземпляре?

Если у меня есть приложение, которое выполняет что-то вычислительно интенсивно для каждого запроса, многопоточность покупает мне что-нибудь? Другими словами, экземпляр представляет собой многоядерный экземпляр или одно ядро?

Или, новые потоки только развернутся, когда существующие потоки ждут на IO?

Ответ 1

В настоящее время используется следующий набор правил для определения того, может ли данный экземпляр принять новый запрос:

if processing more than N concurrent requests (today N=10): false
elif exceeding the soft memory limit: false
elif exceeding the instance class CPU limit: false
elif warming up: false
else true

В настоящее время для каждого класса экземпляров применяются следующие общие пределы ЦП/ядра:

CLASS 1: 600MHz 1 core
CLASS 2: 1.2GHz 1 core
CLASS 4: 2.4GHz 1 core
CLASS 8: 4.8GHz 2 core

Таким образом, только экземпляр B8 может обрабатывать до двух запросов с поддержкой центрального процессора параллельно.

Настройка threadsafe: true (Python) или <threadsafe>true</threadsafe> (Java) для классов экземпляров < 8 не позволит обрабатывать параллельные запросы более одного процессора параллельно в одном экземпляре.

Если вы не полностью привязаны к ЦП или выполняете ввод-вывод, среда выполнения Python и Java порождает новые потоки для обработки нового запроса до 10 одновременных запросов с помощью threadsafe: true

Также обратите внимание, что даже несмотря на то, что время выполнения Go однопоточно, оно поддерживает одновременные запросы: Он будет выдавать 1 goroutine за запросы и регулировать доходность между goroutines, пока они выполняют операции ввода-вывода.

Ответ 2

Прочитайте следующие сообщения из ссылка, предложенную Кайлом Финли

Джефф Шницер: Есть ли еще жесткий лимит из 10 потоков?

Да, но, вероятно, не по той причине, которую вы ожидаете. Основной вопрос мы запускается управление памятью. Если мы установили значение по умолчанию 100, многие приложения затем будут видеть смерти вне памяти (больше, чем сейчас), и эти смерти проявляются по-разному для python/java/go. Правильный путь вперед - более интеллектуальные алгоритмы по памяти, обеспечивая конфигурируемость и т.д. Это пример видов проекты, над которыми мы работаем, для планировщика, но, как и в любой команде, мы имеем чтобы приоритезировать наши проекты. Я бы рекомендовал подать эту (или любую другую желаемые улучшения планировщика) в журнале отслеживания публичных выпусков, чтобы они может получить обратную связь/данные/голоса.

Ответ 3

Если я устанавливаю threadafe: true в моем файле app.yaml, каковы правила, которые определяют, когда будет создан новый экземпляр для обслуживания запроса, или когда новый поток будет создан в существующем экземпляре?

Как говорят люди, если предыдущий экземпляр уже использует 10 потоков, будет инициирован новый экземпляр с новым потоком. Новый поток будет создан, если все остальные потоки заняты, они должны либо ждать ответа, либо с результатами вычислений.

Если у меня есть приложение, которое выполняет что-то вычислительно интенсивно для каждого запроса, многопоточность покупает мне что-нибудь? Другими словами, экземпляр представляет собой многоядерный экземпляр или одно ядро?

Теперь этот вопрос очень спорный. Все знают ответ, но все же они настроены скептически. Многопоточность никогда не сможет купить вас, если ваша задача основана на просто вычислениях, если вы не используете многоядерный процессор, не спрашивайте меня, почему многоядерный процессор поможет лучше, вы знаете ответ. Теперь движок Google не достаточно сложный, чтобы решить, что, когда новые потоки должны быть отправлены на другой процессор/ядро ​​(если оно существует), только другие экземпляры отправляются другому ядру/процессору. Хотите, чтобы ваш поток работал в другом ядре/процессоре? Ну, брось там какие-то навыки и боойа! Помните, что вам решать, должны ли потоки работать в других ядрах/процессорах, двигатель не может взять на себя ответственность за такие, потому что это может привести к множеству путаниц, двигатель не Бог. Короче говоря, по умолчанию экземпляр является одноядерным, двигатель не может решить для вас, когда он должен идти многоядерным.

Или, новые потоки только развернутся, когда существующие потоки ждут на IO?

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

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