2013-10-09 2 views
3

Я использую ruby-head и Debian wheezy x64. Когда я запускаю многопоточный скрипт ruby, htop показывает, что он использует несколько ядер визуально с барами наверху и что он использует 100% процессор в списке процессов, но использует только 100% емкости одного ядра. Я предполагаю, что можно использовать несколько ядер на 100%, и это число кажется слишком удобным для бутылочной сушки либо программной логикой, либо другим аппаратным аспектом. Является ли ОС ограничением количества доступных инструкций, которые я использую, если да, как это остановить?Многопоточная программа ruby ​​использует только 100% процессор

EDIT подробнее:

Когда я имею в виду визуально с использованием нескольких ядер, например: 47% ядра 1, 29% ядра 2, и 24% сердцевины 3. Эти проценты постоянно меняются вверх и вниз и к различным наборам но всегда вместе составляют до 100% -102%. Используется более 3 (/ 8) сердечников, но любые сердечники, кроме трех наиболее нагруженных, используют только 2% или менее. Думаю, я также должен упомянуть об этом - линейный VPS.

EDIT:

Ну это выглядит, как я читал обещание, что 2,0 будет правдивые параллельные потоки, а не фактическая информация релиза. Время для перехода на Jruby ...

ответ

9

Вы не упомянули, которые рубин реализации вы используете. Не все реализации Ruby способны планировать потоки Ruby для нескольких процессоров.

В частности:

  • МРТ реализует на Ruby тему, как зеленые потоки внутри интерпретатора и графики их сами; он не может планировать более одного потока за раз, и он не может планировать их для нескольких процессоров.
  • YARV реализует потоки Ruby как потоки ОС (потоки POSIX или потоки Windows) и позволяет ОС планировать их, однако он устанавливает блокировку виртуальной машины VM (GVL), так что только один поток Ruby может работать в любой момент времени
  • Rubinius реализует Ruby-потоки как потоки ОС (потоки POSIX или потоки Windows) и позволяет ОС планировать их, однако он ставит глобальный интерпретатор Lock (GIL) вокруг них, так что только один поток Ruby может работать в любой момент времени; Rubinius 2.0 будет иметь мелкозернистые блокировки, так что несколько потоков Ruby могут запускаться в любой момент времени.
  • JRuby реализует потоки Ruby как потоки JVM и использует мелкозернистую блокировку, позволяющую запускать несколько потоков; однако, независимо от того, запланированы ли эти потоки для нескольких ЦП, зависит от используемой JVM, некоторые из них позволяют это делать, некоторые из них не являются
  • IronRuby реализует потоки Ruby как потоки CLI и использует мелкозернистую блокировку, чтобы можно было запускать несколько потоков ; однако, независимо от того, запланированы ли эти потоки для нескольких ЦП, зависит от используемого VES, некоторые из них позволяют это сделать, некоторые из них не являются
  • MacRuby реализует потоки Ruby как собственные потоки ОС и использует мелкозернистую блокировку, одновременно работает на нескольких процессорах

Я не знаю достаточно о Топазе, Кардинале, Маглеве, Мрибу и всех остальных.

3

MRI реализует Ruby Threads как зеленые нити внутри своего интерпретатора. К сожалению, он не позволяет планировать параллельные потоки, они могут запускать только один поток за раз.

Смотрите похожий вопрос here

+0

Я думал, что ruby ​​2.0 исправил это.Также я не уверен, что ваш ответ имеет смысл, потому что я четко вижу, что OS отображает несколько ядер, которые используются. – wduncan

+0

Нет, [глобальная блокировка интерпретатора] (http://ablogaboutcode.com/2012/02/06/the-ruby-global-interpreter-lock/) в рубине - это большая работа, чтобы обеспечить совместимость с истинным многопоточным , – rudolph9

+1

Ах, извините. Похоже, я только читал обещания этой функции. Время переключиться на Jruby. – wduncan

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