要让 JUSTG 云服务器符合合理使用规则,只需关注三个指标:1 小时平均 CPU 使用率(不超过 50%)、持续磁盘吞吐(不得在 100 MiB/s 以上持续 4 小时或更久)、网络使用(不得长时间占用共享端口 70% 以上),再加上每月流量。本文介绍如何在 Debian、Ubuntu 和 Rocky Linux / AlmaLinux 上用常见 Linux 工具测量这些指标、在触及限制前收到提醒,以及如何给自己的任务限速。
合理使用规则与各方案限制
| 资源 | 云服务器规则 |
|---|---|
| CPU | 短时间跑满 100% 没有问题。若 1 小时平均使用率超过 50%,CPU 会被自动限制在 50%。 |
| 存储 I/O | 不得在 100 MiB/s 以上持续 4 小时或更久。 |
| 网络端口 | 端口为共享端口:不要长时间占用 70% 以上。所有方案都是 500 Mbps 端口,70% 约为 350 Mbps。 |
每个方案还包含每月流量额度:
| 方案 | CPU | 内存 | 每月流量 |
|---|---|---|---|
| mini | 1 核 | 512 MB | 500 GB |
| 01 | 2 核 | 1 GB | 1 TB |
| 02 | 3 核 | 2 GB | 2 TB |
| 03 | 4 核 | 4 GB | 3 TB |
| 04 | 5 核 | 8 GB | 4 TB |
| 05 | 6 核 | 16 GB | 5 TB |
| 06 | 7 核 | 24 GB | 6 TB |
价格和详细配置请参阅云服务器方案说明。
步骤 1:安装工具
# Debian / Ubuntu
apt update && apt install -y htop sysstat iotop vnstat nload iftop
# Rocky Linux / AlmaLinux (htop, vnstat, nload and iftop come from EPEL)
dnf install -y epel-release && dnf install -y htop sysstat iotop vnstat nload iftop
步骤 2:查看 CPU 负载与 1 小时平均值
合理使用规则看的是 1 小时平均值,只瞄一眼 top 并不够。请使用以下命令:
nproc # number of vCPU cores
uptime # load average over 1, 5 and 15 minutes
top -b -n 1 | head -n 5 # %Cpu(s) line: us sy ni id wa ... st
mpstat 60 60 # one hour of 1-minute samples, then an "Average" line
pidstat -u 5 3 # which processes use the CPU
- top 中的 %Cpu(s) 代表整台 VPS。CPU 使用率等于
100 - id,所以id连续一小时低于 50,就说明已超过限制。 - htop 用一条进度条显示每个核心。单个进程可能显示超过 100%,因为 100% 表示占满一个核心。按
P按 CPU 排序,按M按内存排序。 - Load average 统计的是等待 CPU 和磁盘的进程,因此负载高而 CPU 使用率低时,通常是 I/O 太慢。
- st(steal)是虚拟化层分给其他用户的时间。如果你自己的使用率很低而 st 一直偏高,请附上命令输出提交工单。
想查看过去的时段,请开启 sar 历史记录。它每 10 分钟采样一次,事后可以查看任意一个小时:
# Debian / Ubuntu: turn on history collection (Rocky/Alma: only enable the service)
sed -i 's/^ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
systemctl enable --now sysstat
sar -u # CPU every 10 minutes today, plus an Average
sar -u -s 13:00:00 -e 14:00:00 # one specific hour
sar -d -p # disk throughput history (rkB/s, wkB/s)
sar -n DEV # network history per interface (rxkB/s, txkB/s)
步骤 3:用 iostat、iotop 和 pidstat 测量磁盘 I/O
iostat -xm 5 # per disk (e.g. vda): rMB/s, wMB/s, %util, r_await, w_await
iotop -oPa # only processes doing I/O, with accumulated totals
pidstat -d 5 # per-process kB_rd/s and kB_wr/s
# If iotop warns about CONFIG_TASK_DELAY_ACCT, enable it until the next reboot:
sysctl -w kernel.task_delayacct=1
在 iostat 中,把你那块硬盘的 rMB/s 与 wMB/s 相加。短时峰值很正常,关键是两者之和是否连续数小时维持在 100 左右或更高。常见原因有:大型备份、数据库导入、日志暴增、小方案频繁使用 swap,或爬虫写入数百万个文件。iotop 和 pidstat -d 能找出是哪个进程造成的。
%util 高、await 长但 MB/s 很低,通常是大量小块随机写入:用起来感觉很慢,但并不等于持续高吞吐。步骤 4:用 vnStat 统计每月流量
vnStat 在后台按网卡记录流量,几乎不占资源,重启后历史数据也会保留。
systemctl enable --now vnstat
ip -br link # interface name, e.g. eth0 or ens3
vnstat -i eth0 # summary (data appears after about 5 minutes)
vnstat -m # per month, with an estimate for the current month
vnstat -d # per day
vnstat -h # per hour
vnstat -l # live rate in Mbit/s, Ctrl+C to stop
vnstat -m 按月显示接收(rx)、发送(tx)和总流量,并给出当月的 estimated 预估值。请把预估值与你方案的流量额度对比。vnStat 统计的是双向流量;如果不确定你的额度如何计算,请提交工单咨询。
想实时查看端口占用,可以用下面的命令。若在 500 Mbps 端口上长时间维持在 350 Mbps 左右,就已超过 70% 的参考线:
nload eth0 # live in/out graph for one interface
iftop -i eth0 -P # live traffic per connection, with ports
ss -tnp state established | head -n 20 # which processes hold connections
步骤 5:可选的监控面板:Netdata 或 Prometheus node_exporter
Netdata
Netdata 无需配置即可实时绘制 CPU、磁盘、网络和各项服务的图表。它可能占用 100 MB 以上内存,更适合 2 GB 及以上的方案;mini 和 01 方案建议使用上面的命令行工具。切勿把它的端口暴露到公网:
# Debian / Ubuntu (Rocky/Alma: dnf install -y netdata from EPEL)
apt install -y netdata
# /etc/netdata/netdata.conf - listen on localhost only
[web]
bind to = 127.0.0.1
systemctl restart netdata
ss -tlnp | grep 19999 # must show 127.0.0.1:19999, not 0.0.0.0 or *
# On your own computer: open a tunnel, then browse http://localhost:19999
ssh -N -L 19999:127.0.0.1:19999 [email protected]
Prometheus node_exporter
如果你已经在其他服务器上运行 Prometheus 和 Grafana,VPS 上装轻量的 node_exporter 就够了。它默认在所有网卡上监听 9100 端口,因此只允许你的 Prometheus 服务器访问(Rocky/Alma 请使用 Prometheus 发布页提供的官方二进制文件):
apt install -y prometheus-node-exporter
ss -tlnp | grep 9100
# Allow only your Prometheus server to scrape it
ufw allow from 203.0.113.30 to any port 9100 proto tcp
# firewalld (Rocky/Alma):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.30" port port="9100" protocol="tcp" accept'
firewall-cmd --reload
步骤 6:设置简单的告警
下面这个小脚本会在以下情况发出提醒:15 分钟负载超过核心数的一半、根分区使用率达到 85%,或当月流量超过额度的 80%。负载只是粗略的早期信号,真实的 CPU 平均值请用 sar -u 确认。告警会写入系统日志,也可以选择推送到 webhook(聊天工具、邮件网关等):
#!/bin/bash
# /usr/local/sbin/vps-alert.sh - simple early warnings, run from cron
QUOTA_GB=1000 # your plan's monthly traffic, e.g. plan 01 = 1 TB
IFACE=eth0
WEBHOOK= # optional, e.g. https://hooks.example.com/REPLACE-ME
alert() {
logger -t vps-alert "$1"
[ -n "$WEBHOOK" ] && curl -fsS -m 10 --data-urlencode "text=$(hostname): $1" "$WEBHOOK" >/dev/null
}
CORES=$(nproc)
LOAD15=$(cut -d' ' -f3 /proc/loadavg)
awk -v l="$LOAD15" -v c="$CORES" 'BEGIN { exit !(l > c * 0.5) }' \
&& alert "15-minute load $LOAD15 on $CORES cores"
DISK=$(df --output=pcent / | tail -n 1 | tr -dc '0-9')
[ "$DISK" -ge 85 ] && alert "root file system ${DISK}% full"
USED=$(vnstat -i "$IFACE" --oneline b | cut -d';' -f11)
[ -n "$USED" ] && [ "$USED" -gt $(( QUOTA_GB * 800000000 )) ] \
&& alert "over 80% of monthly traffic: $(( USED / 1000000000 )) GB"
exit 0
chmod 700 /usr/local/sbin/vps-alert.sh
echo '*/15 * * * * root /usr/local/sbin/vps-alert.sh' > /etc/cron.d/vps-alert
journalctl -t vps-alert --since today # see past warnings
vnstat --oneline b 输出的第 11 个字段就是当月总流量(单位为字节)。请根据你的 VPS 设置 QUOTA_GB 和 IFACE。
步骤 7:给自己的任务限速
大多数合理使用问题都源自某一个重负载任务。只给这个任务限速,而不是拖慢整台服务器。
限制单条命令的 CPU 与磁盘
# Lowest CPU and disk priority for a one-off job
nice -n 19 ionice -c3 tar -czf /root/site.tar.gz /var/www
# Hard caps for a one-off job (cgroup v2: Debian 11+, Ubuntu 22.04+, Rocky/Alma 9)
lsblk -d -o NAME,SIZE # disk name, usually vda
systemd-run --scope -p CPUQuota=50% \
-p IOReadBandwidthMax="/dev/vda 50M" -p IOWriteBandwidthMax="/dev/vda 50M" \
tar -czf /root/site.tar.gz /var/www
nice 和 ionice 只是降低优先级:没有其他任务竞争时,任务仍会全速运行;而且在虚拟硬盘常用的 none 或 mq-deadline 调度器下,ionice 不起作用。systemd-run 配合 CPUQuota 和 IO*BandwidthMax 才是真正的硬限制。CPUQuota=100% 等于一个完整核心。
为服务设置永久限制
systemctl edit myapp.service
# add in the editor:
[Service]
CPUQuota=100%
IOReadBandwidthMax=/dev/vda 80M
IOWriteBandwidthMax=/dev/vda 80M
systemctl restart myapp.service
systemctl show myapp.service -p CPUQuotaPerSecUSec
网络传输限速
rsync -a --bwlimit=20M /var/www/ [email protected]:/srv/www/ # about 170 Mbit/s
wget --limit-rate=20m https://example.com/big.iso
curl --limit-rate 20M -O https://example.com/big.iso
# Cap ALL outgoing traffic on eth0 at 300 Mbit/s (lost on reboot)
tc qdisc replace dev eth0 root tbf rate 300mbit burst 256kb latency 50ms
tc -s qdisc show dev eth0
tc qdisc del dev eth0 root # remove the cap
tc 限速会作用于该网卡的全部出站流量,包括 SSH。请在保持登录的状态下测试,并另开一个会话,以便随时撤销。Docker 容器请改用 --cpus 和内存限制。步骤 8:升级方案或改用独立服务器
限速适合应对偶发的高峰。如果日常负载就让 CPU 小时平均值超过 50%、需要长时间的高磁盘吞吐,或经常占满端口或每月流量,说明这台服务器已经不够用了:
- 升级方案:在服务页面升级,获得更多核心、内存、SSD 和流量。请参阅如何升级 VPS 并扩展分区。
- 选择独立服务器:适合长期高 CPU、高磁盘或高带宽的业务,整台硬件由你独享。独立服务器在东京、首尔和约翰内斯堡 $199/月起,莫斯科 $299/月起。可通过工单联系 Sales/Inquiries 获取建议。
FAQ
VPS 在长时间高负载后变慢,是触发了 CPU 限制吗?
有可能:如果 1 小时 CPU 平均使用率超过 50%,CPU 会被自动限制在 50%。用 htop 或 pidstat -u 找出占用高的进程,降低或限制它的负载,再用 sar -u 查看每小时的历史数据。
端口 70% 的规则和每月流量额度是一回事吗?
不是,二者相互独立。70% 规则针对的是长时间的速率(500 Mbps 端口约 350 Mbps),流量额度则是每月的总量。前者用 vnstat -l 或 nload 观察,后者用 vnstat -m 查看。
看不懂这些数据,可以找谁帮忙?
请向 Technical support 提交工单,并附上服务 IP、带时区的时间和命令输出。JUSTG 提供 7×24 小时 AI 客服(工单),需要人工处理的问题会由工程师跟进。