4

ruby-head と Debian wheezy x64 を使用しています。マルチスレッドの Ruby スクリプトを実行すると、htop は複数のコアを視覚的に使用しており、上部にバーが表示され、プロセス リストでは 100% の CPU を使用しているが、1 つのコアの容量の 100% しか使用していないことが示されます。複数のコアを 100% で実行することは可能だと思いますが、この数値はプログラム ロジックまたは別のハードウェアの側面によってボトルネックになるにはあまりにも便利なようです。使用している使用可能な命令の量が OS によって制限されていますか?

詳細情報を編集:

複数のコアを視覚的に使用することを意味する場合: 47% のコア 1、29% のコア 2、および 24% のコア 3。これらのパーセンテージは常に上下に変化し、コアの異なるセットに変化しますが、常に合計すると 100%-102 になります。 %。3 (/8 合計) を超えるコアが使用されていますが、最も負荷の高い 3 つのコア以外のコアは 2% 以下の容量しか使用していません。これは Linode VPS であることも言及する必要があると思います。

編集:

どうやら、実際のリリース情報ではなく、2.0 が真の並列スレッドを備えているという約束を読んでいたようです。Jruby に切り替える時が来ました...

4

2 に答える 2

10

どの Ruby 実装を使用しているかについて言及できませんでした。すべての Ruby 実装が Ruby スレッドを複数の CPU にスケジューリングできるわけではありません。

特に:

  • MRI は Ruby スレッドをインタープリター内のグリーン スレッドとして実装し、それ自体をスケジュールします。一度に複数のスレッドをスケジュールすることはできず、それらを複数の CPU にスケジュールすることもできません
  • YARV は Ruby スレッドをネイティブ OS スレッド (POSIX スレッドまたは Windows スレッド) として実装し、OS がそれらをスケジュールできるようにします。
  • Rubinius は、Ruby スレッドをネイティブ OS スレッド (POSIX スレッドまたは Windows スレッド) として実装し、OS がスレッドをスケジュールできるようにしますが、それらの周りにグローバル インタープリター ロック (GIL) を配置するため、常に 1 つの Ruby スレッドしか実行できません。Rubinius 2.0 では、いつでも複数の Ruby スレッドを実行できるように、きめの細かいロックが実装される予定です。
  • JRuby は Ruby スレッドを JVM スレッドとして実装し、きめ細かなロックを使用して複数のスレッドを実行できるようにします。ただし、これらのスレッドが複数の CPU にスケジュールされているかどうかは、使用されている JVM によって異なります。これを許可するものもあれば、許可しないものもあります。
  • IronRuby は Ruby スレッドを CLI スレッドとして実装し、細粒度のロックを使用して複数のスレッドを実行できるようにします。ただし、これらのスレッドが複数の CPU にスケジュールされるかどうかは、使用されている VES によって異なります。これを許可するものもあれば、許可しないものもあります。
  • MacRuby は、Ruby スレッドをネイティブ OS スレッドとして実装し、きめ細かなロックを使用して、複数のスレッドを複数の CPU で同時に実行できるようにします。

Topaz、Cardinal、MagLev、MRuby、その他すべてについて十分に知りません。

于 2013-10-10T00:15:20.457 に答える
4

MRI は、Ruby スレッドをインタープリター内のグリーン スレッドとして実装します。残念ながら、これらのスレッドを並行してスケジュールすることはできません。一度に 1 つのスレッドしか実行できません。

ここで同様の質問を参照してください

于 2013-10-09T21:51:20.903 に答える