pytest - 为什么用 pytest-xdist 对 Astropy 并行测试没有很好的加速?

标签 pytest parallel-testing astropy

我正在运行 Astropy tests in parallel使用 python setup.py test --parallel N我的 Macbook 上的选项(4 个真实内核,固态磁盘),它使用 pytest-xdist并行运行〜8000个测试。

我尝试了不同的N在 1 到 10 范围内,但在所有情况下,我只能获得大约 2 的加速,但我希望在 3 到 4 范围内获得加速(因为运行测试应该受 CPU 限制)。

为什么加速比低,我怎样才能获得良好的加速(在一台计算机上使用多个内核)?

更新

我尝试了@Iguananaut 的 ramdisk 建议: diskutil erasevolume HFS+ 'ramdisk' hdiutil attach -nomount ram://8388608mkdir/卷/ramdisk/tmp
time python setup.py test -a '--basetemp=/Volumes/ramdisk/tmp' --parallel 8

与 SSD 的 2.0 相比,加速现在约为 2.2。
由于我有四个物理内核,我希望在 3 到 4 范围内。
由于某种原因,并行运行测试的开销可能非常大。

最佳答案

我怀疑SSD是那里的限制因素。许多测试都受 CPU 限制,但也有很多测试会占用大量磁盘——临时文件等。通过并行运行,这些可能会变得更慢。除此之外,很难说太多,因为它取决于您的环境的具体情况。我在六个核心上运行测试得到了显着的加速。不完全是 6 倍,但确实有所作为。

您可能会尝试的一件事是制作一个 ramdisk 以设置为您的临时目录。您可以在 OSX 中使用 diskutil 执行此操作.如果你不确定,你可以谷歌如何做到这一点。然后你应该可以运行 ./setup.py test -A '--basetemp=path/to/ramdisk' .我实际上并没有在 Astropy 测试中尝试过,并且不确定它是如何工作的。但如果它确实有效,它至少有助于在一定程度上排除 I/O 作为瓶颈。

那就是说我故意对它可能有多大帮助一厢情愿。即使使用 ramdisk——现在你的 RAM 速度正在成为 I/O 绑定(bind)测试的瓶颈。无论您拥有多少 CPU,所有 CPU 密集型测试都可以立即完成,并且 I/O 密集型测试不会变得更快,因此您仍然需要等待同样长的时间(或几乎一样长的时间)结束)。使用多处理时,进程之间的消息传递也会产生额外的开销——确切的执行方式取决于很多因素,但最有可能是通过一些共享内存。阅读本文的任何人也无法知道您的机器上正在运行的其他进程可能会争夺这些相同的资源。即使您的系统监视器没有显示任何大量使用 CPU 的东西,但这并不意味着没有进程在做其他会增加瓶颈的事情。

TL; DR 我不会认为没有与你扔给它的 corse 数量成正比的加速,尤其是在笔记本电脑之类的东西上。

关于pytest - 为什么用 pytest-xdist 对 Astropy 并行测试没有很好的加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23172146/

相关文章:

python - 如何使用pytest跳过参数化测试

python - pytest:针对同一接口(interface)的不同实现的可重用测试

python - 无法从 SDSS 共同添加的 Stripe 82 读取 WCS 适合图像

python - 如何在测试之间共享测试运行数据?

python - 有没有办法告诉 Sphinx 在不禁用 autodoc 的情况下不要运行模块?

java - 如何在 browserstack cucumber java 功能中并行运行?

ruby-on-rails - parallel_tests gem 是否按顺序运行您的测试套件?

ruby-on-rails - 并行测试 Rails 应用程序的 JRuby 友好方法

python - 如何在 python 中将 J2000 时间转换为 UTC?

python - 使用 numpy where 查找数组的最小值