Ninja: Ninjaには、CreateProcessではなくIPCを介してコンパイルをトリガーする方法が必要です。

作成日 2019年08月23日  ·  6コメント  ·  ソース: ninja-build/ninja

WindowsでのCreateProcessは、最良の場合は低速であり、Chrome開発者は、最良の場合ではないことに気付くことがよくあります。 Chromeビルドで過去数年間に対処されたプロセスの作成/破棄の問題には次のものがあります。

  1. Chromeビルドは、プロセスの破棄中にUserCritロックの競合にぶつかり、Windowsのリグレッションにより、ビルドの速度が低下し、gomaビルド中にマウスが大幅に途切れます。 Windowsで修正され、修正は最終的にすべての関連するWindows 10ビルドに伝播されました(https://randomascii.wordpress.com/2017/07/09/24-core-cpu-and-i-cant-move-my-mouse/)
  2. Chromeビルドは、プロセスの破棄中にUserCritロックの競合にぶつかり、gomacc.exeが間接的にgdi32.dllをプルするため、ビルドの速度が低下し、gomaビルド中にマウスが大幅に途切れます。 gdi32.dllを回避することでgomaccで修正されました。
  3. マルウェア対策ソフトウェアにより、CreateProcessで最大11ミリ秒のリグレッションが発生し、完全なChromeビルドを最大10分より速くすることができなくなり、すべてのビルドが遅くなりました。 このマルウェア対策ソフトウェアを無効にすることで修正されました。
  4. 正しく無効にされていないか、無効にされてもオーバーヘッド(MsMpEng.exe)がある他のマルウェア対策ソフトウェアを含む、問題番号3の少なくとも2つのバリエーション。
  5. Chromeのビルドでのプロセス作成率が高いと、SCCMでバグが発生し、ゾンビプロセスが発生し、最終的に最大32 GBのメモリが失われました(https://randomascii.wordpress.com/2018/02/11/zombie-processes-are-思い出を食べる/)
  6. gomacc.exeのAppVerifierを有効にして、時折発生するヒープの破損を調査すると、ログファイルの作成でO(n ^ 2)のパフォーマンスの問題が発生します(https://randomascii.wordpress.com/2018/10/15/making-windows-slower-パート-2-プロセス作成/)

Chromeビルドに影響を与えなかったその他のプロセスの作成/破棄の問題は次のとおりです。

  1. Chromiumの大規模なテストバイナリがWindowsでO(n ^ 2)CFGパフォーマンスのバグにヒットし、unit_tests.exeがWindows 10の場合の約5倍の時間がかかるようになりました。テストバイナリ(https:// randomascii)でCFGを無効にすることで修正されました。 wordpress.com/2019/04/21/on2-in-createprocess/)
  2. clang-cl単体テストは、プロセスの破棄中にUserCritロックの競合にぶつかり、Windows 10でのテストの5倍の時間がかかり、マウスが大幅に途切れる原因になります。 gdi32.dllのプルを回避することで修正されました。

現在、これらの問題はすべて軽減されていますが、MsMpEng.exeを除いて、すべてが除外されたフォルダーにある場合でも、ゼロ以外のオーバーヘッドが発生します。 ただし、すべてのChrome開発者のマシンを適切に構成し続けるために継続的な努力が必要であり、適切なビルドパフォーマンスを維持するために必要な多くの除外のために、セキュリティがいくらか失われます。 これらの問題を検出して調査するための継続的な取り組みもあります。

ある時点で、CreateProcess風車で傾ける価値がなくなり、代わりにCreateProcessを頻繁に呼び出すことを避けます。 ninja.exeは、ビルド中にCreateProcess呼び出しの99%を回避するために、IPCを使用してコンパイルプロセスのプール(gomaおよび/またはclang-cl)を管理するローカルサーバープロセスと通信する方法を教えることができます。

これを行うと、CreateProcessのCPUコストが削減され、忍者のシリアル化されたクリティカルパスからCreateProcessが削除され、より少ない除外でより多くのセキュリティモニタリングが有効になり、将来のリグレッションのコスト(調査時間とビルド時間)から節約できます。 。

あるいは、忍者はCreateProcessをマルチスレッド化することもできますが、これは完全なソリューションではありません。

忍者でCreateProcessからIPCに切り替えることは明らかに正しいことではありませんが、議論する価値があります。 プロトタイプが作成されたので、テスト結果をここで共有する必要があります。

全てのコメント6件

ライブラリ化するNinjaを使用すると、インターフェイスクラスから派生してプロセス作成の動作をカスタマイズするなど、必要な動作をより簡単に注入できるようになります。

当然のことながら、私はこれに強く反対します。 Ninjaは、ビルド環境が正常であることを前提としたシンプルなビルドシステムです。 敵対的なビルド環境を想定している可能性のある異なるデザインのビルドシステムは他にもありますが、忍者はそのシステムではありません。

忍者の現在のデザインは、修正する価値のある多くのバグを特定するのに役立つようです。 これは機能だと思います。

@nico 、私はこの問題についてのあなたの意見に強く反対します。

まず、Ninjaは、Chromeプロジェクトのコンパイル時間を改善するためのツールとしてスタートしました。 http://neugierig.org/software/chromium/notes/2011/02/ninja.html

今、あなたはchromeプロジェクトのコンパイル時間を改善する方法について話している誰かに彼らの貢献は歓迎されないことを伝えています。

Ninjaは、最初にグラフ実行ライブラリで、次にビルドツールである場合、IPCを使用してビルドジョブを実行することに簡単に対応

さらに、このような高度なバグレポートをめったに見ないプロジェクトの「保守者」として(実際のコードをフォローアップするという暗黙の約束があります)、トピックについてまったく議論せずにこれを閉じるのはかなりばかげていますが、未解決のまま残っている189の他の問題、8歳もの古いものもあります。

そしてもちろん、Windowsを敵対的なビルド環境と呼ぶことは真実かもしれませんが、貢献を無視することの正当な理由ではありません。 Windowsは今でも最も広く使用されている開発オペレーティングシステムの1つであり、それを無視することはせいぜい不誠実です。

@nicoNinjaプロジェクトから離れることをお勧めします。 数か月でのあなたの唯一の行動は、追求されてきた問題と解決策を説明する大量の文書とともに、洗練された貢献を却下することです。

@randomasciiここであなたが話しているような貢献が忍者に統合されるのを見てうれしいです。 私の最後の職場では、このようなIPCメカニズムによって、ビルドごとに少なくとも数分短縮できたのではないかと強く思っています。これはすばらしいことです。

コンパイルプロセスのプールがどのように管理されるかについて詳しく説明していただけますか? Windowsには、プロセスを再利用して他の何かを実行できるメカニズムがありますか? それとも、コンパイラプロセスが再利用可能である必要がありますか?

私の理解では、同僚は忍者とIPCのプロトタイプを持っています。

これ以上議論せずにこれを閉じることについての私の主な懸念は、セキュリティのトレードオフについて議論する機会を逃していることです。 CreateProcessのコスト/シリアル化を軽減する方法のほとんどは、さまざまなセキュリティチェックを無効にすることです。 私はそれらのチェックの価値についての専門家ではありませんが、専門家である人々にそれらを可能にすることができることの利点について検討してもらうことは有益かもしれません。

実装について話し合うことができるように、同僚がここgithubでプロトタイプを使用してプルリクエストを送信することをお勧めします。

このページは役に立ちましたか?
0 / 5 - 0 評価