0

継続的に実行されるマルチプロセスPHP(CLI)アプリケーションがあります。各プロセスで使用されるメモリの量によって、いつでも実行できるフォークの数が制限されるため、メモリ使用量を最適化しようとしています(使用可能なメモリの量には限りがあるため)。私はいくつかのアプローチを試しました。たとえば、preinheimerからのアドバイスに従って、PHPを再コンパイルし、すべての拡張機能を無効にしてから、アプリケーションに必要な拡張機能(mysql、curl、pcntl、posix、およびjson)のみを再度有効にしました。ただし、これによってメモリ使用量が減少することはありませんでした。実際にはわずかに増加しました。

私はマルチプロセスアプローチを放棄する準備がほぼ整っていますが、メモリ使用量を削減する方法について他の誰かがより良いアイデアを持っているかどうかを確認するために最後の努力をしています。アプリケーションの大幅なリファクタリングを含む代替アプローチを以下に投稿します。

私がこの挑戦に取り組むのを手伝ってくれる人に前もって感謝します!

4

1 に答える 1

0

マルチプロセス PHP アプリケーション (例: を使用して自分自身を fork するアプリケーションpcntl_fork()) は、各子プロセスが php 実行可能ファイルのコピー全体をメモリにロードするため、メモリの点で本質的に非効率的です。これは、プロセスごとに 10 MB 以上のメモリに相当する可能性があります (アプリケーションによって異なります)。拡張機能を共有ライブラリとしてコンパイルすると、理論的にはメモリ フットプリントが削減されるはずですが、これでの成功は限られています (実際、これを試みたところ、未知の理由でメモリ使用量が悪化しました)。

より良いアプローチは、マルチスレッドを使用することです。このアプローチでは、アプリケーションは単一のプロセスに常駐しますが、複数のアクションを別々のスレッドで *同時に**実行できます (つまり、マルチタスク)。伝統的に、PHP はマルチスレッド アプリケーションには理想的ではありませんでしたが、最近、いくつかの新しい拡張機能により、PHP でのマルチスレッドがより実現可能になりました。たとえば、 PHP のマルチスレッドに関する質問に対するこの回答を参照してください (受け入れられた回答はかなり古くなっています)。

上記の問題については、pthreadsを使用してアプリケーションをマルチスレッド アプリケーションにリファクタリングする予定です。これにはかなりの量の変更が必要ですが、(うまくいけば) アプリケーションの全体的なアーキテクチャがはるかに効率的になります。私はこの回答を更新し、同様のことをしたい他の人のためにいくつかのリファクタリングの例を提供します。他の人は自由にフィードバックを提供し、コード例でこの回答を更新してください!

*同時実行に関する脚注: マルチコア マシンを使用しない限り、アクションは実際には同時に実行されません。ただし、それらは異なる小さなタイム スライスで CPU で実行されるようにスケジュールされます。ユーザーの観点からは、それらは同時に実行されているように見えます。

于 2013-02-22T09:08:08.590 に答える