作者:妩媚的麻醉效应 | 来源:互联网 | 2023-09-04 10:45
我创建了一个python脚本,该脚本正在从文件中读取数据并从中提取所需的数据,问题是该脚本在我的i5(Intel(R)Core(TM)i5-8300H CPU @ 2.30)上耗时37秒GHz)笔记本电脑,但在具有CPU(Intel®Xeon®CPU E5-2670 v2 @ 2.50GHz)的服务器上花费70秒。
服务器的CPU有40个内核,因此它应该比我的笔记本电脑执行任务更快。两个系统都运行ubuntu 18.04 OS。
该脚本正在使用多处理程序,而服务器是我的另一个系统,它没有承受更高的负载。我的笔记本电脑同时具有SSD和HHD(操作系统已安装在SSD中),但是我已将文件放在HDD驱动器中,脚本从该驱动器读取数据,而Server仅具有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,processedData))
t2 = multiprocessing.Process(target=geturlscheme,processedData))
t3 = multiprocessing.Process(target=getallemails,args=(soup,processedData))
t4 = multiprocessing.Process(target=getcanonicalURL,processedData))
t5 = multiprocessing.Process(target=getMetaKeyword,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文件:希望它在操作系统的磁盘缓存中保持高温。 (在Unix / Linux下也称为“ pagecache”)。因此,实际的磁盘IO不会发生,仅读取RAM。
,
我发现了两个严重降低服务器速度的问题。
固态硬盘。或者缺少SSD,真的。 Python 可能经常访问其链接或参考文件。
笔记本电脑的硬盘驱动器比它看起来的要快:它有一个旧硬盘所没有的强大的主动缓存管理。如果它寻找 x 数据,它仍然是一个缓慢的驱动器,但如果读取或写入大块文件,它会很快,因为它不必寻找 python 链接和引用文件,缓存不受影响。
一种廉价的解决方法是在服务器上安装廉价的 ssd 升级,并在其上安装操作系统、编译器和交换文件。 2021 年运行编译器的硬盘延迟不会很大。