单核?多核?适合您程序的 CPU
“是核心多的服务器好,还是单个核心快的服务器好?”答案取决于要运行的程序如何使用核心。下文还整理了亲自确认的方法。
核心、线程、vCPU
- 核心 —— CPU 中实际进行计算的“工人”。有 4 个核心,就可以同时处理 4 件事。
- 线程(逻辑处理器) —— 使用让一个核心分两路接收任务的技术(SMT、超线程)的 CPU,会显示出核心数两倍的线程。不过,性能并不会变成两倍。
- vCPU —— 分配给 VPS 的虚拟 CPU。在服务器中,
nproc命令或任务管理器中会显示这个数量。
程序要把工作分开,才会使用多个核心
程序需要把工作分成多路(线程或进程)来处理,多个核心才会一起工作。只按一条线路工作的程序,无论核心有多少,都只有一个核心在忙,其余的处于空闲状态。对这类程序来说,决定速度的是单个核心的性能(CPU 代数、主频),而不是核心数量。
| 程序 | 使用核心的方式 | 重要的因素 |
|---|---|---|
| Minecraft Java 服务器 | 游戏进程(tick)主要在一个线程中处理。加载区块、内存清理(GC)等部分工作也会使用其他核心。 | 单个核心的性能 |
| Discord 机器人(Node.js、Python) | 一个机器人大多以一个核心运行,通常不会大量使用 CPU。 | 内存、保持运行不中断 |
| Web 服务器(Nginx) | 将连接分给多个工作进程处理。 | 连接多时的核心数 |
| 数据库(MariaDB 等) | 用多个核心处理同时传入的多个请求。单个请求通常在一个核心上处理。 | 核心数和核心性能、内存和磁盘 |
| 压缩、视频转换、代码构建 | 将任务分开,同时使用多个核心。(视工具和选项而定) | 核心数 |
| 在一台服务器上运行多个程序 | 每个程序使用不同的核心。 | 核心数 |
Node.js 和 Python 是这样运行的
- Node.js —— JavaScript 代码默认在每个进程的一个线程中执行。如果是 Web 服务器,可以用 pm2 的集群模式(
pm2 start app.js -i max)按核心数启动多个实例来使用多个核心。Discord 机器人如果这样启动多个,同一个机器人会重复运行,对命令响应两次或出错,因此请只运行一个。 - Python —— 通常安装的 Python(CPython)由于 GIL 的存在,在一个进程中,Python 代码一次只能在一个核心上执行。如果想把繁重的计算分到多个核心,需要像
multiprocessing这样使用多个进程。
在您的服务器上亲自确认
在程序像平时一样运行的状态下,于最繁忙的时候确认最准确。
Linux
sudo apt install -y htop
htop
最上方带编号的条形就是各核心的使用率。
- 只有一个条形满载,其余空闲 → 这是单个核心性能很重要的程序。增加核心也不会变快。
- 所有条形均匀满载 → 核心数不足。vCPU 较多的套餐会有帮助。
- 条形空闲但仍然很慢 → 可能不是 CPU 的问题,而是内存、磁盘、网络的问题。请参考服务器变慢时的排查。
如果使用 top,在运行中按 1 即可按核心显示。程序的 %CPU 为 100% 表示占满了一个核心,200% 表示使用了相当于两个核心的量。
Windows
- 打开任务管理器(
Ctrl + Shift + Esc)→ 性能 标签页 → CPU。 - 在图表上打开右键菜单,切换为 逻辑处理器,即可看到各核心的图表。
进程 标签页中的 CPU 使用率,是以服务器整体 CPU 为 100% 计算的。例如,在 4 核服务器上,如果某个程序在 25% 左右就不再上升,很可能是占满了一个核心。
那么该选什么?
- 只有一个核心忙碌的程序 → 比起核心数,CPU 类型更重要。价格页面上每个系列都标有 CPU 名称,请比较一下。
- 所有核心都忙碌的程序、同时运行多个程序的情况 → 请选择 vCPU 较多的套餐。
- 如果长时间持续大量使用 CPU → 也请比较一下独立服务器。(VPS 与独立服务器的区别)
- 如果想用数字比较 → 测试服务器性能中介绍了分别测量单个核心和全部核心性能的方法。
正在使用的服务器无法更改配置,如果需要其他套餐,请开通新服务器并迁移过去。