我有一个查询,显示 sql server 使用了多少内存,最大内存和最小内存、cpu 等设置。
这是查询:
--============================================================
--checking current memory settings and usage
--marcelo miorelli
--16-feb-2014
--============================================================
SELECT R.[instance],
R.[Logical CPU Count],
R. [Hyperthread Ratio],
R.[Physical CPU Count],
R.[Physical Memory (GB)],
k.[Max server memory (GB)],
FOO.Memory_usedby_Sqlserver_MB,
FOO.Locked_pages_used_Sqlserver_MB,
k.[Min server memory (GB)],
k.[optimize for ad hoc workloads],
R.affinity_type_desc,
FOO.process_physical_memory_low,
FOO.process_virtual_memory_low,
R.virtual_machine_type_desc,
R.sqlserver_start_time
FROM (
SELECT [instance]=@@servername,
cpu_count AS [Logical CPU Count],
hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count],
CONVERT(decimal(12,2),physical_memory_kb/1024.00/1024.00) AS [Physical Memory (GB)],
affinity_type_desc,
virtual_machine_type_desc,
sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK)
) R
INNER JOIN (
SELECT [instance] = @@servername,
[Max server memory (GB)] = CONVERT(decimal(12,2),CAST(p.[max server memory (MB)] AS DECIMAL(12,2))/1024.00),
[Min server memory (GB)] = CONVERT(decimal(12,2),CAST(P.[min server memory (MB)] AS DECIMAL(12,2))/1024.00),
[min memory per query (MB)]= CONVERT(decimal(12,2),CAST(P.[min memory per query (KB)] AS DECIMAL(12,2))/1024.00),
p.[optimize for ad hoc workloads]
FROM ( SELECT name, [value_in_use]
FROM sys.configurations) t
PIVOT (MAX([value_in_use])
FOR name IN (
[min server memory (MB)],
[min memory per query (KB)],
[max server memory (MB)],
[optimize for ad hoc workloads]
)) p
) K
ON R.instance = K.instance
INNER JOIN (
SELECT [instance] = @@servername,
CONVERT(decimal(12,2),CAST(physical_memory_in_use_kb AS DECIMAL(12,2))/1024.00) AS Memory_usedby_Sqlserver_MB,
CONVERT(decimal(12,2),CAST(locked_page_allocations_kb AS DECIMAL(12,2))/1024.00) AS Locked_pages_used_Sqlserver_MB,
CONVERT(decimal(18,2),CAST(total_virtual_address_space_kb AS DECIMAL(18,2))/1024.00/1024.00) AS Total_VAS_in_GB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory t
) FOO
ON R.instance = foo.instance
OPTION (RECOMPILE);
这个查询给了我这个 - 目前在一个不繁忙的开发服务器上:
physical_memory_in_use_kb
我的问题与locked_page_allocations_kb
dmv相关sys.dm_os_process_memory
。
我如何找到该内存中保存的对象或任何 sql server?
我可以看到,在我的例子中,最小内存设置为 2 Gb,但使用的内存超过 5 Gb。
可能我实际上不需要知道,因为目前可能没有内存压力,但仍然有办法找出 sql server 在内存中保存了什么?
是或否,取决于您所说的“保留记忆”(原文如此)的含义。
如果您指的是实例广义上的内存使用情况,那么这
DBCC MEMORYSTATUS()
是一种查看整个实例内存使用情况的简单方法,该方法将根据需要进行回溯,并提供锁定页面使用情况的详细信息。还有处理 SQLOS 的 DMV,例如
sys.dm_os_memory_clerks
、broker
、nodes
和一大堆其他项目,包括不被视为最大服务器内存一部分的内存,例如sys.dm_os_loaded_modules
、sys.dm_os_stacks
等,也可用于获取类似的 (虽然不是精确的奇偶校验)信息。如果您的意思是在术语的粒度意义上使用内存,那么您基本上会运气不佳,因为记录的唯一真实结构是页面,它仅覆盖缓冲池。此外,记忆是如此短暂,只要看一眼它就会改变。您必须运行查询才能获取大部分数据,这本身就会导致这些项目发生更改。现在,您可以拍摄当前内存使用情况的快照和进程的转储并进行研究,但我怀疑这会有帮助。
我可能会误解您所询问的内存使用情况,但通常您会保持高水平,检查职员并查看是否有任何严重异常,然后根据该情况继续操作。在您的示例中,您超过了最小服务器内存,但远低于最大服务器内存,因此 SQL Server 目前没有太多动力来修剪任何内容。