Skip to content

Capacity.zh CN

houyhl edited this page Oct 18, 2026 · 1 revision

容量

简体中文 | English | Wiki 首页 | 安装后运维

本页记录一个小型网站在实测负载下的表现,供估算服务器规模参考。你的结果取决于硬件、数据和访问者;要观察自己的网站,见指标。

测量内容

服务器 Intel Core i7-11370H(4 核 8 线程),3.3 GiB 内存,SSD,Ubuntu 26.04。MariaDB 11.8、Redis 和 MinIO 在同一台服务器上;一个后端进程(server.clusters: null,与安装时相同);一台评测机,2 个评测槽位,使用一个 CPU。
数据(合成) 2,000 个用户;1,500 道题目(1,400 道公开),每道有两种语言的题面和两个标签;一年内的 300,000 个练习提交;30 场比赛,每场 6 道题(已结束的约 1,000 个提交,进行中的一场 2,551 个);3,000 个讨论,每个 5 条回复;300 个 50 道题的题单和一个 1,000 道题的题单。数据共约 300 MB。
访问者 页面访问以固定速率到来。每次访问发送该页面在浏览器中发送的 API 请求(用 Chromium 录制),题目、提交、用户和讨论各不相同。75% 已登录。比例:进行中的比赛 20%,其排名 10%,题目 20%,提交列表 12%,单个提交 8%,题库 8%,首页 6%,其余为其他比赛、讨论、用户和题单。
评测 全程每 2 秒一个 C++ 提交,真实评测
速率 每秒 20 次页面访问,持续 2 分钟,约相当于 300 名学生参加比赛、每人每 15 秒刷新一次;然后每秒 40 次持续 90 秒,每秒 80 次持续 60 秒

请求直接发送到后端,不经过 Nginx 和 TLS。所有模拟访问者共用一个地址,因此关闭了限流。

结果

每秒页面访问 每秒请求 页面访问 p50 / p95 请求 p95 等待评测 p95 后端 CPU 平均 / 峰值 MariaDB CPU
20 29 12 / 35 毫秒 20 毫秒 16 毫秒 28% / 63% 11%
40 59 11 / 30 毫秒 16 毫秒 14 毫秒 40% / 57% 19%
80 116 12 / 37 毫秒 22 毫秒 19 毫秒 71% / 95% 34%

没有请求失败。后端约使用 450 MB 内存,MariaDB 约 200 MB。100% CPU 即一个核。

最慢的页面是 1,000 道题的题单(约 100 毫秒)。所提出的“页面读取 p95 低于 300 毫秒”的目标在三种速率下都远远达到。在每秒约 120 个请求时,后端进程用掉一个核的大部分,这台服务器的单个进程会在这附近达到上限。运行多个后端进程(server.clusters)不在本次测量范围内。

本版本之前

同样的负载作用于上一版本:每秒 20 次页面访问时,页面中位数耗时 6.2 秒、p95 15.5 秒,提交最多等待评测 90 秒。后端进程已饱和(计入垃圾回收为 152% CPU),每秒 40 次时落后数分钟。比赛页面每次访问都从比赛的全部提交计算排名,题库对每道题分别读取标签,题单对每道题分别读取(1,000 道题 2,118 次查询)。现在:

页面 查询次数 之前 → 现在 耗时 之前 → 现在(逐个请求)
进行中的比赛、排名 13–14 → 12–13,排名在提交变化之前一直复用 75–115 毫秒 → 9–20 毫秒
题库(50 道题) 103–109 → 5–11 31–49 毫秒 → 11–19 毫秒
1,000 道题的题单 2,118 → 120 1,242 毫秒 → 108 毫秒
讨论 24–50 → 13–18 10–19 毫秒 → 7–12 毫秒

打开的比赛页面在打开时只请求一次比赛详情(之前是两次),并在浏览器标签页隐藏期间停止刷新。

数据库索引

用 MariaDB 慢查询日志(阈值 0 秒)记录了这些页面的全部后端查询,并检查了它们的执行计划。没有慢查询:单个查询检查的行数最多为 4,500(统计可见的讨论)。在 330,000 个提交上,提交列表按各个筛选条件(题目、用户、状态、语言及其组合)查询都在 3 到 19 毫秒内完成,使用的是已有的组合索引。因此本版本没有增加索引。

Clone this wiki locally