这是“榨干 Python 代码性能”系列的第一篇文章,接下来我会通过一篇篇文章分别来介绍一些 Python 代码的工具和解释器,以及它们是如何更好地帮助开发者在前端(Python 脚本)或者后端(Python 解释器)中找到性能瓶颈。
在进行基准测试和分析之前,我们首先需要准备好环境。这意味着计算机和操作系统都要事先配置好。
以普遍情况来说,我的计算机配置如下:
处理器:Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz
内存:32GB
操作系统:Ubuntu 16.04 LTS
系统内核:4.4.0-75-Generic
为了实现代码可重用的目标,从而确保数据不会被其它后台进程所干扰,我们就必须优化好操作系统配置或增强其硬件性能。
那就从配置计算机开始吧。
硬件功能
首先,禁用所有硬件功能特性,这意味着也要在BIOS或UEFI中关闭Intel Turbo Boost和超线程功能。
正如官网所述,Turbo Boost是当处理器在小于功率、电流和温度规格限制的情况下,自动提升其运行速度的一种技术。而超线程是允许在每个核心上运行多个线程以达到高效使用处理器资源的另一种技术。
对于好技术,我们真的希望把它们运用在生产中,既然如此,那为什么不在基准测试和分析的时候启用它们呢?因为这样做我们就无法从代码运行的变量中得出其可靠性和可重用性的结果。说了这么多,让我们看看下面这个小例子吧,我把它命名为primes.py,并且代码被故意写得很垃圾。。。。
代码也可以在GitHub上找到。代码需要以下依赖项,请先安装:
接下来就能在启用了Turbo Boost和超线程的系统中运行它:
现在,让我们试试关闭Turbo Boost和超线程,并再次运行它:
通过观察可以发现,第一种情况的标准差是15%,这个误差太大了,假设代码优化后提速了6%,那么我们要分辨出是偶然变化的误差还是我们的优化效果就很难了。
第二种情况下的标准差就降低到了约0.6%,那么我们的优化效果就很容易被观察到了。
CPU功耗的降低
禁用所有的CPU节能选项并且使用一个固定的CPU频率,这样做可以通过改变Linux的电源管理来达到把intel_pstate修改成acpi_cpufreq的目的。
intel_pstate驱动程序可以借助Intel Core内部的调节驱动程序达到缩放的效果,而acpi_cpufreq驱动程序则利用了ACPI处理器的性能状态。
让我们先来看看一个例子:
可以看到,启用powersave,并且设置CPU频率在1.20 GHz和3.60 GHz之间是有利于我们日常使用计算机的,但是在做基准测试的时候结果会变得比较糟糕。
既然如此,那调节器有什么用处呢?查阅文档,我们发现:
performance - CPU以最高频率运行。
powersave - CPU以最低频率运行。
userspace - CPU以用户指定的频率运行。
ondemand - 根据当前负载动态缩放频率。首先跳转到最高频率,然后随着时间的推移逐渐降低频率。
conservative - 根据当前负载动态缩放频率。频率切换比ondemand更加频繁。
我们想要做的是把性能调节器设置到CPU所支持的最高频率,就像这样:
现在我们需要把调节器设置成performance,并且把CPU的工作频率固定至2.3 GHz,这个值是Xeon E5-2699 v3在禁用Turbo Boost的情况下所能使用的最大值了。
如果要设置所有的内容,以管理员权限运行下面的代码:
如果没有安装cpupower,请安装它:
电源管理对CPU的影响很大。在默认情况下,电源管理器会自动调节频率以降低功耗,但是我们并不希望它这样做,因此我们可以在GRUB中禁用它,只要修改/boot/grub/grub.cfg或者在/etc/grub.d/40_custom中新建一个新的内核条目就可以了。我们的引导行必须包含intel_pstate=disable这样的标志,就像这样:
ASLR(地址空间规划随机器)
这个设置备受争议,你可以在Victor Stinner的帖子中得到证实。当我们在基准测试时第一次建议禁用ASLR的时候,我们是在CPython中的按配置进行优化的支持下实施的。
在以上提到的特定的硬件中,禁用ASLR确实可以略为提升0.4%的性能,这也就是我们建议这样做的原因。
另一方面,在我的个人计算机上测试(Intel Core i7 4710MQ),禁用ASLR确实会出现帖子中所出现的情况。在更小的CPU上上测试(Intel Atom)的结果表明,我们也应该启用ASLR,而不是取消它。
由于它涉及具体的软硬件配置,所以它并不总是可用,所以需要我们分别对开启和关闭测试,比较之后再决定是否开启。
在我的机器上,我通过修改全局配置文件/etc/sysctl.conf来禁用它,需要使用sudo sysctl -p。
如果你要在运行的时候禁用它:
如果你要再次启用它:
英文原文:https://pythonfiles.wordpress.com/2017/05/15/hunting-python-performance-setup/
译者:飞驰的麒麟
联系客服