Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.databases.ms-sqlserver    |    Notorious Rube Goldberg contraption    |    19,505 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 19,387 of 19,505    |
|    Anton Shepelev to All    |
|    Re: Limiting memory usage    |
|    11 May 22 12:48:46    |
   
   From: anton.txt@g{oogle}mail.com   
      
   Erland Sommarskog:   
      
   > Max server memory main controls the buffer cache, which   
   > also is the main consumer. But there are also memory   
   > allocations that are outside "max server memory", so it is   
   > not unusual for the actual usage to exceeds the setting a   
   > little bit.   
      
   The documentation seems to disagree with you:   
      
    Reconfigure the amount of memory (in megabytes) for a SQL   
    Server process used by an instance of SQL Server.   
      
   When I set up a limit of 768 Mb, restarted the instance, and   
   put some high memory pressure on it, the actual usage never   
   exceeded 768 Mb:   
      
    sys.dm_os_process_memory: physical_memory_in_use_kb/1024 = 751   
    Task Manager : Working set (memory) /1024 = 751   
      
   I then increased the limit to 1024 Mb and imparted more   
   memory pressure on the instance. The memory usage was again   
   below the limit:   
      
    sys.dm_os_process_memory: physical_memory_in_use_kb/1024 = 1015   
    Task Manager : Working set (memory) /1024 = 1015   
      
   As you see, SQL Server does not exceed its memory limit if   
   it is not exceeded already (which it is when decreasing the   
   limit below actual usage)!   
      
   > Don't make this too dynamic. I don't know for sure, but I   
   > would assume that max server memory are one of the options   
   > that clear the plan cache, and thus causes a lot of   
   > recompilations. (Because the amount of available memory   
   > affects compilation of queries.)   
      
   My script is executed every hour and causes the memory usage   
   of an idle SQL Server to drop by a factor of two closer to   
   the base level (128 Mb) during each working day. In that   
   sense, it is not very dynamnic. The source is far from   
   publishing quality, but you are welcome to exemine it if   
   intersted:   
      
   sp_configure 'show advanced options', 1 RECONFIGURE   
      
   DECLARE @srv_n INT = 6 -- number of MSSQL instances   
   DECLARE @dec_2 INT = 10 -- number of iterations for half-decay   
   DECLARE @m_res INT = 2048 -- memory reserved for the OS   
      
   -- TODO: instead of c_mis, try: round down to next 32, subract 32.   
   DECLARE @c_mmi INT = 128   
   DECLARE @c_mma INT = 2147483647   
   DECLARE @c_ste INT = 32 -- minumum memory decrement (exp.)   
   DECLARE @c_two FLOAT = 2   
   DECLARE @c_min VARCHAR(17) = 'min server memory'   
   DECLARE @c_max VARCHAR(17) = 'max server memory'   
      
   DECLARE @v_low BIT,   
    @p_low BIT   
   -- RAM values, in MB:   
   DECLARE @m_min INT -- min RAM parameter   
   DECLARE @m_use INT -- RAM used by this MSSQL instance   
   DECLARE @m_lim INT -- target RAM limitation   
   DECLARE @max_l INT -- max limit   
   DECLARE @N INT   
      
   -- Active only in work hours:   
   IF NOT DATEPART( hour, GETDATE() ) BETWEEN 9 AND 19 GOTO Finish   
      
   SELECT @m_use = physical_memory_in_use_kb/1024,   
    @p_low = process_physical_memory_low ,   
    @v_low = process_virtual_memory_low   
    FROM sys.dm_os_process_memory   
    IF @v_low=1 OR @p_low=1 GOTO Finish   
    SET @m_min = @c_mmi   
    IF @m_use <= @m_min GOTO Finish   
    SET @m_lim = @m_min + (@m_use - @m_min) / POWER(@c_two, 1.0/@dec_2)   
    SET @max_l = @m_use - @m_use % @c_ste - 1 - @c_ste + 8   
    IF @max_l < @m_lim SET @m_lim = @max_l   
    IF @m_lim < @m_min SET @m_lim = @m_min   
      
   PRINT FORMATMESSAGE('Decreasing memory use from %i to %i', @m_use, @m_lim)   
      
    EXEC sp_configure @c_min, 0   
    EXEC sp_configure @c_max, @m_lim RECONFIGURE   
      
   SET @N = 12   
   WHILE @N > 0   
   BEGIN   
    WAITFOR DELAY '00:00:05'   
    SELECT @m_use = physical_memory_in_use_kb/1024,   
    @p_low = process_physical_memory_low   
    FROM sys.dm_os_process_memory   
    IF @p_low = 1 BREAK   
    IF @m_use < @m_lim + @c_ste BREAK   
    SET @N = @N - 1   
   END   
      
    EXEC sp_configure @c_max, @c_mma RECONFIGURE   
      
   Finish:   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca