web-dev-qa-db-ja.com

仮想メモリクリープを自動的にクリア/再起動する方法は?

これを行うのは良い習慣ではないことはわかっていますが、私の会社では、問題の適切な解決策を見つけることを試みる余裕はありません。私は this を読みましたが、SQL Server 2005でも同じことができましたが、もっと良い(より速い)方法があることを望んでいました。

問題は次のとおりです。

Windows Server 2003で実行されているASP.net Webサイト(ASP2)があり、SQL Server 2005データベースをホストしてインストールします。

最近、VM SQL Server 2005インスタンスのコミットされたメモリ領域が増加し、ほぼVM設定した予約領域になりました1.7 GB(うーん多すぎる?).

SQL Serverを実行しているPCサーバーには、4 GBのRAMおよびSQL Server 2005インストール用に最大3.5 GBの空きディスク領域があります。データベース自体は350 GBの共有にあります(これには2つのパーティションがあります:それぞれCドライブとDドライブ)。

したがって、VMスペースに関しては、十分なスペースがあると思い、VM制限を1.7 GB(理想的には2 GB)に設定すると十分でした。 。

データベース自体のサイズは500 MB未満です。

VMコミットされた値がVM予約済みの値に近づくと、サービスがかなり遅くなります。これを停止する唯一の方法は、すべてのSQLを停止することですサービスサービスとそれらを再起動します。しかし、24時間以内にVMコミット済みはまだ忍び寄ります!

問題の原因を見つけようとするだけで、すべてのサービスを夜間に自動的に再開する方法はありますか?それとも私は本当に私たちの問題の原因を見つけようとしているのでしょうか?

私はいくつかの調査を行いました(ただし、現時点では貧弱です)、このSQLクエリ(以下を参照)を見つけました。これにより、実際のクエリが独り占めしているように見えますほとんどのCPU(これが私の元のVM問題)と関係があるかどうかは不明です)。

それはたまたま夜通し実行される1つのクエリを示しており、このクエリは単にメモリを消費し、プールに解放していない可能性がありますか?

メモリが解放されるように、SQL Serverでスレッド/メモリ割り当てなどを「閉じる」方法はありますか?

CPUの「豚の検索」クエリは次のとおりです( this 提供)

select  
    highest_cpu_queries.plan_handle,  
    highest_cpu_queries.total_worker_time, 
    q.dbid, 
    q.objectid, 
    q.number, 
    q.encrypted, 
    q.[text] 
from  
    (select top 50  
        qs.plan_handle,  
        qs.total_worker_time 
    from  
        sys.dm_exec_query_stats qs 
    order by qs.total_worker_time desc) as highest_cpu_queries 
    cross apply sys.dm_exec_sql_text(plan_handle) as q 
order by highest_cpu_queries.total_worker_time desc

編集、Pathumの質問への回答:

クエリを実行した結果:

---------------------------------------------------------------------------------------------------- 
Memory usage details for SQL Server instance SERVER9 (9.00.4053.00 - X86) - Standard Edition)
----------------------------------------------------------------------------------------------------

Memory visible to the Operating System
Physical Memory_MB|Physical Memory_GB|Virtual Memory GB 4091|4|2
Buffer Pool Usage at the Moment
BPool_Committed_MB|BPool_Commit_Tgt_MB|BPool_Visible_MB
519.250000|1599.875000|1599.875000

Total Memory used by SQL Server Buffer Pool as reported by Perfmon counters
Mem_KB|Mem_MB|Mem_GB 531712|519.250000|0.507080078

Memory needed as per current Workload for SQL Server instance    
Mem_KB|Mem_MB|Mem_GB 1638272|1599.875000|1.562377929

Total amount of dynamic memory the server is using for maintaining connections
Mem_KB|Mem_MB|Mem_GB 560|0.546875|0.000534057

Total amount of dynamic memory the server is using for locks
Mem_KB|Mem_MB|Mem_GB 968|0.945312|0.000923156

Total amount of dynamic memory the server is using for the dynamic SQL cache
Mem_KB|Mem_MB|Mem_GB 1120|1.093750|0.001068115

Total amount of dynamic memory the server is using for query optimization
Mem_KB|Mem_MB|Mem_GB 552|0.539062|0.000526428

Total amount of dynamic memory used for hash, sort and create index operations.
Mem_KB|Mem_MB|Mem_GB 0|0.000000|0.000000000

Total Amount of memory consumed by cursors
Mem_KB|Mem_MB|Mem_GB 480|0.468750|0.000457763

Number of pages in the buffer pool (includes database, free, and stolen).
8KB_Pages|Pages_in_KB|Pages_in_MB 66464|531712.000000|519.250000000

Number of Data pages in the buffer pool
8KB_Pages|Pages_in_KB|Pages_in_MB 50135|401080.000000|391.679687500

Number of Free pages in the buffer pool
8KB_Pages|Pages_in_KB|Pages_in_MB 895|7160.000000|6.992187500

Number of Reserved pages in the buffer pool
8KB_Pages|Pages_in_KB|Pages_in_MB 0|0.000000|0.000000000

Number of Stolen pages in the buffer pool
8KB_Pages|Pages_in_KB|Pages_in_MB 15434|123472.000000|120.578125000

Number of Plan Cache pages in the buffer pool
8KB_Pages|Pages_in_KB|Pages_in_MB 11953|95624.000000|93.382812500

Page Life Expectancy - Number of seconds a page will stay in the buffer pool without references
Page Life in seconds|PLE Status 47011|PLE is Healthy

Number of requests per second that had to wait for a free page
Free list stalls/sec 0


Number of pages flushed to disk/sec by a checkpoint or other operation that require all dirty pages to be flushed
Checkpoint pages/sec 572

Number of buffers written per second by the buffer manager"s lazy writer
Lazy writes/sec 0

Total number of processes waiting for a workspace memory grant
Memory Grants Pending 0

Total number of processes that have successfully acquired a workspace memory grant
Memory Grants Outstanding 0

2番目のクエリ、メモリ負荷のチェック:

SELECT object_name, cntr_value 
FROM sys.dm_os_performance_counters 
WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)');

結果:

object_name|cntr_value
SQLServer:Memory Manager        |1638272
SQLServer:Memory Manager        |531712
(2 row(s) affected)

  • 私のサーバーは32ビットです。何らかの理由で64ビットに移行することはありません。

  • sp_configure情報の値は提供できません。機密情報です。 :)

3
Fandango68

まず、SQL Serverに関連する質問を投稿するときはいつでも、「SQL Serverのバージョンとエディション」を投稿してください。異なるバージョンでは回答が完全に変わるとは思わないでしょう。

最近、VM SQL Server 2005インスタンスのコミットされたメモリ領域が増加し、ほぼVM設定した予約領域になりました1.7 GB(うーん多すぎる?).

なぜVM committedおよびVM reserved、実際にそれが何を言っているか知っていますか? VMコミット/予約済みです。VM reservedは仮想アドレス空間(VAS)の合計量です。SQLServerが予約しています。SQLServerは8 TB、デフォルトでは32ビットでは2 Gである)のVAS制限に従ってVASを予約します。したがって、VM予約されている場合、問題はありません高。これは正常な動作です。予約済みメモリは、実際にはSQL Serverが「使用する可能性がある」とSQL Serverが考えているものです。また、VM reservedは1.7 GIなので、この問題はないと考えています

コミットされたVMとは、仮想アドレススペース(VAS)またはSQL Serverがコミットした仮想メモリまたはphysical RAMシステム上。コミットされたメモリには、物理​​メモリが関連付けられています。コミットとは、SQL Serverが現在使用している仮想メモリの合計を意味します。

VMコミットされた値がVM予約済みの値に近づくと、サービスがかなり遅くなります。これを停止する唯一の方法は、すべてのSQLを停止することです。サービスサービスとそれらを再起動します。しかし、24時間以内にVMコミット済みはまだ忍び寄ります!

SQL ServerではVMコミット済みVM予約済みになる可能性があります。これは必ずしも問題ではありません。また、SQL Server IMOを再起動する癖をつけないでくださいSQL Serverでパフォーマンスの問題が発生していると思いますが、最初に実際にサーバーの速度を低下させている原因を見つける必要があります。使用を開始するには、 SQLの分析方法)を参照してください。サーバーのパフォーマンス

これは実際に問題の場所を見つけるのに役立ちます。あなたが投稿したものから私を信じてください、それはメモリの問題のようではないようです。SQLServerのバージョンについて限られた情報を提供したので、私の答えは限られています。

質問に以下の出力を追加してください

Select @@Version

SQL ServerはSQL Server 2005 SP4にパッチされていますか。それは違いない。以下のコマンドを使用してエラーログを読み取り、そのコンテンツを共有の場所に投稿し、問題のリンクを添付できますか?エラーログの内容を確認したいと思います。

sp_readerrorlog

SQL Serverに4 Gしかないと言っていましたが、SQL Serverに最大サーバーメモリを設定しましたか?

Windows Server 2003は最新のService Packにパッチされていますか。 Windows ServerにSQL Serverのメモリを過剰にトリミングするバグがあったことを確認してください。

編集:

.Microsoft SQL Server 2005-9.00.4053.00(Intel X86)2009年5月26日14:24:20 Copyright(c)1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2(Build 3790:Service Pack 2)

SQL Serverは32ビットで、WindowsサーバーはStandard Edition 32ビットです。とにかく、Windowsサーバーで4Gを超えるRAM=を強制的に使用することはできません。したがって、SQLサーバーでAWEを有効にしても、VASの制限を超えてデータとインデックスページがメモリを参照できるようにすることはできません。 SQL ServerとWindows OSの両方を64ビットにアップグレードすることをお勧めします。SQLServer 2012 SP2とWindows Server 2012またはWindows Server 2008 r2をお勧めしますが、両方が64ビットであることを確認してください。

これが不可能な場合は、Windows Server 2003を標準からエンタープライズにアップグレードできます。PAEを有効にすると、ウィンドウサーバーは4 G以上を表示できます。その後、AWEを有効にして、SQL Serverデータとインデックスページが2 Gを超えるメモリを表示できるようにします。現時点では、SQL Server VASは2 Gに制限されているため、2 Gを超えるメモリにはアクセスできません。

32ビットのメモリ構成について理解したい場合は この記事 をお読みください

5
Shanky

最大メモリを確認することから始めます。ここでの手順: http://technet.Microsoft.com/en-us/library/ms191144(v = sql.90).aspx

OSやその他のアプリのためのスペースを残すのに十分なほど低く設定する必要があります。あなたの場合、どちらが非常に低くなります。たぶん500MB-1GB

1

クエリから次の結果を投稿できますか?以下に提供したこれらのポイントは、問題の診断に役立つ場合があります

SQL Serverインスタンスのメモリ使用量の詳細を報告するスクリプト原作者Sakthivel Chidambaramこのスクリプトは、問題の診断に役立ちます

            /*============================================================================
               Script to report Memory usage details of a SQL Server instance
               Author: Sakthivel Chidambaram, Microsoft http://blogs.msdn.com/b/sqlsakthi 

               Date: June 2012
               Version: V2

               V1: Initial Release
               V2: Added PLE, Memory grants pending, Checkpoint, Lazy write,Free list counters

               THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF 
               ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED 
               TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
               PARTICULAR PURPOSE. 

            ============================================================================*/ 
            -- We don't need the row count
            SET NOCOUNT ON

            -- Get size of SQL Server Page in bytes
            DECLARE @pg_size INT, @Instancename varchar(50) 
            SELECT @pg_size = low from master..spt_values where number = 1 and type = 'E' 

            -- Extract perfmon counters to a temporary table
            IF OBJECT_ID('tempdb..#perfmon_counters') is not null DROP TABLE #perfmon_counters
            SELECT * INTO #perfmon_counters FROM sys.dm_os_performance_counters

            -- Get SQL Server instance name
            SELECT @Instancename = LEFT([object_name], (CHARINDEX(':',[object_name]))) FROM #perfmon_counters WHERE counter_name = 'Buffer cache hit ratio' 

            -- Print Memory usage details
            PRINT '----------------------------------------------------------------------------------------------------' 
            PRINT 'Memory usage details for SQL Server instance ' + @@SERVERNAME + ' (' + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' + SUBSTRING(@@VERSION, CHARINDEX('X',@@VERSION),4) + ' - ' + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')' 
            PRINT '----------------------------------------------------------------------------------------------------' 
            SELECT 'Memory visible to the Operating System' 
            SELECT CEILING(physical_memory_in_bytes/1048576.0) as [Physical Memory_MB], CEILING(physical_memory_in_bytes/1073741824.0) as [Physical Memory_GB], CEILING(virtual_memory_in_bytes/1073741824.0) as [Virtual Memory GB] FROM sys.dm_os_sys_info 
            SELECT 'Buffer Pool Usage at the Moment' 
            SELECT (bpool_committed*8)/1024.0 as BPool_Committed_MB, (bpool_commit_target*8)/1024.0 as BPool_Commit_Tgt_MB,(bpool_visible*8)/1024.0 as BPool_Visible_MB FROM sys.dm_os_sys_info 
            SELECT 'Total Memory used by SQL Server Buffer Pool as reported by Perfmon counters' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'Total Server Memory (KB)' 
            SELECT 'Memory needed as per current Workload for SQL Server instance' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'Target Server Memory (KB)' 
            SELECT 'Total amount of dynamic memory the server is using for maintaining connections' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'Connection Memory (KB)' 
            SELECT 'Total amount of dynamic memory the server is using for locks' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'Lock Memory (KB)' 
            SELECT 'Total amount of dynamic memory the server is using for the dynamic SQL cache' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'SQL Cache Memory (KB)' 
            SELECT 'Total amount of dynamic memory the server is using for query optimization' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'Optimizer Memory (KB) ' 
            SELECT 'Total amount of dynamic memory used for hash, sort and create index operations.' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'Granted Workspace Memory (KB) ' 
            SELECT 'Total Amount of memory consumed by cursors' 
            SELECT cntr_value as Mem_KB, cntr_value/1024.0 as Mem_MB, (cntr_value/1048576.0) as Mem_GB FROM #perfmon_counters WHERE counter_name = 'Cursor memory usage' and instance_name = '_Total' 
            SELECT 'Number of pages in the buffer pool (includes database, free, and stolen).' 
            SELECT cntr_value as [8KB_Pages], (cntr_value*@pg_size)/1024.0 as Pages_in_KB, (cntr_value*@pg_size)/1048576.0 as Pages_in_MB FROM #perfmon_counters WHERE object_name= @Instancename+'Buffer Manager' and counter_name = 'Total pages' 
            SELECT 'Number of Data pages in the buffer pool' 
            SELECT cntr_value as [8KB_Pages], (cntr_value*@pg_size)/1024.0 as Pages_in_KB, (cntr_value*@pg_size)/1048576.0 as Pages_in_MB FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Database pages' 
            SELECT 'Number of Free pages in the buffer pool' 
            SELECT cntr_value as [8KB_Pages], (cntr_value*@pg_size)/1024.0 as Pages_in_KB, (cntr_value*@pg_size)/1048576.0 as Pages_in_MB FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Free pages' 
            SELECT 'Number of Reserved pages in the buffer pool' 
            SELECT cntr_value as [8KB_Pages], (cntr_value*@pg_size)/1024.0 as Pages_in_KB, (cntr_value*@pg_size)/1048576.0 as Pages_in_MB FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Reserved pages' 
            SELECT 'Number of Stolen pages in the buffer pool' 
            SELECT cntr_value as [8KB_Pages], (cntr_value*@pg_size)/1024.0 as Pages_in_KB, (cntr_value*@pg_size)/1048576.0 as Pages_in_MB FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Stolen pages' 
            SELECT 'Number of Plan Cache pages in the buffer pool' 
            SELECT cntr_value as [8KB_Pages], (cntr_value*@pg_size)/1024.0 as Pages_in_KB, (cntr_value*@pg_size)/1048576.0 as Pages_in_MB FROM #perfmon_counters WHERE object_name=@Instancename+'Plan Cache' and counter_name = 'Cache Pages' and instance_name = '_Total'
            SELECT 'Page Life Expectancy - Number of seconds a page will stay in the buffer pool without references' 
            SELECT cntr_value as [Page Life in seconds],CASE WHEN (cntr_value > 300) THEN 'PLE is Healthy' ELSE 'PLE is not Healthy' END as 'PLE Status'  FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Page life expectancy'
            SELECT 'Number of requests per second that had to wait for a free page' 
            SELECT cntr_value as [Free list stalls/sec] FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Free list stalls/sec'
            SELECT 'Number of pages flushed to disk/sec by a checkpoint or other operation that require all dirty pages to be flushed' 
            SELECT cntr_value as [Checkpoint pages/sec] FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Checkpoint pages/sec'
            SELECT 'Number of buffers written per second by the buffer manager"s lazy writer'
            SELECT cntr_value as [Lazy writes/sec] FROM #perfmon_counters WHERE object_name=@Instancename+'Buffer Manager' and counter_name = 'Lazy writes/sec'
            SELECT 'Total number of processes waiting for a workspace memory grant'
            SELECT cntr_value as [Memory Grants Pending] FROM #perfmon_counters WHERE object_name=@Instancename+'Memory Manager' and counter_name = 'Memory Grants Pending'
            SELECT 'Total number of processes that have successfully acquired a workspace memory grant'
            SELECT cntr_value as [Memory Grants Outstanding] FROM #perfmon_counters WHERE object_name=@Instancename+'Memory Manager' and counter_name = 'Memory Grants Outstanding'

  • これを使用して、メモリ不足をチェックできます

    SELECT object_name、cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN( 'Total Server Memory(KB)'、 'Target Server Memory(KB)');


  • SQL Serverが32ビットOSに配備されている場合。 64ビットOSへの移行を検討してください。
  • また、sp_configure情報から値を提供できればさらに良い

私のポイントがあなたを助けることを願っています:)

2014年12月10日の更新

@ Fernando68こんにちはSQLサーバーでAWE(Address Windowing Extensions)を有効にしましたか?オペレーティングシステムのメモリ制限(64ビットメモリアドレス)が有効になっている場合、SQL Serverは常にAWEを使用しようとし、SQL ServerはそのAWEメモリを動的に管理できるため、64ビットマシンでは必要ありません。使用法。起動時に、起動ワークロードに必要なメモリ量を割り当てます。

以下の記事を参照できます

動作方法:SQL Server 32ビットPAE/AWE(SQL 2005、2008、および2008 R2)–使用しないRAM予想どおり!

0
Heisenberg