Превышен предел мягкой памяти 512 МБ с 532 МБ после обслуживания всего 3 запросов. Рассмотрите возможность установки большего экземпляра класса в app.yaml - PullRequest
1 голос
/ 10 марта 2020

Мы в стандартной среде движка Google App, экземпляр F2 (поколение 1 - python 2.7). У нас есть модуль отчетности, который следует этому потоку.

Рабочая задача инициируется в очереди.

    task = taskqueue.add(
            url='/backendreport',
            target='worker',
            queue_name = 'generate-reports',
            params={
                "task_data"     : task_data
            }) 

В рабочем классе мы запрашиваем хранилище данных Google и записываем данные в Google Sheet , Мы разбиваем записи на страницы, чтобы найти дополнительные элементы отчета. Когда мы находим дополнительную страницу, мы снова вызываем ту же задачу, чтобы вызвать другую запись, чтобы она могла извлечь следующий набор элементов отчета и записать их на лист Google.

в backendreport.py у нас есть следующий код .

 class BackendReport(): 
        # Query google datastore to find the records(paginated)  
        result = self.service.spreadsheets().values().update(
                spreadsheetId=spreadsheet_Id, 
                range=range_name,
                valueInputOption=value_input_option, 
                body=resource_body).execute()

        # If pagination finds additional records
        task = taskqueue.add(
                url='/backendreport',
                target='worker',
                queue_name = 'generate-reports',
                params={
                    "task_data"     : task_data
                })

Мы запускаем тот же BackendReport (с нумерацией страниц), что и переднее задание (не как задача). Разбивка на страницы работает без каких-либо ошибок - это означает, что мы выбираем каждую страницу записей и отображаем ее на переднем крае. Но когда мы выполняем задачи итеративно, это терпит неудачу с проблемой мягкого ограничения памяти. У нас сложилось впечатление, что каждый раз, когда вызывается задача (для каждой нумерации страниц), она должна действовать независимо и не должно быть никаких ограничений памяти. Что мы здесь делаем не так?

Почему GCP не раскручивает другой экземпляр при достижении предела мягкой памяти - автоматически (наш класс экземпляра - F2). В сообщении об ошибке говорится, что после обслуживания всего 3 запросов достигнуто мягкое ограничение памяти в 512 МБ - означает ли это, что модуль backendreport ускорил 3 запроса - означает ли это, что было 3 вызова задач ( / backendreport)

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

вы создаете несколько задач в облачных задачах, но нет никаких ограничений для очереди отправки, и, поскольку очередь пытается отправить несколько задач одновременно, она достигает предела памяти. Таким образом, ограничения, которые вы хотите установить, на самом деле max_concurrent_requests, но не для экземпляров в app.yaml, его следует установить для очереди, отправляющей в queue.yaml, поэтому отправляется только одна задача за раз:

- name: generate-reports
  rate: 1/s
  max_concurrent_requests: 1
0 голосов
/ 11 марта 2020

Почему GCP не запускает другой экземпляр при достижении предела мягкой памяти

Один из основных механизмов, когда механизм приложения решает развернуть новый экземпляр, - max_concurrent_requests. Вы можете проверить все параметры automatic_scaling, которые вы можете настроить здесь:

https://cloud.google.com/appengine/docs/standard/python/config/appref#scaling_elements

означает ли это, что модуль backendreport ускорил 3 запроса - это означает, что было 3 вызова задач (/ backendreport)?

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

...