Windows Server 2003 Service Pack 2で実行されているWin32コンソールアプリケーションの中には、次の場合に定期的に失敗するものがあります。
エラー1450(
ERROR_NO_SYSTEM_RESOURCES
):「要求されたサービスを完了するのに十分なシステムリソースが存在しません。」
私たちが見つけたすべてのドキュメントは、それが不足している無料のシステムページテーブルエントリの数にリンクされていることを示唆しています。これらのマシンには16GBのRAMがあり、/3GB
オペレーティングシステムスイッチを使用してWindowsカーネルを1GBに圧縮し、プロセスが3GBのアドレス空間にアクセスできるようにします。これにより、空きシステムページテーブルエントリの総数が大幅に減少するため、MapViewOfFile()を多用することと組み合わせると、カーネルページテーブルエントリが不足していることはおそらく驚くべきことではありません。
ただし、パフォーマンスモニターを使用して[空きシステムページテーブルエントリ]カウンターを表示する場合、値は再起動時に約36,000であり、アプリケーションの起動時に低下しません。多くの大きなメモリマップファイルを開くアプリケーションがカーネルページテーブルに影響を与えないとは信じがたいです。カウンターが信じられない場合は、システムの変更による影響をテストするのがはるかに困難になります。
有望なナレッジベースの記事があります。パフォーマンスツールは、Windows Server 2003で利用可能な無料のシステムページテーブルエントリを正確に表示しませんが、問題はService Pack 1で修正されており、すでにServicePack2を使用しています。
他の誰かがこの問題に苦労したり解決したりしましたか?
更新: windbg(カーネルのデバッグ)で!sysptesをチェックしましたが、値はパフォーマンスカウンターと一致し、約36,000です。これは、実際には多くの空きページテーブルエントリがあり、Windowsが真実を語っていることを意味している可能性が高いと思います。PTEが不足していないのに、なぜ1450エラーが発生するのかという疑問が残ります。
さらなる更新: 1450エラーが発生した理由の根底に到達することはありませんでした。 ただし、代わりに、これらのサーバーのOSを64ビットWindowsにアップグレードしました。これにより、既存の32ビットアプリケーション(再コンパイルなし)が4 GBの仮想アドレス空間全体にアクセスできるようになり、厄介なページテーブルエントリを含むカーネルメモリ領域も必要なだけ大きくなります。それ以来、1450エラーは発生していないと思います。