1. 优化内存使用的必要性
在数据处理和存储中,内存使用率的优化可以在不改变硬件基础的情况下提高服务器的性能。在运行 SQL Server 数据库服务器时,内存是一个重要的资源,包含了数据库缓存区和操作系统缓存区。如果没有必要的内存优化,服务器性能将容易下降,导致用户体验不佳,访问延迟增加等问题。
2. 详细了解内存使用
在优化内存使用之前,我们需要先了解 SQL Server 如何使用内存。根据 Microsoft 的官方文档,SQL Server 在启动时会分配一个大内存池,这个内存池包含了底层 SQL Server 数据结构的缓存。而分配给 SQL Server 的内存比可以使用的系统总内存少,因为 SQL Server 还需要保持系统缓存的一部分,以支持 SQL Server 实例以外的进程。
2.1 内存的分配顺序
SQL Server 在为不同操作分配内存时,按照以下顺序:
首先分配适量的内存给系统和其它应用程序,以满足 sqlservr.exe 进程启动的要求。
Sqlservr.exe 进程启动后,SQL Server 将使用内存映射文件的方式读取数据库文件,将缓存放到缓冲池中。
在缓冲池满时,会先丢弃不常用的数据。
在仍然缓存数据的情况下,SQL Server 可以使用可提供额外内存的内存扩展。
在所有其他操作都完成并且在使用 MAX server memory 指定的内存上限之间时,SQL Server 扩展所分配的内存无法用作缓冲区池,因为所分配的内存必须保持自由空闲状态,以供随后分配给操作系统缓存、具有内存规格的操作以及更多的内存扩展。
2.2 确定 SQL Server 实例的内存使用
在内存使用方面,大多数 SQL Server 实例将使用默认设置。这意味着在物理主机上安装 SQL Server 时系统将默认使用物理内存的所有可用部分。有时,我们需要根据特定的环境和性能要求来配置内存使用。为此,可以使用以下 query 来查看 SQL Server 实例的当前内存使用情况:
SELECT
physical_memory_in_use_kb / 1024 AS sql_memory_used_in_mb,
large_page_allocations_kb / 1024 AS sql_large_page_allocations_in_mb,
locked_page_allocations_kb / 1024 AS sql_locked_page_allocations_in_mb,
virtual_address_space_reserved_kb / 1024 AS sql_vas_reserved_in_mb,
virtual_address_space_committed_kb / 1024 AS sql_vas_committed_in_mb,
virtual_address_space_available_kb / 1024 AS sql_vas_available_in_mb,
page_fault_count AS page_fault_count
FROM sys.dm_os_process_memory WITH (NOLOCK)
OPTION (RECOMPILE);
SELECT
(physical_memory_in_use_kb / 1024 / 1024.) /
CAST(total_page_file_size_mb AS FLOAT) AS memory_usage_ratio,
* FROM sys.dm_os_process_memory WITH (NOLOCK)
CROSS JOIN sys.dm_os_sys_info WITH (NOLOCK)
OPTION (RECOMPILE);
3. 如何优化 SQL Server 内存使用
现在您已经了解了 SQL Server 的内存使用,如何更好地进行使用和优化呢?以下是一些有助于优化内存使用的策略。
3.1 配置最大内存
在大多数情况下,默认内存设置是适当的,但在一些情况下,可能需要更改这些设置。使用 MAX server memory 设置可以配置 SQL Server 实例在系统上可以使用的最大内存。提供的最大内存取决于系统的可用内存,并考虑到系统上的竞争项。如下所示:
sp_configure 'show advanced options', 1;
go
reconfigure;
go
sp_configure 'max server memory (MB)', 2048;
go
reconfigure;
go
请注意,修改 MAX server memory 后,需要使其立即生效,请运行 RECONFIGURE 命令。
3.2 允许锁定页面内存(LPIM)
如果服务器拥有足够的内存,可以通过使用启用锁定页内存(LPIM)以保持 SQL Server 中的内存页面不会为了使用其它目的而交换出内存。开启LOCK_PAGES_IN_MEMORY 选项可以确保为SQL Server 内存分配保留捆绑到物理RAM中的物理页面。
3.3 使用AWE
如果数据库实例是32位的,可以使用 AWE 来增加内存分配。 AWE (Address Windowing Extensions)是用于 32 位 Windows 平台的数据页缓冲池扩展。它能够将内存窗口分成较小的页面,使 SQL Server 能够访问超过内存限制的地址空间。例如,如果您的计算机物理内存为 4GB,但是仅能使用 2GB,您可以使用 AWE 扩展 SQL Server 上下文中的地址空间。
3.4 考虑使用大页面
大页面是 64 位 Windows Server 视为单个内存块处理的页面,大小为常规页面的 8 倍。当使用 Lock Pages in Memory(LPIM)选项时,使用大页面可以显著减少缓冲池和操作系统之间的页操作。
3.5 关闭服务启用的不必要组件
如果 SQL Server 在运行期间启用了许多不必要的组件及服务,则会造成内存系统上限的额外负担。请注意使用 SQL Server 期间你所保留的各种单例别名、日志检查点,通讯对列管理等各种应用软件组件。
4. 总结
优化 SQL Server 内存使用可以提高服务性能,减少了系统负担和运营成本,对于数据库应用程序来说至关重要。通过设置适当的内存上限,启用 LPIM 和大页面等操作,可以提高服务器性能,允许更多的控制和配置。务必牢记,在实施任何性能优化策略之前,一定要仔细了解 SQL Server 实例的内存使用情况。