Scheck 동시성 전략¶
- 버전: 1.0.7-7-g251eead
- 릴리스 날짜: 2023-04-06 11:17:57
- 지원 운영체제: windows/amd64,windows/386,linux/arm,linux/arm64,linux/386,linux/amd64
쓰레드 풀과 작업 큐를 사용한 Lua 스크립트 스케줄링:¶
기존 방식은 하나의 Lua 프로토(proto)가 하나의 Lua.state 객체에 대응되었으며, 각 state 객체는 공용 라이브러리와 공용 데이터를 로드했습니다. 각 Lua 프로토는 실행 시 각각 하나의 타이머에 대응되어, 실행 시 많은 Lua 스크립트가 몰려서 실행되고 모든 state 객체가 너무 많은 메모리를 점유하는 문제가 발생했습니다. 따라서 다음과 같은 최적화를 수행했습니다: - Lua.state 풀을 생성하여 사용 시 하나를 꺼내고 사용 후 반환합니다. - 쓰레드 풀 크기를 동적으로 조정하여 여러 작업을 동시에 실행해야 할 때 충분한 state 객체를 사용할 수 있도록 합니다. - 모든 타이머를 제거하고 대신 간격 실행으로 변경합니다. 그 이유는 Scheck가 실행하는 Lua 스크립트는 실시간성이 매우 높을 필요가 없으며, 약간의 실행 시간 차이가 발생해도 허용되기 때문입니다.
쓰레드 풀:¶
Lua.state는 Lua 프로토를 실행하는 최소 단위이며, Lua 가상 머신이라고도 합니다. 쓰레드 풀은 여러 Lua.state로 구성됩니다. - 쓰레드 풀에서 state 객체를 가져올 때, 풀에 남아있는 객체가 있으면 풀에서 가져옵니다. - 풀에 객체가 없지만 실행 중인 개수가 최대 허용 실행 개수(cap)에 도달하지 않은 경우, 새로운 state 객체를 생성하며 이 객체는 호출이 종료되면 반환됩니다. - 풀에 있는 state 객체는 사용 후 즉시 반환됩니다. - 초기 크기와 최대 용량이 있으며, 실행 개수의 피크를 허용합니다.
작업 큐:¶
- Lua 실행 시간을 모두 간격 시간으로 구성된 큐로 통일합니다.
- 작업 큐를 순회하며 현재 시간과 가장 가까운 작업을 찾습니다. 이미 현재 시간이 지난 경우 즉시 실행합니다.
- 현재 시간까지 아직 시간이 남은 경우 타이머를 설정하여 시간이 되면 실행합니다.
- 작업 실행 시 Lua 프로토를 실행하기 위해 state가 필요하며, 쓰레드 풀에서 state를 가져와야 합니다. 이때 풀에 객체가 없고 전체 실행 개수가 설정된 최대치에 도달한 경우, 다른 작업이 실행을 완료하여 state를 반환할 때까지 대기 상태가 됩니다.