跳到主要内容
← 指南列表

单核?多核?适合您程序的 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

  1. 打开任务管理器(Ctrl + Shift + Esc)→ 性能 标签页 → CPU。
  2. 在图表上打开右键菜单,切换为 逻辑处理器,即可看到各核心的图表。

进程 标签页中的 CPU 使用率,是以服务器整体 CPU 为 100% 计算的。例如,在 4 核服务器上,如果某个程序在 25% 左右就不再上升,很可能是占满了一个核心。

那么该选什么?

  • 只有一个核心忙碌的程序 → 比起核心数,CPU 类型更重要。价格页面上每个系列都标有 CPU 名称,请比较一下。
  • 所有核心都忙碌的程序、同时运行多个程序的情况 → 请选择 vCPU 较多的套餐。
  • 如果长时间持续大量使用 CPU → 也请比较一下独立服务器。(VPS 与独立服务器的区别)
  • 如果想用数字比较 → 测试服务器性能中介绍了分别测量单个核心和全部核心性能的方法。

正在使用的服务器无法更改配置,如果需要其他套餐,请开通新服务器并迁移过去。

如果问题仍未解决,请在 Discord 提交工单。