web-dev-qa-db-ja.com

相対的な予想タスク時間をスケジュールに組み込むビルドシステムはありますか?

これが私の質問の小さなイラストです:

A-Dという名前の4つの独立したタスクで構成されるビルドジョブを想定します。 DはA-Cよりも時間がかかります。

相対的なタスク時間を組み込むことができないビルドシステムでは、次のようにタスクをスケジュールできます。

---------------------------------------
CPU1: A  |    C   |
---------------------------------------
CPU2: B    | D                        |
---------------------------------------

対照的に、スケジューラーがタスクの時間差を認識している場合は、次のはるかに短いスケジュールが考えられます。

---------------------------------------
CPU1: A  |  B    |   C   |
---------------------------------------
CPU2: D                        |
---------------------------------------

私の質問:

  1. 相対的な予想タスク時間をスケジュールに組み込むビルドシステムはありますか?
  2. この種のビルドシステムに関する学術的な研究は何ですか?
  3. これらのビルドシステム(存在する場合)はどこから時間情報を取得しますか?ヒューリスティック、以前のビルド中に収集されたタイミング?
  4. そのようなビルドシステムが存在しない場合、なぜですか?一見しただけで見た目より価値のあるものにならない落とし穴はありますか?
13
sjakobi

Microsoft Visual Studio Team System(以前のTFS)は、ビルドアクション時間と並列ビルドを考慮しています。以前のビルド履歴からデータを取得します。必要な動作をそのまま使用できるとは思いませんが、カスタマイズできる場合があります。

パフォーマンスの最適化に取り組むいくつかのカスタムタスクの例

https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/

3
Bruno Guardia

これは、タスクの「ビルド」が非並列であるという誤った仮定に基づいています。

多くのコンパイラはマルチスレッドで動作するため、単一のタスクAがすべてのCPUを使用します。したがって、順序は関係ありません。特にネットワーキングを含むI/Oバウンドタスクの場合は、最初からすべてを並行して開始することをお勧めします。ほとんどの時間は、応答を待つために費やされます。

つまり、個々のタスクは通常並列化されているため(たとえば、コンパイルなど)、順序は関係ありません。


編集:

実際、この「CPU 1のタスクA」の概念にも欠陥があります。シングルスレッドタスクの場合でも、プロセス/スレッドをスケジュールするOSは、各コンテキストスイッチでCPUからCPUにそれをホップすることがあります。ほとんどのビルドシステムはすべてのタスクを並行して実行し、OSにスケジューリングを任せると思います。タスクが長いほど時間がかかりますが、それだけです。

I/Oバウンドではない長時間実行されるシングルスレッドタスクがあると仮定すると、ビルドシステムに優先度/重要度を割り当てる方がはるかに簡単です。むしろ、OSからのコンテキスト切り替えを減らすために、より小さなタスクを遅らせることを試みます。

このようなstrangeタスクがある場合でも、これは実際には非常にまれであり、以前の実行に基づいてヒューリスティックに動作する豪華なスケジューリングビルドシステム(知る唯一の方法)、それから得られる利点はかなり小さいかもしれません...しかし、維持するために追加された複雑さの束を得ます。

0
dagnelies