Mcginn's Blog

DOMjudge 配置

2018/10/04

Domserver 部署

PHP timezone

  1. php.ini 文件位置

    • CentOS/RedHat/Fedora = /etc/php.ini
    • Ubuntu/Debian/LinuxMint = /etc/php5/apache2/php.ini
  2. 选择时区,通常定位为 "Asia/Shanghai"

  3. 编辑 php.ini 文件

    1
    date.timezone = "Asia/Shanghai"
  4. 重启 Apache Service。

    1
    sudo service apache2 restart

MySQL maximum connections

原先编辑 .cnf 添加 max_connections = 1000,然后重启 apache2 即可。但是设置后一直为 214,因为该值受限于 table_open_acheopen_files_limit

下面的方法在 Ubuntu 16.04 和 MySQL 5.7.23 版本实验成功:

  1. 运行下面的命令,设置 open_files_limit

    1
    systemctl edit mysql
  2. 输入以下内容

    1
    2
    [Service]
    LimitNOFILE=8000
  3. 重启服务

    1
    2
    systemctl daemon-reload
    systemctl restart mysql

数据导入

测试数据导入

在 Problems 页面下可以编辑 Problem name, Time limit 这些信息,测试数据(Testcases)在页面上只能单点添加和修改,并且不能删除。

批量导入测试数据步骤:

  1. 先添加题目,填入"Problem name"、"Time limit" 和 "Memory limit" 等信息,其余的保存默认即可,但是暂不添加 "Testcases"。

  2. 点击该题目的导出按钮,下载得到一个压缩包。解压后的文件夹内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 在Windows使用 tree/f 生成该目录文本信息
    │ domjudge-problem.ini
    │ problem.yaml

    ├─data
    │ ├─sample
    │ └─secret

    └─problem_statement
    problem.pdf
  3. 目录 samplesecret 可自行创建,两个目录存放样例数据和隐藏数据(即测试数据)。

  4. 将数据 "0.in",“0.ans” 放入对应的文件夹下,重新压缩成新的压缩包。

  5. 在题目的编辑页面,通过 Upload problem archive 上传新压缩包。注意 Contest 选项选择为 Do not add / update contest data,否则可能会上传失败。

队伍账号导入

  • Domjudge队伍导入 - 参考链接

  • 需要在 home > import / export 页面下,导入 teams.tsvaccounts.tsv 这两个文件。在编辑这两个文件时,需要使用 UTF-8 格式,否则会上传失败或导致乱码。

  • teams.tsv

    该文件用于描述队伍信息,包含一版本行,接着每个队伍占用一行,每行包括用制表符(tab)分隔的字段。

    首行为版本行,格式如下:

    Field

    Description

    Example

    Type

    1

    Label

    teams

    fixed string (always same value)

    2

    Version number

    1

    integer

    队伍描述行,格式如下:

    Field

    Description

    Example

    Type

    1

    Team Number

    22

    integer

    2

    External ID

    24314

    integer

    3

    Group ID

    3

    integer

    4

    Team name

    Hoos

    string

    5

    Institution name

    Fuzhou University

    string

    6

    Institution short name

    FZU

    string

    7

    Country Code

    CHN

    string ISO 3166-1 alpha-3

    8

    Affiliation External ID

    Fuzhou University

    string

    Group ID 对应 Categories 中的 ID,表示队伍的角色,如女队、打星队等。

  • accounts.tsv

    该文件用于描述账号信息,同样包含版本行和账号行,每个账号占用一行。

    首行版本行的格式如下:

    Field

    Description

    Example

    Type

    1

    Label

    accounts

    fixed string (always same value)

    2

    Version number

    1

    integer

    账号描述行的格式如下:

    Field

    Description

    Example

    Type

    1

    Account Type

    team

    string

    2

    Full Name

    wtf

    string

    3

    Username

    team099

    string

    4

    Password

    B!5MWJiy

    string

    Account Type 取值为:team, judge, admin, analyst。这里要导入队伍账号,所以该字段在这固定为 team。

    注意:需要设置 Username 的格式才能将账号和队伍关联起来,规则为:Username 的整数部分需要和 team.tsv 中的 Team Number 一致。比如一支队伍 Team Number 为 99,则 Username 可以设置为 team-099。

  • 导入样例

    team.tsv 文件

    1
    2
    3
    4
    teams	1
    8 team008 3 三核战队 福州大学 FZDX CHN 福州大学
    18 team018 3 挂机不队 福州大学 FZDX CHN 福州大学
    31 team031 3 这都是什么鬼 福州大学 FZDX CHN 福州大学

    accounts.tsv 文件

    1
    2
    3
    4
    accounts	1
    team 三核战队 team008 T3yRt3
    team 挂机不队 team018 86MFyB
    team 这都是什么鬼 team031 RTJr6e

评测机

Unprivileged user and group

1
2
3
4
// 下面这条命令是必须运行的
useradd -d /nonexistent -U -M -s /bin/false domjudge-run
// X=1~4,X通常等同于CPU核心数
useradd -d /nonexistent -U -M -s /bin/false domjudge-run-X

Linux Control Groups

  • 每次重启都需要运行 judgehost/bin/create_cgroups,否则提交会编译错误。

问题集锦

1. 比赛正常需要几台机器?

个人认为正常应该至少需要 4 台机器,配置较高的作为主服务器,即 DOMserver,提供比赛的 web 页面;一台打印服务器,也安装 DOMserver,但开放 print 页面,达到比赛与打印分开,减少宕机对选手的影响;两台评测机,即 Judgehost,这样如果一台宕机,也有另一台继续评测,而不是完全中断评测,并且修复后可随时上线新的评测机。

由于安装的机器较多且安装包大,建议使用 apt-offline 打包需要的安装包,节省安装时间。

2. 气球状态页面返回 500 错误

正式比赛开始时,contest 只能留有一个比赛。(个人不知道原因)。

3. 测试数据上传失败

可能需要修改的几个文件:

  1. /etc/apache2/conf-avaliable/domjudge.conf

    1
    2
    3
    4
    5
    6
    <IfModule mod_php7.c>
    php_value max_file_uploads 101
    php_value upload_max_filesize 128M
    php_value post_max_size 128M
    php_value memory_limit 512M
    </IfModule>
  2. /etc/mysql/my.cnf

    1
    2
    3
    4
    [mysqld]
    max_connections = 10000
    max_allowed_packet = 512M
    innodb_log_file_size = 512M

4. 如何让 DOMJudge 支持多台打印机?

修改 domserver/webapp/src/DOMJudgeBundle/Utils/Printing.php 中 cmd 指令:

1
2
3
4
5
6
7
$cmd = "enscript -C " . $highlight
. " -d " . $printername // 指定打印机名
. " -b " . escapeshellarg($header)
. " -a 0-10 "
. " -f Courier9 "
// . " -p $tmp "
. escapeshellarg($filename) . " 2>&1";

去除 -p $tmp ,添加 -d 参数,指定打印机打印。多台打印机则让打印机名轮转即可。

CATALOG
  1. 1. Domserver 部署
    1. 1.1. PHP timezone
    2. 1.2. MySQL maximum connections
  2. 2. 数据导入
    1. 2.1. 测试数据导入
    2. 2.2. 队伍账号导入
  3. 3. 评测机
    1. 3.1. Unprivileged user and group
    2. 3.2. Linux Control Groups
  4. 4. 问题集锦
    1. 4.1. 1. 比赛正常需要几台机器?
    2. 4.2. 2. 气球状态页面返回 500 错误
    3. 4.3. 3. 测试数据上传失败
    4. 4.4. 4. 如何让 DOMJudge 支持多台打印机?