原来的 JudgeServer 按核数起 gunicorn worker、每份提交再按核数开进程池,空闲内存跟着核数走
(2 核 52MB、16 核 305MB)。换成 go-judge 后空闲 16MB,同一批提交判题中 80–100MB(原来约 370MB)。
go-judge 只管在沙箱里跑命令,编译、逐点运行、比对输出、定状态码搬到 judge/sandbox.ts,
口径逐条照搬 JudgeServer,出参形状不变。拿生产库真实提交新旧逐点对比:C 2000 份 1989 一致、
C++ 891 份 890 一致、Python 2000 份全一致;不一致的是 system("pause")(现在不再判运行时错误)、
未定义行为、endl 死循环打印(运行时错误变运行超时),见 docker/judge/README.md。
- 判题容器改成 privileged(go-judge 要自己建 cgroup),镜像 oj2-judge-3
- 心跳改由 worker 每 5 秒问判题机 /version 代记,删掉 /api/judge-server/heartbeat
- 前端统一用 stripJudgePath 去掉判题机工作目录(新的 /w/ 和旧的 /judger/run/)
- 提交前编译检查只编译不运行
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 lines
1.0 KiB
Bash
19 lines
1.0 KiB
Bash
DATABASE_URL=postgres://onlinejudge:onlinejudge@localhost:5433/onlinejudge
|
|
REDIS_URL=redis://localhost:6380
|
|
JUDGE_SERVER_URL=http://localhost:8081
|
|
# 判题机 token:自己生成,不要用固定值。
|
|
# TOKEN=$(openssl rand -hex 32)
|
|
# echo "JUDGE_SERVER_TOKEN=$TOKEN" >> .env # 后端读这里
|
|
# echo "OJ2_JUDGE_TOKEN=$TOKEN" >> docker/.env # 判题机容器读这里,两边必须一致
|
|
# 留空的话后端会随机生成一个并在启动日志里告警,判题请求会被 401 挡掉。
|
|
JUDGE_SERVER_TOKEN=
|
|
JUDGE_CONCURRENCY=2
|
|
# 试运行(运行例子 / 自己输入)同时在判题机上跑几批,和正式提交共用判题机
|
|
TRIAL_CONCURRENCY=2
|
|
# WebSocket 升级额外放行的来源,逗号分隔的完整 origin。
|
|
# 同源本来就放行,本机开发(Vite 5173 → API 3000)也自动放行,一般不用配。
|
|
# 只有前后端分处不同域名时才需要,例如 ALLOWED_WS_ORIGINS=https://oj.example.com
|
|
ALLOWED_WS_ORIGINS=
|
|
OJ2_DEV_USERNAME=student
|
|
OJ2_DEV_PASSWORD=student123
|