我的 i5 笔记本电脑 运行 python 脚本比 Xeon 40 核心服务器的 cpu Ubuntu 18.04 更快,为什么?

My i5 laptop is running python script faster than Xeon 40 core server's cpu Ubuntu 18.04, Why?

我创建了一个 python 脚本,它从一个文件中读取数据并从中提取所需的数据,问题是该脚本在我的 i5(Intel(R) Core(TM))上花费了 37 秒i5-8300H CPU @ 2.30GHz) 笔记本电脑,但在具有 CPU 的服务器上需要 70 秒(Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz)。

服务器的 CPU 有 40 个内核,所以它执行任务的速度应该比我的笔记本电脑快。两个系统都是 运行 ubuntu 18.04 OS.

脚本正在使用多处理,服务器是我的另一个系统,它没有承受更高的负载。我的笔记本电脑有 SSD 和 HHD(os 安装在 SSD 中)但是我把文件放在 HDD 驱动器中,脚本从中读取数据而服务器只有 HDD。文件大小在1GB左右,我测试了1000条记录的性能。

1) https://www.youtube.com/watch?v=0Q2wv6saL3Q - 在我的 40 核服务器上测试脚本。

2) https://www.youtube.com/watch?v=hSInldq1uRY - 在她的 8 核计算机上测试相同的脚本

以下代码是 运行 在 for 循环中,同时从 1GB 文件中读取数据,目标方法使用漂亮的汤从我从文件中获取的文档中提取数据。

t0 = multiprocessing.Process(target=get_domain, args=(record.url, processedData))
t1 = multiprocessing.Process(target=getTLD, args=(record.url, processedData))
t2 = multiprocessing.Process(target=geturlscheme, args=(record.url, processedData))
t3 = multiprocessing.Process(target=getAllemails, args=(soup, processedData))
t4 = multiprocessing.Process(target=getCanonicalURL, args=(soup, processedData))
t5 = multiprocessing.Process(target=getMetaKeyword, args=(soup, processedData))
t0.start()
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t0.join()
t1.join()
t2.join()
t3.join()
t4.join()
t5.join()

以下是使用 lscpu 命令对两个系统的 cps 的详细信息:

笔记本电脑的详细信息

:~$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  2
Core(s) per socket:  4
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i5-8300H CPU @ 2.30GHz
Stepping:            10
CPU MHz:             800.023
CPU max MHz:         4000.0000
CPU min MHz:         800.0000
BogoMIPS:            4608.00
Virtualization:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            8192K
NUMA node0 CPU(s):   0-7

服务器详情

root@ubuntu18:~# lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              40
On-line CPU(s) list: 0-39
Thread(s) per core:  2
Core(s) per socket:  10
Socket(s):           2
NUMA node(s):        2
Vendor ID:           GenuineIntel
CPU family:          6
Model:               62
Model name:          Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
Stepping:            4
CPU MHz:             1200.470
CPU max MHz:         3300.0000
CPU min MHz:         1200.0000
BogoMIPS:            5000.02
Virtualization:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            25600K
NUMA node0 CPU(s):   0-9,20-29
NUMA node1 CPU(s):   10-19,30-39

请告诉我可能是什么原因,我是不是遗漏了什么?

谢谢

Xeon E5-xxxx v2 是 IvyBridge。那很老了。如果您的工作负载主要是单线程性能瓶颈,那么您的结果看起来非常合理。现代四核具有更好的每线程内存带宽(但多线程的最大聚合更低),以及更低的内存延迟。 (内核和内存控制器之间的较小环形总线)。

您笔记本电脑的最大睿频也更高(4GHz 与 3.3GHz)。

此外,Haswell 和更新版本的分支预测器在 运行 解释器(如 CPython)方面明显更好;可能想要分析分支错误预测,看看是否存在很大差异。

看起来你的线程数是固定的。它比笔记本电脑上的物理内核要多,但它似乎可以通过超线程很好地扩展(或者几个线程相对较快地完成,因此总运行时间主要是最慢线程 运行 单独的时间)。而且它似乎不会成为共享内存带宽的瓶颈。

那么您最担心的是每线程性能,而您的笔记本电脑每线程速度更快。


回复:1GB 文件:希望它在 OS 的磁盘缓存中保持热。 (又名 "pagecache" 在 Unix/Linux 下)。所以实际的磁盘 IO 不会发生,只是读取 RAM。

我发现了两个大大降低服务器速度的问题。

  1. 固态硬盘。或者缺少 SSD,真的。 Python 可能经常访问其链接或参考文件。

  2. 笔记本电脑硬盘驱动器比看起来要快:它具有旧驱动器所没有的出色的主动缓存管理。如果它寻找 x 数据,它仍然是一个慢速驱动器,但如果读取或写入大块文件,它会很快,因为它不必寻找 python 链接和引用文件,缓存是'受影响。

解决这个问题的一种廉价方法是为服务器安装便宜的 ssd 升级并在其上安装 os、编译器和交换文件。 运行 编译器的硬盘延迟在 2021 年并不好。