python - 为什么多线程Python程序在ec2微实例上速度很慢?

标签 python multithreading python-2.7 amazon-ec2 sandbox

我正在开发一个 Online Judge 代码检查器。我的代码在 python 2.7 中使用多线程。我的本地计算机(i core 3 RAM 4GB)上的相同程序在 1 分 10 秒内评估大约 1000 个提交。但是当我在 ec2 微型实例(大约 600 MB RAM)上运行它时,它需要大约 40 分钟(随机变慢几秒)。了解我损坏东西的原因。

  1. 首先,这是我的评估器的工作原理:

    • 我有一个主程序worker.py ,这会创建多个线程
    • 主线程从文件中(暂时)提取提交(一次 10 个)并将它们放入全局队列中
    • 副线程从队列中获取提交(一项提交仅由一个线程评估)
    • 副线程接受提交后,会将其发送到函数 compile ,哪个 将提交的可执行文件返回给该线程
    • 然后线程将此可执行文件发送到函数 run运行可执行文件 (使用具有定义的内存和时间限制的沙箱)并将可执行文件的输出写入文件,然后检查它
      对照标准输出
    • 队列变空后,主线程再次拉取 10 个提交并将它们放入队列中

  2. 函数compilerun :

    • 编译函数和运行函数将可执行文件和输出分别保存在名为 喜欢 <thread_Name>.exe<thread_Name>.txt这样每个线程都有自己的文件 并且不存在覆盖问题。
    • 仅当编译函数的状态正常(已编译的文件)时,线程才会运行函数,否则会抛出编译错误 该提交

  3. 现在我的疑问是:

    • ec2上执行缓慢的问题是由于其拥有的资源还是由于 python 的多线程。在我的脚本中,线程访问全局变量 例如队列(我加锁)和 test.py(I dont put lock on it)在运行中 函数逐个字符地检查标准输出的输出(类似于vimdiff), 和mysandbox.py(libsandbox the sandbox) 以及其他一些全局变量。Python的GIL导致工作速度很慢。如果是的话 是这样那为什么它在我的本地机器上运行得很快。
    • 暂时我也提供相同的文件 test.cpp(adds two numbers and prints result) 1000次。所以当我故意在这个文件中犯一个编译错误并运行我的main时 ec2 上的程序运行得非常快。从中我推断出编译和 我的程序的运行(编译和运行函数)占用了主要时间,而不是线程 创建和管理。

我知道这是一个很大的问题,但非常感谢任何帮助(否则我将不得不用我所有的声誉来维持赏金:))。

最佳答案

对于持续的计算任务来说,微实例变得极其缓慢(根据设计)。

您将代码编写为多线程,以利用整个“机器”的 CPU 资源来执行文件检索和编译等任务,这是提高性能的良好做法。

虽然这在您拥有保证配置硬件资源的物理机或虚拟机上有意义,但由于 Amazon 分配资源的方式,它在微型实例上没有意义.

Per Amazon's documentation ,微型实例仅针对短突发 CPU 操作而设计,因此,如果您尝试使用消耗 CPU 使用率的多个线程,将会遇到 Amazon 本身施加的巨大瓶颈:

If the application consumes more than your instance's allotted CPU resources, we temporarily limit the instance so it operates at a low CPU level. If your instance continues to use all of its allotted resources, its performance will degrade. We will increase the time that we limit its CPU level, thus increasing the time before the instance is allowed to burst again.

查看我刚刚链接到的文档中的 CPU 使用率图表以获取更多详细信息。

为了证明这就是问题所在,您可以简单地启动一个小型实例并在那里运行您的判断软件 - 您应该会体验到与桌面计算机类似的显着改进。

TL;DR 当尝试在微型实例上使用持续的 CPU 时,它可能会变得不如旧的 Palm Treo 强大。

关于python - 为什么多线程Python程序在ec2微实例上速度很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17476402/

相关文章:

python - 如何在线程内运行递归函数?

python-2.7 - numpy-两个矩阵的逐行外积

python如何导入脚本

python - 如何将图像中的标题和标题与正文分开

C++ boost :Variable sync between 2 threads

java - 如何通知 PipedInputStream 线程 PipedOutputStream 线程已写入最后一个字节?

python - 如何使用 Pyglet 绘制透明图元

Python "with"语句会出现TOCTOU吗?

python - 多个工作节点上的 Django + Celery 任务

python - 如何在循环中制作双 'continue'?