上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-09-28 08:40 阅读量:922


我在香港葵涌机房的业务预算被掐得很死,老板只给了“能抗住双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 是性价比王道。
  • 把钱花在稳定的线路上,对用户体验的提升,远高于纸面带宽。
目录结构
全文