우주생물 키우기 서버

불러오는 중입니다.

자리와 사양

메모리

RSS 는 이 서버 프로세스가 실제로 차지한 메모리입니다. 힙은 자바스크립트 객체가 쓰는 자리이고, 한계에 가까워지면 서버가 멈춥니다.

디스크, 부하, 트래픽

실행

세계에 들어온 플레이어

존 단위 보내기 (마지막 차례)

정원과 한계

입장 정원은 세계에 함께 들어오는 플레이어 수입니다. 넘으면 들어오려는 사람은 대기열에 서고, 자리가 나면 먼저 온 차례대로 들어갑니다. 입장 정원은 서버의 환경 변수 MAX_PLAYERS 가 있으면 그 값, 없으면 이 VM 의 머신 유형의 기본값(부하 시험으로 잰 수, src/capacity.js)입니다. 머신을 키우면 저절로 그 머신의 기본값이 되고, 다시 잰 뒤 표를 고치거나 MAX_PLAYERS 로 정합니다. 코드의 상한은 정원을 아무리 크게 정해도 넘지 않는 수입니다.

대기열

부하 시험 기록

npm run loadtest -- [서버 주소] [단계들] [잴 초] (서버 저장소의 tools/loadtest.js) 가 흉내 클라이언트를 단계마다 늘리며 잰 것을 loadtests/ 에 남기고, 커밋해 배포하면 여기에 보입니다. 버팀은 상태가 초당 13.5 번 넘게 오고, 걸음 밀림과 끊김이 없고, 핑이 크게 늘지 않고, 이벤트 루프가 100 ms 넘게 멈추지 않은 단계입니다. 공유 코어 머신은 늘 쓸 수 있는 CPU 몫이 정해져 있어(e2-micro 는 코어 하나의 25%), 그 몫을 넘으면 쉬며 쌓인 몫(버스트)을 쓰는 것이라 오래가지 못합니다. 그래서 CPU 몫 안의 가장 큰 단계를 오래 버티는 수로 봅니다. 기록을 누르면 단계마다의 값을 봅니다.
게임 규칙은 세계가 어떻게 돌아가는지(생물과 파츠, 봇, 부딪힘, 에너지, 주고받는 형식)를 정한 코드입니다. 클라이언트 저장소의 src/logic 에 있고, 서버는 그 폴더를 vendor/logic 으로 복사(동기화)해 같은 파일로 세계를 돌립니다. 그래서 혼자 하기와 온라인의 규칙이 늘 같습니다. 서버는 규칙을 고치지 않습니다. 규칙이 바뀌면 클라이언트 저장소에서 고친 뒤 동기화해 배포합니다. 불러옴은 서버가 뜰 때 이 파일을 읽어 세계를 만들었다는 뜻입니다. 못 불러오면 세계를 만들 수 없어 들어오는 것을 모두 거부합니다. 아래의 수치와 표는 실행 중인 규칙에서 읽은 값이고, 설명은 그 파일의 주석입니다.

규칙 파일

수치

표

게임은 WebSocket 하나로 모든 메시지를 이진으로 주고받습니다. 첫 바이트가 메시지 번호이고(위로와 아래로 따로), 이어서 필드를 정해진 차례의 바이트로 씁니다. 아래로의 1 번은 세계의 상태입니다. HTTP 는 상태 확인과 이 대시보드가 씁니다. 번호와 바이트 모양은 공유 프로토콜 파일(vendor/logic/protocol.js)의 표에서, 필드의 뜻과 설명은 그 파일의 주석에서 읽습니다. 표의 { ... } 는 필드의 이름을 적은 것이고 실제로는 이진입니다. 수와 양은 서버가 뜬 뒤의 합계입니다.

HTTP

WebSocket

클라이언트 → 서버

서버 → 클라이언트 (세계의 상태)

서버 → 클라이언트 (제어)

기록 파일