멀티플렉스 작업자 (실험용 기능)

문제 신고 소스 보기 1박 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

이 페이지에서는 멀티플렉스 작업자를 설명하고 멀티플렉스 호환을 작성하는 방법을 설명합니다. 특정 제한사항에 대한 해결 방법이 나와 있습니다.

멀티플렉스 작업자를 사용하면 Bazel이 단일 작업자로 여러 요청을 처리할 수 있습니다. 프로세스입니다 다중 스레드 작업자의 경우 Bazel은 더 적은 리소스를 사용하여 동일하거나 더 나은 실적을 달성할 수 있습니다 예를 들어, Bazel은 4개의 멀티플렉싱 작업자를 사용하여 각 작업자별 작업자 프로세스를 이를 통해 요청을 병렬로 처리할 수 있습니다. 대상 JVM 준비 시간과 JIT 컴파일이 절약됩니다. 일반적으로 서버의 모든 작업자 간에 하나의 공유 캐시를 사용하여 사용할 수 있습니다

개요

Bazel 서버와 작업자 프로세스 사이에는 두 개의 레이어가 있습니다. 특정 니모닉을 사용하여 프로세스를 병렬로 실행할 수 있으므로 Bazel은 WorkerProxy 할 수 있습니다 WorkerProxy는 작업자 프로세스로 요청을 전달합니다. request_id와 함께 순차적으로 작업자 프로세스에서 요청을 처리합니다. WorkerMultiplexer에 응답을 보냅니다. WorkerMultiplexer 응답을 수신하고 request_id를 파싱한 후 응답을 전달합니다. 올바른 WorkerProxy로 돌아갑니다. 다중화되지 않은 작업자와 마찬가지로 모든 통신이 표준 인/아웃을 통해 이루어지지만, 이 도구는 stderr: 사용자에게 표시되는 출력 (아래 참고)

각 작업자에는 키가 있습니다. Bazel은 키 해시 코드 (환경 구성)를 변수, 실행 루트 및 니모닉)를 사용하여 사용할 WorkerMultiplexer. WorkerProxy는 동일한 포드로 해시 코드가 동일한 경우 WorkerMultiplexer 따라서 환경 변수와 실행 루트가 단일 Bazel에서 동일합니다. 호출 시 고유한 니모닉은 각각 하나의 WorkerMultiplexer와 1개의 작업자 프로세스입니다 일반 작업자와 WorkerProxy은 여전히 --worker_max_instances에 의해 제한됩니다.

멀티플렉스 호환 규칙 작성

규칙의 작업자 프로세스는 멀티스레드로 구성되어야만 멀티플렉스 작업자를 제공합니다. Protobuf를 사용하면 규칙 세트가 단일 요청을 하지만 스트림에 여러 개의 요청이 쌓일 수 있습니다. 사용자가 작업자 프로세스는 스트림에서 요청을 파싱하면 생성할 수 있습니다. 다른 스레드가 완료되어 동시에 작업자 프로세스는 응답이 작성되었는지 확인해야 합니다. 개별적으로 (메시지가 겹치지 않음) 응답은 다음을 포함해야 합니다. request_id를 반환합니다.

멀티플렉스 출력 처리

멀티플렉스 작업자는 작업보다 출력 처리에 더 단일 플렉스 작업자를 만들 수 있습니다 stderr(으)로 전송되는 모든 항목은 단일 로그 파일로 이동됩니다. 동일한 유형의 모든 WorkerProxy 간에 공유됨 동시 요청 간에 무작위로 인터리브 처리됨 stdout 리디렉션 중 stderr로 변환하는 것이 좋습니다. 이 출력을 output에 수집하지 마세요. 필드의 값(WorkResponse)으로 인해 사용자에게 손상된 출력 조각이 표시될 수 있습니다. 도구가 사용자 중심 출력을 stdout 또는 stderr로만 전송하는 경우 다음을 실행합니다. 이 동작을 변경해야 멀티플렉스 작업자를 사용 설정할 수 있습니다.

멀티플렉스 작업자 사용 설정

멀티플렉스 작업자는 기본적으로 사용 설정되지 않습니다. 규칙 집합으로 멀티플렉스를 켤 수 있음 supports-multiplex-workers 태그를 사용하여 작업의 execution_requirements (supports-workers 태그와 같음 일반 작업자를 사용 설정합니다.) 일반 worker를 사용할 때와 마찬가지로 worker는 전략은 규칙 집합 수준 (예: --strategy=[some_mnemonic]=worker) 또는 일반적으로 전략 수준에서( 예를 들어 --dynamic_local_strategy=worker,standalone). 필요하며 supports-multiplex-workers가 둘 다 설정된 경우 supports-workers 멀티플렉스 작업자를 사용 중지할 수 있습니다. --noworker_multiplex를 전달하여 전역적으로 확장할 수 있습니다.

가능한 경우 멀티플렉스 작업자를 사용하여 메모리 사용량을 줄이는 것이 규칙 세트에 권장됩니다. 성능을 개선할 수 있습니다 그러나 멀티플렉스 작업자는 현재 동적 실행과 호환 가능(호환되는 경우) 멀티플렉스 샌드박스를 구현합니다. 샌드박스 처리되지 않은 멀티플렉스 실행 시도 중 실행 중인 작업자가 자동으로 샌드박스 처리된 파일을 단일 플렉스 작업자를 대신 사용할 수 있습니다.

멀티플렉스 샌드박스

멀티플렉스 작업자는 작업자 구현을 제공합니다 싱글플렉스 작업자 샌드박스는 각 작업자 프로세스를 자체 샌드박스에서 실행하고, 멀티플렉스 작업자는 여러 병렬 요청 간에 처리 작업 디렉터리를 처리할 수 있습니다 허용 멀티플렉스 작업자의 샌드박싱을 처리할 때 작업자는 각 요청에 지정된 하위 디렉터리에 쓰기 작업을 수행합니다 작업 디렉터리에 있습니다

멀티플렉스 샌드박스를 지원하려면 작업자가 sandbox_dir 필드를 사용해야 합니다. WorkRequest에서 가져와서 모든 파일 읽기 및 쓰기의 접두사로 사용합니다. argumentsinputs 필드는 샌드박스 처리되지 않은 필드로부터 변경되지 않고 그대로 유지됩니다. 요청에서 실제 입력은 sandbox_dir를 기준으로 합니다. 작업자는 argumentsinputs에 있는 파일 경로 번역 또한 sandbox_dir를 기준으로 모든 출력도 작성해야 합니다. 여기에는 '.'와 같은 경로 및 지정된 파일에서 발견된 경로가 포함됩니다. (예: "argfile" 인수)에 넣습니다.

작업자가 멀티플렉스 샌드박스를 지원하면 규칙 세트에서 이를 선언할 수 있습니다. supports-multiplex-sandboxing를 추가하여 작업의 execution_requirements입니다. Bazel은 멀티플렉스 샌드박스를 사용함 --experimental_worker_multiplex_sandboxing 플래그가 전달되는 경우 또는 동적 실행과 함께 사용됩니다.

샌드박스 처리된 멀티플렉스 작업자의 작업자 파일은 여전히 작업자 프로세스의 작업 디렉터리입니다 따라서 파일이 작업자 실행과 입력 모두에 사용되는 경우 모두 플래그 파일 인수 및 tools, executable 또는 runfiles입니다.