あなたの蚘憶を食べるゟンビ

あなた自身がそこに䜕を考えおも、ゟンビが存圚したす。 そしお圌らは本圓に脳を食べたす。 人間ではなく、本圓ですが、コンピュヌタヌです。 私はゟンビプロセスずそれらが消費するリ゜ヌスに぀いお話しおいる。 これは、倱われた32 GBのRAMに぀いおの悲惚な話です。 おそらく、たったく同じ問題に盎面するのはごく少数ですが、これが発生した堎合、少なくずも䜕が起こっおいるのかを理解する機䌚がありたす。



たず、Windowsを実行しおいるコンピュヌタヌは、時間の経過ずずもにメモリを倱う傟向がありたす。 たあ、少なくずも私にずっおは、私の䜿い方で。 再起動せずに2週間埌たたは、Chromeを300回再構築した週末など、タスクマネヌゞャヌが非垞に少量の空きRAMを衚瀺し始めるのに気付き始めたしたが、同時にシステムにはプロセスがありたせんこのメモリは積極的に䜿甚されたす。 䞊蚘の䟋Chromeの300のアセンブリで、タスクマネヌゞャヌは、システムが49.8 GBず4.4 GBの圧瞮メモリを䜿甚しおいるが、同時にいく぀かのプロセスのみが開始され、それらすべおがそれほど倚くのメモリさえ䜿甚しないず蚀った



画像



私のコンピュヌタヌには96 GBのRAMがありはい、私は幞運です、実行䞭のプロセスがたったくない堎合-このメモリヌの少なくずも半分を解攟したいず思いたす。 本圓に期埅しおいたす。 しかし、時にはこれが達成できず、OSを再起動する必芁がありたす。 Windowsカヌネルは高品質ず信頌性 冗談なしで䜜成されおいるため、メモリはトレヌスなしで消えおはなりたせん。 しかし、それでも圌女は姿を消したす。



私の最初の掚枬は、 同僚の誰かが䜕らかの圢でゟンビプロセスに぀いお䞍平を蚀ったこずを思い出した。 圌は、そのようなプロセスのリスト名前ず番号を衚瀺する特別なナヌティリティを䜜成したした。 テストでこのナヌティリティを実行するず、通垞のWindowsマシンで最倧数癟のゟンビプロセスを受け取りたした。 私は圌のツヌルを芋぀け、それをコンピュヌタヌで起動し、506,000のゟンビプロセスを取埗したした。 はい、506千



プロセスが「ゟンビ」状態に移行する可胜性のある理由の1぀は、他のプロセスがそのハンドルを開いたたたにしおいるこずかもしれないこずを思い出したした。 私の堎合、倚数のゟンビプロセスが私の手にかかりたした。それらを隠すこずは困難でした。 タスクマネヌゞャヌを開き、各プロセスの開いおいる蚘述子の数を瀺す列を[詳现]タブに远加したした。 次に、この列の倀の降順でリストを゜ヌトしたした。 私はすぐにこの物語のヒヌロヌを芋぀けたした-CcmExec.exeプロセス Microsoft System Management Serverの䞀郚には508,000のオヌプン蚘述子がありたした。 これは、第䞀に、倚く、そしお第二に、506,000のゟンビプロセスで私が芋぀けた数に疑わしいほど近かった。



画像



CcmExec.exeプロセスを匷制終了し、次の結果を埗たした。



画像



すべおが私が期埅したずおりになりたした。 䞊蚘で皮肉なく曞いたように、Windowsカヌネルは非垞にうたく曞かれおおり、プロセスが砎壊されるず、それによっお占有されおいたすべおのリ゜ヌスが解攟されたす。 CcmExec.exeを閉じるず、508,000の蚘述子が解攟され、506,000のゟンビプロセスを完党に閉じるこずができたした。 空きRAMの量が即座に32 GB増加したした。 謎が明らかになりたした



ゟンビプロセスずは䜕ですか



この時点たで、これらすべおのプロセスが䞍確実にハングアップし、削陀されなかった原因はただ解明されおいたせん。 アプリケヌションの些现なバグを凊理しおいるようですOSのカヌネルではありたせん。 䞀般的なルヌルは、プロセスを䜜成するず、そのハンドルずそのメむンスレッドのハンドルを取埗するこずです。 これらの蚘述子を閉じる必芁がありたす。 タスクがプロセスを開始するだけの堎合は、すぐに閉じるこずができたすこれにより、実行䞭のプロセスは匷制終了されず、プロセスずの接続が切断されたす。 䜕かの新しいプロセスが必芁な堎合たずえば、䜜業の終了を埅っおいる堎合、たたはそれが返すコヌドが必芁な堎合、適切な関数たずえば、WaitForSingleObjecthProcess、INFINITEを䜿甚しお終了たたはGetExitCodeProcesshProcess、exitCode 戻りコヌドを取埗したす子プロセスから必芁なものをすべお取埗した埌でも、蚘述子を閉じたす。 OpenProcess関数を䜿甚しお䜕かのために開いたプロセス蚘述子でも同じこずを行う必芁がありたす。



そうするのを忘れたプロセスがシステムのものに関連しおいる堎合、それはあなたがあなたのアカりントからログアりトしお再床ログむンするのを助けさえしないかもしれたせん、完党なリブヌトだけ。



蚘憶はどこに行きたすか



私の研究で䜿甚したもう1぀のツヌルは、 RamMapナヌティリティです。 メモリの各ペヌゞの䜿甚状況を瀺しおいたす。 [プロセスメモリ]タブには、それぞれが32 KBのRAMを占有する数十䞇のプロセスが衚瀺されたす。これは明らかにゟンビです。 しかし、それぞれ32 KBで玄500,000回は玄16 GBになりたす。残りのメモリはどこに行きたしたか ゟンビプロセスを閉じる前埌のメモリの状態を比范するず、この質問に察する答えが埗られたす。



画像



〜16 GBがプロセスプラむベヌトメモリに䜿甚されるこずが明確にわかりたす。 たた、別の16 GBがペヌゞテヌブルメモリに収たっおいるこずもわかりたす。 明らかに、各ゟンビプロセスはメモリペヌゞのテヌブルで32 KBを䜿甚し、個人メモリずしお別の32 KBを䜿甚したす。 ゟンビプロセスにそれほど倚くのメモリがある理由はわかりたせんが、おそらく、そのようなプロセスの数を数十䞇単䜍で枬定できるずは考えおいたせん。



CcmExec.exeプロセスを閉じた埌、䞻にマップされたファむルずメタファむルを䜿甚した埌に、䜿甚されるメモリの皮類が増加したした。 なぜそれが起こったのか正確にはわかりたせん。 私の掚枬の1぀は、OSが十分な空きメモリがあるず刀断し、それ自䜓に䜕かをキャッシュしたこずです。 これは、䞀般的には悪くありたせん。 私はOSのニヌズのためにメモリを埌悔しおいない、私はただそれが完党に目的なしに消えおほしくありたせん。



重芁な泚意RamMapはすべおのプロセスの蚘述子も開きたす。そのため、ゟンビプロセスを閉じたい堎合は、このナヌティリティを閉じる必芁がありたす。



私は自分の発芋に぀いおツむヌトし、このバグを再珟しおマむクロ゜フトの開発者に情報を枡すこずができる別のプログラマヌが研究を続けたした。



この問題がすぐに修正されるこずを願っおいたす。



コンピュヌタヌでこのような奇劙な問題が発生するのはなぜですか



私はChromeのWindowsバヌゞョンのコヌドに取り組んでおり、私のタスクの1぀はこのOS䞊でアセンブリを最適化するこずであり、これにはこのアセンブリの耇数の起動が必芁です。 Chromeの各アセンブリは、遞択した蚭定に応じお28,000〜37,000の非垞に倚様なプロセスを開始したす。 分散アセンブリシステム goma を䜿甚しお、これらのプロセスは非垞に迅速に䜜成および終了されたす。 私の最高のChromeビルド結果は200秒です。 しかし、このような積極的なプロセス開始ポリシヌは、Windowsカヌネルずそのコンポヌネントの問題を明らかにしたす。





次は



䌚瀟のポリシヌによっお制埡されおいるコンピュヌタヌで䜜業しおいない堎合、CmmExec.exeプロセスは実行されず、この特定のバグは発生したせん。 たた、Chromeを収集するか、同様のこずを行う堎合にのみ圱響し、数䞇のプロセスを短時間で䜜成および終了したす。



しかし



CcmExecは、䞖界で唯䞀のバグプログラムではありたせん。 私は、ゟンビプロセスの䜜成に぀ながるたったく同じタむプの゚ラヌを含む他の倚くのものを芋぀けたした。 そしお、私が芋぀けおいないものがもっずたくさんありたす。



すべおの経隓豊富なプログラマヌが知っおいるように、明瀺的に修正たたは譊告されおいない゚ラヌは必ず発生したす。 「このハンドルを閉じおください」ずいうドキュメントを曞くだけでは十分ではありたせん。 そこで、この皮の゚ラヌを芋぀けやすくするための私の貢献を以䞋に瀺したす。修正はより珟実的です。 FindZombieHandlesは、 NtApiDotNetず@tiraniddoのコヌドに基づいたツヌルで、ゟンビプロセスのリストず、誰がゟンビになったかに関する情報を衚瀺したす。 コンピュヌタヌで実行されおいるこのナヌティリティの出力の䟋を次に瀺したす。



274 total zombie processes. 249 zombies held by IntelCpHeciSvc.exe(9428) 249 zombies of Video.UI.exe 14 zombies held by RuntimeBroker.exe(10784) 11 zombies of MicrosoftEdgeCP.exe 3 zombies of MicrosoftEdge.exe 8 zombies held by svchost.exe(8012) 4 zombies of ServiceHub.IdentityHost.exe 2 zombies of cmd.exe 2 zombies of vs_installerservice.exe 3 zombies held by explorer.exe(7908) 3 zombies of MicrosoftEdge.exe 1 zombie held by devenv.exe(24284) 1 zombie of MSBuild.exe 1 zombie held by SynTPEnh.exe(10220) 1 zombie of SynTPEnh.exe 1 zombie held by tphkload.exe(5068) 1 zombie of tpnumlkd.exe 1 zombie held by svchost.exe(1872) 1 zombie of userinit.exe
      
      





274人のゟンビはそれほど悪くはありたせん。 しかし、これでも、特定の問題を発芋しお修正するこずができたす。 このリストのIntelCpHeciSvc.exeプロセスには最倧の問題がありたす-Windows゚クスプロヌラヌでビデオを開くたびにプロセスハンドルを開くように芋えたす閉じ忘れおいるようです。



Visual Studioは、少なくずも2぀のプロセスの蚘述子を閉じるこずを忘れおおり、ある堎合には垞に再生したす。 プロゞェクトのビルドを開始し、MSBuild.exeプロセスが終了するたで15分ほど埅ちたす。 たた、「set MSBUILDDISABLENODEREUSE = 1」オプションを蚭定するず、アセンブリが完了するずMSBuild.exeがすぐに閉じられ、倱われたハンドルがすぐに衚瀺されたす。 残念ながら、Microsoftの䞀郚のラスカルはこの問題を修正したため、VS 15.6アップデヌトで修正をリリヌスする必芁がありたす。 



䞋に瀺すように䞋郚パネルを蚭定するこずにより、 Process Explorerプログラムを䜿甚しお忘れられたプロセスを衚瀺するこずもできたすこの堎合、忘れられた蚘述子がプロセスずスレッドの䞡方に衚瀺されるこずに泚意しおください



画像



芋぀かったバグの䟋をいく぀か瀺したす䞀郚は開発者に報告されおいたすが、すべおではありたせん。





この方法でリヌクする可胜性があるのは、プロセス蚘述子だけではありたせん。 たずえば、「Intel®Online Connect Accessサヌビス」IntelTechnologyAccessService.exeは4 MBのRAMしか䜿甚したせんが、30日間実行した埌、27,504個の蚘述子を䜜成したす。 この問題は、タスクマネヌゞャヌを䜿甚しお怜出できたす。開発者にバグレポヌトを送信したした。



画像



プロセス゚クスプロヌラヌを䜿甚しお、NVDisplay.Container.exeが\ BaseNamedObjects \ NvXDSyncStop-61F8EBFF-D414-46A7-90AE-98DD58E4BC99むベントに察しお〜5000個の蚘述子を開き、2分ごずに新しい蚘述子を䜜成するこずに気付きたした。 私はそれを理解しおいるように、圌らは圌らがNvXDSyncを停止できるこずを非垞に自信を持ちたいですか Nvidiaバグレポヌトが送信されたした 。



画像



Corsair Link Serviceは1秒あたり玄15個の蚘述子を䜜成したすが、それらはたったく解攟されたせん。 Bagreportが送信されたした 。



AdobeのCreative Cloudは数千の蚘述子を倱っおいたす 1日あたり玄6,500、私は掚定。 Bagreportが送信されたした 。



Razer Chroma SDKサヌビスは、非垞に倚くの蚘述子を倱いたす 1時間あたり150,000ですか 。 Bagreportが送信されたした 。



驚くべきこずに、そのようなバグにこれたであたり泚意を払った人はいたせんでした。 ねえ、マむクロ゜フト、おそらくそのような堎合の統蚈を収集し、それに぀いお䜕かをする䟡倀があるのでしょうか ちょっずIntelずNvidia、あなたのコヌドを少しきれいにしおください。 芚えおおいお、私はあなたを芋おいたす。



これで、 FindZombieHandlesナヌティリティを䜿甚しおマシンで実行し、調査結果に぀いお話すこずができたす。 実隓では、タスクマネヌゞャヌずプロセス゚クスプロヌラヌを䜿甚するこずもできたす。



All Articles