App Engine 스케줄러는 언제 새 스레드와 새 인스턴스를 사용하나요?
threadsafe: true내 app.yaml파일에 설정 하면 요청을 처리하기 위해 새 인스턴스가 생성되는시기와 기존 인스턴스에 새 스레드가 생성되는시기를 제어하는 규칙은 무엇입니까?
각 요청에 대해 계산 집약적 인 작업을 수행하는 앱이있는 경우 멀티 스레딩으로 구매할 수 있습니까? 즉, 인스턴스가 멀티 코어 인스턴스입니까 아니면 단일 코어입니까?
아니면 기존 스레드가 IO에서 대기 중일 때만 새 스레드가 실행됩니까?
다음 규칙 세트는 현재 지정된 인스턴스가 새 요청을 수락 할 수 있는지 확인하는 데 사용됩니다.
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
현재 각 인스턴스 클래스에 적용되는 총 CPU / 코어 한도는 다음과 같습니다.
CLASS 1: 600MHz 1 core
CLASS 2: 1.2GHz 1 core
CLASS 4: 2.4GHz 1 core
CLASS 8: 4.8GHz 2 core
따라서 B8인스턴스 하나만 최대 2 개의 완전 CPU 바운드 요청을 병렬로 처리 할 수 있습니다.
설정 threadsafe: true(파이썬) 또는 <threadsafe>true</threadsafe>인스턴스 클래스 (자바) <8 개 이상의 CPU 바운드 요청은 단일 인스턴스에서 병렬로 처리 할 수 있도록 허용하지 않을 것입니다.
완전히 CPU 바운드가 아니거나 I / O를 수행하지 않는 경우 Python 및 Java 런타임은 다음과 같이 최대 10 개의 동시 요청을 처리하기위한 새 스레드를 생성합니다. threadsafe: true
또한 Go 런타임은 단일 스레드이지만 동시 요청을 지원합니다. 요청 당 1 개의 고 루틴을 생성하고 고 루틴이 I / O를 수행하는 동안 제어를 양보합니다.
Kyle Finley가 제안한 링크 에서 다음 메시지 읽기
Jeff Schnitzer : 여전히 10 개의 스레드 제한이 있습니까?
예,하지만 예상 한 이유가 아닐 수도 있습니다. 우리가 직면하는 주요 문제는 메모리 관리입니다. 기본값을 100으로 올리면 많은 앱에서 메모리 부족으로 인한 사망 (현재보다 더 많이)이 발생하며 이러한 사망은 python / java / go에서 다르게 표시됩니다. 올바른 경로는보다 지능적인 알고리즘 wrt 메모리, 구성 가능성 등을 제공하는 것입니다. 이것은 우리가 스케줄러를 위해 작업하는 프로젝트 종류의 예이지만 다른 팀과 마찬가지로 프로젝트의 우선 순위를 지정해야합니다. 피드백 / 데이터 / 투표를받을 수 있도록 공개 이슈 트래커에이 항목 (또는 기타 원하는 스케줄러 개선 사항)을 제출하는 것이 좋습니다.
내 app.yaml 파일에서 threadsafe : true를 설정하면 요청을 처리하기 위해 새 인스턴스가 생성되는시기와 기존 인스턴스에서 새 스레드가 생성되는시기를 제어하는 규칙은 무엇입니까?
사람들이 여기에서 말하는 것처럼 이전 인스턴스가 이미 10 개의 스레드를 사용하고있는 경우 새 스레드가있는 새 인스턴스가 시작됩니다. 다른 모든 스레드가 사용 중이면 새 스레드가 생성되며 일부 응답을 기다리거나 결과를 계산해야합니다.
각 요청에 대해 계산 집약적 인 작업을 수행하는 앱이있는 경우 멀티 스레딩으로 구매할 수 있습니까? 즉, 인스턴스가 멀티 코어 인스턴스입니까 아니면 단일 코어입니까?
이제이 질문은 매우 논란의 여지가 있습니다. 모두가 답을 알고 있지만 여전히 회의적입니다. 멀티 코어 프로세서를 사용하지 않는 한 작업이 계산에 기반한 경우 멀티 스레딩은 결코 좋은 결과를 얻을 수 없습니다. 멀티 코어 프로세서가 더 나은 이유를 묻지 마십시오. 이제 Google 앱 엔진은 새 스레드가 다른 프로세서 / 코어 (존재하는 경우)로 디스패치되어야하는시기를 결정할만큼 정교하지 않으며 새 인스턴스 만 다른 코어 / 프로세서로 디스패치됩니다. 스레드가 다른 코어 / 프로세서에서 실행되기를 원하십니까? 글쎄, 거기에 약간의 기술을 던져 부야! 스레드가 다른 코어 / 프로세서에서 실행되어야하는지 여부를 결정하는 것은 사용자의 몫입니다. 엔진은 많은 혼란을 초래할 수 있고 엔진은 신이 아니기 때문에 이에 대한 책임을 질 수 없습니다. 요컨대
아니면 기존 스레드가 IO에서 대기 중일 때만 새 스레드가 실행됩니까?
내 대답의 첫 번째 부분은 이것을 명확히합니다. 예, 기존 스레드가 사용 중일 때만 작동합니다. 이것이 교착 상태를 방지하기 위해 스레드 세이프가 작동하는 방식입니다.
이제 저는 개인적인 경험을 통해이 모든 것을 말할 수 있습니다. 저는 수개월 동안 앱 엔진에서 작업했으며 스레드 세이프 아키텍처에 크게 의존하는 프로그래밍 / 디버깅 / 테스트 된 앱을 사용했습니다. 원하는 경우 참조를 추가 할 수 있습니다 (참조는 없지만 개인적인 경험이지만 검색하여 테이블에 올려 놓을 준비가되었습니다).이 경우에는 필요하지 않다고 생각합니다. 스레드 세이프 내가 스스로 확인한 명백한 방식으로 작동합니다.
'Program Club' 카테고리의 다른 글
| C # WinForms 앱 트레이를 최소화하는 적절한 방법은 무엇입니까? (0) | 2020.12.05 |
|---|---|
| OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과합니다 :-Android (0) | 2020.12.05 |
| C ++에서 64 비트 정수에 대한 "표준"htonl과 유사한 함수가 있습니까? (0) | 2020.12.05 |
| 매우 간단하고 간결하며 쉬운 GUI 프로그래밍 "프레임 워크" (0) | 2020.12.05 |
| Green DAO vs ORM lite vs Active Android (0) | 2020.12.05 |