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

use*_*460 1 python linux performance x86 intel

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

服务器的 CPU 有 40 个内核,因此它执行任务的速度应该比我的笔记本电脑快。两个系统都运行 ubuntu 18.04 操作系统。

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

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

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

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

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()
Run Code Online (Sandbox Code Playgroud)

以下是使用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
Run Code Online (Sandbox Code Playgroud)

服务器的详细信息

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
Run Code Online (Sandbox Code Playgroud)

请让我知道可能是什么原因,我错过了什么吗?

谢谢

Pet*_*des 5

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

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

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

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

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


回复:1GB 文件:希望它在操作系统的磁盘缓存中保持热点。(在 Unix/Linux 下又名“页面缓存”)。所以实际的磁盘IO不会发生,只是读取RAM。