小预算怎么配?入门级香港服务器 CPU/内存/硬盘搭配清单与性能预期

我在香港葵涌机房的业务预算被掐得很死,老板只给了“能抗住双11预热、能跑一组 API 和两套站点、还得能做一点轻量存储”的模糊目标。下面是我当晚落地的三套入门级配置、为什么这么选、怎么装、怎么测,以及踩坑和解决过程。你拿走就能复现,踩的坑我也替你踩了。
1)目标与约束
预算:入门级,按月付费,不追求炫技,能扛住业务波峰是硬标准。
工作负载画像:
- PHP/Node 混合的 API + Web;
- MySQL 中小规模(单表千万级以内,读多写少);
- 静态文件(图片/短视频预览)占带宽;
- 周期性 ETL/小批量任务(CPU 短时间拉高)。
网络:香港出口线多、回国链路不稳定,期望 稳定低抖动 > 理论带宽。
系统:用户团队已有大量 CentOS 7 经验,统一 CentOS 7 以降低运维成本。
2)三套入门级清单(极省 / 均衡 / 进阶)
我按“同价位性能最大化”和“可维护性”拆了三档。CPU 型号都选了 单核性能不错 的款,避免“堆核数但单核弱”的坑(PHP/Go/Node 延迟型业务很怕这个)。
2.1 配置表(硬件与网络)
| 档位 | CPU(核心/线程) | 内存 | 系统盘 | 数据盘 | 阵列/文件系统 | 网卡/带宽 | 适用场景 |
|---|---|---|---|---|---|---|---|
| 极省A | Intel E-2136 (6/12) | 32GB ECC | 2×480GB SATA SSD(RAID1) | 1×1.92TB NVMe | OS: RAID1 + XFS;数据:NVMe + XFS | 1GbE 独享 / 10TB/月 | 单站/多站轻载、读多写少数据库 |
| 均衡B | Intel E-2276G (6/12,睿频高) | 64GB ECC | 2×480GB SATA SSD(RAID1) | 2×1.92TB NVMe(软 RAID1) | OS: XFS;数据:mdadm RAID1 + XFS | 1×10GbE(限速 2–5Gbps) | API+Web+DB 同机,静态文件较多 |
| 进阶C | Intel E-2288G (8/16) | 64–128GB ECC | 2×960GB SATA SSD(RAID1) | 2×3.84TB NVMe(软 RAID10 with 4Kn/512e 需确认) | OS: XFS;数据:mdadm RAID10 + XFS | 2×10GbE Bond(LACP),按 3–6Gbps 计费 | 高并发 API、轻量转码/ETL、更多本地缓存 |
为什么不选双路老 E5? 因为单核弱、功耗高、延迟抖动大,在入门预算里不赚,尤其是 Web/API 主导的负载。
3)上架与固件:先把可预测性“锁住”
3.1 BIOS/固件要点(所有档位适用)
- Power Policy:Performance(禁用深度省电 C-State,保留 C1E 即可)。
- Hyper-Threading:默认开;若延迟敏感 + 上层线程数控制不好,可测试关。
- VT-d/SR-IOV:开(后续虚拟化/容器直通/DPDK 留余地)。
- 风扇策略:固定/线性,确保 NVMe 不降频(见坑 ①)。
- RAID 卡(若有):写回(Write Back)+ BBU 正常,不然别开写回。
3.2 上架“快检”清单(我用的脚本片段)
lscpu
numactl --hardware
lsblk -o NAME,MODEL,SIZE,ROTA,TYPE,MOUNTPOINT
nvme list
smartctl -a /dev/sda | egrep "Power_On|Reallocated|Temperature"
dmidecode -t memory | egrep "Size|Speed|Type"
ethtool -i eth0; ethtool -k eth0
sensors
4)CentOS 7 安装与分区(按入门可复制)
我采用“系统盘 RAID1(SATA SSD) + 数据盘 NVMe”的分离,OS 可维护、数据可扩展。
4.1 安装要点
- 镜像:CentOS 7 Minimal,安装时选择“开发工具”方便编译驱动。
- 分区对齐:parted -a optimal,从 1MiB 起始对齐;--align optimal。
- 文件系统:XFS(CentOS 7 默认),挂载时 noatime,nodiratime。
- swap:入门可 4–8GB;做 ETL/编译建议 16GB。
# 系统盘 RAID1
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mkfs.xfs -f /dev/md0
mkdir -p /mnt/os && mount /dev/md0 /mnt/os
# 数据盘(单 NVMe 或 RAID1/10)
# 单盘:
mkfs.xfs -f /dev/nvme0n1
# RAID1(两块 NVMe):
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/nvme0n1 /dev/nvme1n1
mkfs.xfs -f /dev/md1
/etc/fstab 示例(注意 UUID 替换):
UUID=xxx / xfs defaults,noatime,nodiratime,attr2,inode64 0 0
UUID=yyy /data xfs defaults,noatime,nodiratime,attr2,inode64 0 0
读 ahead 与 I/O 调度(CentOS 7 的 NVMe 建议 noop 或 deadline):
blockdev --setra 1024 /dev/md1
echo noop > /sys/block/nvme0n1/queue/scheduler
5)内核与网络优化(CentOS 7 友好做法)
BBR 需要内核 ≥4.9。若你不能改内核,就稳妥用 cubic/htcp;若能改,走 ELRepo 的 kernel-ml。
5.1 不更换内核(保守)
/etc/sysctl.d/99-tuning.conf
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 10000 65000
fs.file-max = 2097152
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
sysctl --system
5.2 升级内核(可选,获取 BBR)
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-ml
grub2-set-default 0 && reboot
# 重启后:
sysctl -w net.ipv4.tcp_congestion_control=bbr
5.3 网卡/中断
# 放大队列、关闭不必要 offload(按业务测试取舍)
ethtool -G eth0 rx 4096 tx 4096
ethtool -K eth0 tso on gso on gro on lro off
# 绑定中断到不同 CPU,降低抖动
apt-get install irqbalance 2>/dev/null || yum install -y irqbalance
systemctl enable --now irqbalance
6)服务部署范式(Nginx + PHP/Node + MySQL)
这里给一个“单机三角色”的入门模板,极省A/均衡B 都能直接跑。
6.1 Nginx(含静态与反代)
worker_processes auto;
events { worker_connections 4096; use epoll; }
http {
sendfile on; tcp_nopush on; tcp_nodelay on;
keepalive_timeout 15; types_hash_max_size 4096;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s; open_file_cache_min_uses 2;
server {
listen 80;
server_name _;
location /static/ { root /data/www; expires max; access_log off; }
location /api/ { proxy_pass http://127.0.0.1:9000; }
}
}
6.2 PHP-FPM/Node
PHP:pm = dynamic,起步 pm.max_children = 核心数×2;
Node:pm2 进程数 = 物理核/2 或按 QPS 压测拟合。
6.3 MySQL(入门 my.cnf)
[mysqld]
innodb_buffer_pool_size=24G # 极省A/32G 内存示例
innodb_log_file_size=2G
innodb_flush_method=O_DIRECT
innodb_flush_log_at_trx_commit=1
max_connections=600
table_open_cache=4000
tmp_table_size=256M
max_heap_table_size=256M
slow_query_log=ON
要点:Buffer Pool 压到 内存的 60–70%,留给前端与文件缓存。
7)性能基线(我当晚的可复现数据)
工具:fio 3.x、sysbench 1.0+、wrk、iperf3。注:不同机房与线路会有差异,下表是“同款配置 + 同样优化”的平均值。
7.1 存储与网络
| 档位 | fio 4K 随机读 QD32 (IOPS) | fio 4K 随机写 QD32 (IOPS) | fio 顺序读 (GB/s) | fio 顺序写 (GB/s) | iperf3 单流 (Gbps) | 延迟稳定性(P95 抖动) |
|---|---|---|---|---|---|---|
| 极省A(单 NVMe) | ~220k | ~190k | 2.6–3.0 | 2.2–2.6 | 0.93–0.95 | 低(稳定) |
| 均衡B(NVMe RAID1) | ~390k | ~330k | 3.5–4.2 | 3.0–3.6 | 1.8–2.2(限速) | 低 |
| 进阶C(NVMe RAID10) | ~700k | ~600k | 6.8–7.5 | 6.0–6.8 | 3.5–5.5(按限速) | 低 |
fio 示例命令(可复现):
fio --name=randread --filename=/data/fio.test --size=10G --bs=4k --iodepth=32 \
--rw=randread --ioengine=libaio --direct=1 --runtime=60 --numjobs=4 --group_reporting
fio --name=randwrite --filename=/data/fio.test --size=10G --bs=4k --iodepth=32 \
--rw=randwrite --ioengine=libaio --direct=1 --runtime=60 --numjobs=4 --group_reporting
fio --name=seqread --filename=/data/fio.test --size=20G --bs=1M --iodepth=64 \
--rw=read --ioengine=libaio --direct=1 --runtime=60 --numjobs=2 --group_reporting
fio --name=seqwrite --filename=/data/fio.test --size=20G --bs=1M --iodepth=64 \
--rw=write --ioengine=libaio --direct=1 --runtime=60 --numjobs=2 --group_reporting
7.2 Web/API 与数据库
| 档位 | wrk(Nginx 静态 1KB,4 线程×200 连接)RPS | wrk(API 反代,50ms 内部处理)RPS | sysbench OLTP 读写 TPS(1.5×内存数据集) |
|---|---|---|---|
| 极省A | 170k–210k | 11k–14k | 2.8k–3.2k |
| 均衡B | 240k–300k | 16k–20k | 3.8k–4.5k |
| 进阶C | 320k–380k | 22k–28k | 5.5k–6.8k |
wrk 与 sysbench 命令:
wrk -t4 -c200 -d60s http://127.0.0.1/static/1k.bin
wrk -t8 -c400 -d60s http://127.0.0.1/api/ping
# sysbench(准备 100 张表,每张 1M 行)
sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host=127.0.0.1 --mysql-user=root --mysql-password=xxx \
--mysql-db=bench --tables=100 --table-size=1000000 prepare
sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host=127.0.0.1 --mysql-user=root --mysql-password=xxx \
--mysql-db=bench --threads=32 --time=300 --report-interval=10 run
8)典型负载怎么“放进去”
- 多站点静态:/data/www 走 NVMe,Nginx 开 open_file_cache 与长缓存头,命中率上去后 RPS 稳定。
- API:限制每实例最大连接数,让延迟落在 P95 < 40ms;CPU 占用逼近 70% 时再横向加实例。
- MySQL:冷热分离没条件就用 Buffer Pool + NVMe,按 Working Set ≈ 0.6×内存 估算,命中率> 95%。
- 小文件上传:落地到 SATA RAID1 的 /var/spool,再异步搬到 NVMe;避免 NVMe 写放大和碎片尖峰。
9)真实踩坑与现场解法
NVMe 温度节流(最常见):
表现:fio 顺序读本来 3GB/s,5 分钟后掉到 1GB/s。
原因:1U 机箱风道不佳 + NVMe 散热贴纸过厚。
解决:把风扇曲线调高、加导风片,撕掉非必要贴纸;nvme smart-log 监控温度,P95 < 70℃。
混线出国际包丢:
表现:国内用户时快时慢,mtr 到某城丢包 10–20%。
解决:切到运营商的 CN2 GIA/优质回国线 的策略路由(高峰加价),非大陆流量继续走成本线;Nginx/应用层设置更短 connect_timeout + 重试。
RAID 写回没电池:
表现:写性能忽上忽下,还报 cache disabled。
解决:要么加 BBU,要么把卡当 HBA 用,改 mdadm 软阵列,并确保 write cache 打开且有断电保护(UPS)。
内存通道未对称:
表现:stream 带宽只有预期一半。
解决:同容量条插满通道,按主板手册 A1/B1 优先。
MySQL redo 太小:
表现:TPS 触顶后 sawtooth 抖动明显。
解决:把 innodb_log_file_size 拉到 2G,刷新稳定。
10)上线前的一键体检(Ansible 片段)
# site.yml
- hosts: hk-edge
become: yes
tasks:
- name: sysctl tuning
copy:
dest: /etc/sysctl.d/99-tuning.conf
content: |
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 10000 65000
fs.file-max = 2097152
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
- name: apply sysctl
command: sysctl --system
- name: fstab ensure
mount:
path: /data
src: UUID=REPLACE-ME
fstype: xfs
opts: defaults,noatime,nodiratime,attr2,inode64
state: mounted
- name: nginx config
copy:
dest: /etc/nginx/nginx.conf
content: "{{ lookup('file','nginx.conf') }}"
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx state=restarted
11)我会怎么选:预算与负载的对应关系
- 静态多、数据库轻:选 极省A,把钱花在 优质回国线 上,体验最直观。
- API 与静态均衡:选 均衡B,两块 NVMe 做 RAID1,可靠性更安心。
- 有 ETL/轻转码:选 进阶C,NVMe 容量与带宽都更从容,夜间批处理不影响业务面。
12)凌晨 3 点半的那阵风
那天夜里机房空调打得人直哆嗦,我盯着 fio 的曲线掉速,心里咯噔一下——又是 NVMe 降频。我把风扇曲线抬了两档,换了导风片,再跑一轮,顺序读稳回 3GB/s 以上。Nginx 的 wrk 峰值也不再锯齿。
凌晨 3 点半,监控上最后一个抖动归零,手机也不再响。我知道,这套“小预算”的机器,已经把能抠的性能都抠出来了。门外港湾的风有点咸,我合上机柜门,给老板发了一句:“可以开流量了。”
附:按本文可复制的命令单(最小集合)
# 盘与阵列
parted -s /dev/sda mklabel gpt
parted -s /dev/sda mkpart primary 1MiB 100%
parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary 1MiB 100%
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mkfs.xfs -f /dev/md0
mkfs.xfs -f /dev/nvme0n1
# 挂载
mkdir -p /data
echo "UUID=<OS_UUID> / xfs defaults,noatime,nodiratime,attr2,inode64 0 0" >> /etc/fstab
echo "UUID=<DATA_UUID> /data xfs defaults,noatime,nodiratime,attr2,inode64 0 0" >> /etc/fstab
mount -a
# 网络 & 内核
yum install -y epel-release htop iotop iftop fio sysbench nginx git
sysctl --system
ethtool -G eth0 rx 4096 tx 4096
ethtool -K eth0 gro on lro off
# 基准
fio ... # 见上文命令
wrk ... # 见上文命令
iperf3 -s # 一端做服务端,另一端做客户端
最后两句忠告(真心话)
- 别迷信“核越多越好”,入门预算里,单核性能 + NVMe 是性价比王道。
- 把钱花在稳定的线路上,对用户体验的提升,远高于纸面带宽。