我有一台配备 2 个 X5650 2.7GHZ 处理器的 Linux 机器,我在上面为我的游戏社区托管游戏服务器,我的问题是:游戏服务器需要最佳 1 核性能,但我有 24 个 vCORES 和 12 个物理核心。是否可以“告诉”内核使用 12 个物理核心?那么1个物理核心将使用2VCORES?
谢谢,亚历克斯。
答案1
您可以taskset
通过设置线程亲和性来手动在核心之间分配进程。要确定哪些线程属于哪些内核和处理器,请/proc/cpuinfo
按如下所示进行检查:
$ grep -E '^processor|^physical id|^core id' /proc/cpuinfo |sed 's/^processor/\nprocessor/'
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
processor : 2
physical id : 0
core id : 0
processor : 3
physical id : 0
core id : 1
$ _
processor
是线程数,physical id
是物理CPU 数,core id
是核心数。上面的输出来自具有两个核心和四个线程的单个 CPU 的机器。
taskset
可用于taskset --all-tasks -p <hex_mask> <pid>
修改现有进程的所有线程的关联性。这hex_mask
是一个位掩码,其中每 1 位代表一个分配的 CPU 线程,编号从右侧开始。例如,0xa
掩码意味着二进制0b1010
,它指示进程的线程#1 和线程#3 的亲和力。我希望 PID 是不言自明的。
答案2
虚拟核心或“线程”
如果您想避免虚拟核心或“线程”,那么您可以简单地禁用该功能。虽然禁用此功能不一定会提高性能,但这取决于您正在运行的服务器软件(有些引擎可以更好地与 HT/SMT 配合使用,而其他引擎则不能),但您可能应该对其进行测试。
根据您的帖子,Intel X5650 每个有 6 个核心和 12 个线程。您可以使用 来验证这一点lscpu
。对于前。以下 CPU 有 4 个核心且禁用 HT:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
您可以通过运行以下命令来验证 HT 内核:
# grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
这将输出类似:
$ grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
/sys/devices/system/cpu/cpu0/topology/thread_siblings_list:X,Y
/sys/devices/system/cpu/cpu1/topology/thread_siblings_list:X,Y
/sys/devices/system/cpu/cpu2/topology/thread_siblings_list:X,Y
/sys/devices/system/cpu/cpu3/topology/thread_siblings_list:X,Y
其中 X,Y 是物理核心 ID,HT-核心 ID,如:0,4(第一个虚拟核心 ID 通常是最后一个物理核心 ID 的下一个)。
禁用超线程
有了这些信息,您有 2 个选项来禁用 HT,具体取决于您对服务器的访问:
通过BIOS设置(最简单)
- 您应该检查主板制造商手册,并在那里禁用超线程。这需要服务器重新启动并访问 BIOS 设置。
通过命令行(无需重启)
- 你可以直接禁用Linux中的每个虚拟核心,创建一个
disablevcore.sh
文件:
- 你可以直接禁用Linux中的每个虚拟核心,创建一个
#!/bin/bash
for i in {YY..YY}; do
echo "Disabling logical HT core $i."
echo 0 > /sys/devices/system/cpu/cpu${i}/online;
done
并将 YY..YY 替换为您要禁用的线程 ID,根据您的处理器,可能是 {6..11}。虽然我不确定编号在多插槽设置上如何工作,所以您应该仔细检查。
另一种选择(2.a,如果您愿意的话)是在 GRUB 中禁用它:
- 编辑 GRUB 配置文件:
/etc/sysconfig/grub
(if 并追加到noht
以: 开头的行中GRUB_CMDLINE_LINUX
。它应该是这样的:
- 编辑 GRUB 配置文件:
GRUB_CMDLINE_LINUX="... noht ..."
有关 HT 和 SMT 的更多信息:
英特尔“超线程”
超线程是英特尔专有的同步多线程实现,用于改进 x86 微处理器上执行的计算的并行化。它于 2002 年 2 月首次出现在 Xeon 服务器处理器上,并于 2002 年 11 月出现在 Pentium 4 桌面 CPU 上。后来,英特尔将这项技术应用于安腾、凌动和酷睿“i”系列 CPU 等。
https://en.wikipedia.org/wiki/超线程
AMD“同时多线程(SMT)”
同步多线程是一种通过硬件多线程提高超标量 CPU 整体效率的技术。 SMT 允许多个独立的执行线程,以更好地利用现代处理器架构提供的资源。
https://en.wikipedia.org/wiki/Simultaneous_multithreading
有关通过内核禁用 HT 的更多详细信息:
https://www.golinuxhub.com/2018/01/how-to-disable-or-enable-hyper.html