私の問題:スレッドがTIMED_WAIT
状態(寝ていない)のとき待機中のスレッドのリソース消費
は、JVM内のスレッドの多くは、リソース(メモリ、CPU)を大量に消費するん>時間の99.9% ?スレッドが待機しているときに、必要なものがあれば、どれくらいのCPUオーバーヘッドを維持するのにかかるコストがかかりますか?
答えはJVM以外の環境(Linuxカーネルなど)にも当てはまりますか?
コンテキスト:
私のプログラムは、スペースを消費する多数のパッケージを受け取ります。これは、異なるパッケージ内の類似の属性の数を格納します。パッケージを受け取ってから一定時間後(数時間または数日かかる可能性があります)、その特定のパッケージは期限切れとなり、パッケージの提供数は減るべきです。
現在、私はすべてのパッケージをメモリまたはディスクに保存することでこれらの機能を実現しています。 5分ごとに、期限切れのパッケージをストレージから削除し、残りのパッケージをスキャンして属性を数えます。この方法では大量のメモリが使用され、時間の複雑さが犠牲になります(時間とメモリにはO(n)
、nは有効期限が切れていないパッケージの数です)。これにより、プログラムのスケーラビリティがひどくなります。
この問題にアプローチする別の方法の1つは、パッケージが到着するたびに属性カウントをインクリメントし、パッケージの有効期限が切れた後に属性数を減らすスレッドを開始することです(Timer()
)。これにより、嵩張ったパッケージをすべて保管し、時間の複雑さをO(1)
に削減する必要がなくなります。しかし、私のプログラムではスレッド数がO(n)
になり、パフォーマンスが低下する可能性があるため、別の問題が発生します。ほとんどのスレッドはTIMED_WAIT
状態(JavaのTimer()
はObject.wait(long)
メソッドを呼び出します)のライフサイクルの大部分を占めているため、CPUに非常に大きな影響を与えますか?
考えているスレッドはいくつありますか?何百もの人が、スレッドのチェックやスケジューリングが必要なときにカーネルに課金するのではないかもしれませんが、もし500+をキューに入れているなら、あなたのアプローチを再検討したいかもしれません。 – txtechhelp
私はおそらく数百人以上あります。カーネルが 'TIMED_WAIT'のスレッドを常にチェックしなければならない理由を説明してください。私は、カーネルがこれを具体的にどのようにしているかについての情報を見つけようとしましたが、望ましい情報は見つかりませんでした。 – PhotometricStereo
ScheduledExecutor /単一スレッドでの有効期限のタイムスタンプ別の優先度キュー。 – zapl