2013-07-04 2 views
1

Я работаю над проверкой кода онлайн-судьи. Мой код использует многопоточность в python 2.7.Такая же программа на моей локальной машине (ядро 3 RAM 4GB) оценивает около 1000 подписок за 1 минуту 10 секунд. Но когда я запускаю его на экземпляр ec2 micro (около 600 МБ ОЗУ), он принимает около 40 минут (он замедляется для некоторых случайных секунд). Чтобы узнать причину, я сломал вещи.Почему многопоточная программа python работает медленнее на ec2 micro-instance?

  1. Во-первых, это как мой оценщик работает:

    • У меня есть основной программы worker.py, который создает несколько потоков
    • Основной поток вытягивает представления (10 в то время) из файла (на время) и помещает их в глобальную очередь
    • Боковые потоки принимают подзапросы из очереди (одно представление оценивается исключительно одной нитью)
    • Af тер боковой поток принимает представление он посылает его в функцию compile, которая возвращает исполняемое представление назад в эту тему
    • Затем поток передает этот исполняемый файл в функцию run, которая запускает исполняемый (с использованием песочницы с определенной памятью и временные рамки) и записывает вывод исполняемых в файл, а затем проверяют его
      против стандартного вывода
    • После того, как очередь становится пустым основной поток снова тянет 10 представлений и помещает их в очереди

  2. Функции compile и run:

    • Функция компиляции и запуска функции сохранения исполняемого файла и вывод в файлы (repectively) под названием как <thread_Name>.exe и <thread_Name>.txt так, что каждая нить имеет свои собственные файлы и нет вопрос перезаписи.
    • Поток идет запустить функцию только тогда, когда состояние из функции компиляции было в порядке (файл компилируется) в противном случае броски ошибки компиляции для , что представление

  3. Теперь сомнения у меня есть:

    • Является ли проблема медленного выполнения на ec2 из-за ресурсов, которые у него есть или из-за , для многопоточности python. В моих сценариях потоки для доступа к глобальным переменным , такие как очередь (i put locks) и test.py(I dont put lock on it), который в функции проверяет выход со стандартным выходным символом по символу (vimdiff like), и mysandbox.py(libsandbox the sandbox) и некоторыми другими глобальными переменными. Так же работает медленная работа из-за GIL python. Если это , тогда почему работайте быстро на моей локальной машине.
    • Также на данный момент я даю тот же файл test.cpp(adds two numbers and prints result) 1000 раз. Поэтому, когда я намеренно делаю ошибку компиляции в этом файле и запускаю мою основную программу на ec2, она работает довольно быстро.Из этого я пришел к выводу, что компиляция и и запуск (компиляция и запуск функций) моей программы занимают основное время, а не поток создания и управления.

Я знаю его обширный вопрос, но любая помощь очень ценится (или мне придется держать Баунти на это пари всю свою репутацию :)).

ответ

2

Микроустановки становятся чрезвычайно медленными для постоянных вычислительных задач (по дизайну).

Вы написали свой код, чтобы быть многопоточным, чтобы использовать все ресурсы центрального процессора для задач, таких как поиск и компиляция файлов, что является хорошей практикой для производительности.

И хотя это имеет смысл на физической машине или виртуальных машинах, где у вас есть , предоставляется запасных ресурсов оборудования, это не имеет смысла на микро-экземпляре из-за того, как ресурсы выделяются Amazon.

Per Amazon's documentation, микро экземпляры предназначены только для операций короткого лопнуть процессора и, следовательно, будут испытывать огромные узкие места, налагаемые самой Амазонки, если вы пытаетесь использовать несколько потоков, которые съедают использование CPU:

Если приложение потребляет больше чем ресурсы ресурсов вашего экземпляра, мы временно ограничиваем экземпляр так, чтобы он работал на низком уровне процессора. Если ваш экземпляр продолжает использовать все выделенные ресурсы, его производительность будет ухудшаться. Мы увеличим время, в течение которого мы ограничим его уровень ЦП, тем самым увеличив время до того, как экземпляр сможет снова всплыть.

Взгляните на графики использования ЦП в документации, к которой я только что связался, чтобы получить более подробную информацию.

Чтобы убедиться, что это проблема, вы можете просто запустить небольшой экземпляр вместо этого и запустить свое программное обеспечение для судей там - вы должны испытать резкое улучшение, подобное вашему настольному компьютеру.

TL; DR При попытке использовать устойчивый процессор на микроэкземпляре он может стать менее мощным, чем старый Palm Treo.

+1

да! обновленный до среднего сделал огромную разницу спасибо :) –

+0

Рад это услышать. Если вы хотите сэкономить деньги, вы можете использовать небольшой, а не средний - все равно быть довольно быстрым и половину цены. –

Смежные вопросы