无法在 Windows 服务器上使用 PostgreSQL 9.3 将 work_mem 增加到 1GB 以上
Cannot increase work_mem above 1GB using PostgreSQL 9.3 on Windows Server
我想调整 postgres 配置以在 Windows 服务器上使用。这是我当前的 posgresql.conf 文件:http://pastebin.com/KpSi2zSd
我想增加 work_mem
和 maintenance_work_mem
,但是如果我将值提高到 1GB 以上,我会在启动服务时收到此错误:
日志文件中没有添加任何内容(至少 data\pg_log 中没有)。我如何找出导致问题的原因(增加日志记录)? windows 和 postgres 之间的问题管理有什么关系吗?
这是我的服务器规格:
- Windows Server 2012 R2 数据中心(64 位)
- 英特尔 CPU E5-2670 v2 @ 2.50 GHz
- 512 GB 内存
- PostgreSQL 9.3
在 Windows 下,work_mem
的值限制为 2GB(即使在 64 位系统上)- 据我所知没有解决方法。
我不知道为什么你不能将它设置为 1GB。也许 work_mem
和 maintenance_work_mem
的总和还有另一个我不知道的限制。
将 work_mem
默认设置 通常不是一个好主意。对于 512GB RAM 和只有 10 个用户,这 可能 有效,但请记住,work_mem
的数量是由一个语句为每个排序、分组或散列操作请求的询问。所以你可以有一个语句请求这个内存量 15 或 20 次。
您不需要在 postgresql.conf
中更改它 - 如果您知道以下查询将受益于 运行 的大型 work_mem,则可以动态更改它:
set session work_mem='2097151';
如果您使用更大的数字,您将收到一条错误消息,告诉您限制:
ERROR: 2097152 is outside the valid range for parameter "work_mem" (64 .. 2097151)
即使 Postgres 没有使用所有内存,它仍然可以从中受益。 Postgres(与 Oracle 不同)严重依赖文件系统缓存,而不是自己进行所有缓存。 shared_buffers
的值超过大约 8GB 很少显示出任何好处。
你做需要告诉Postgres操作系统通常使用多少内存用于缓存,通过将effective_cache_size
设置为适当的值。 Postgres 不会 使用 缓存,但它会影响计划者的选择,例如如果索引可能在文件系统缓存中,则优先使用索引扫描而不是 seq 扫描。
您可以在 Windows 任务管理器(或例如 ProcessExplorer)中查看文件系统缓存的当前大小
如上所述,在windows中依赖OS缓存更为有利。
如果您使用 sysinternals (Microsoft) 的 RAMMAP,您可以准确地看到 postgres 在 OS 缓存中使用了什么,以及实际缓存了多少。
我想调整 postgres 配置以在 Windows 服务器上使用。这是我当前的 posgresql.conf 文件:http://pastebin.com/KpSi2zSd
我想增加 work_mem
和 maintenance_work_mem
,但是如果我将值提高到 1GB 以上,我会在启动服务时收到此错误:
日志文件中没有添加任何内容(至少 data\pg_log 中没有)。我如何找出导致问题的原因(增加日志记录)? windows 和 postgres 之间的问题管理有什么关系吗?
这是我的服务器规格:
- Windows Server 2012 R2 数据中心(64 位)
- 英特尔 CPU E5-2670 v2 @ 2.50 GHz
- 512 GB 内存
- PostgreSQL 9.3
在 Windows 下,work_mem
的值限制为 2GB(即使在 64 位系统上)- 据我所知没有解决方法。
我不知道为什么你不能将它设置为 1GB。也许 work_mem
和 maintenance_work_mem
的总和还有另一个我不知道的限制。
将 work_mem
默认设置 通常不是一个好主意。对于 512GB RAM 和只有 10 个用户,这 可能 有效,但请记住,work_mem
的数量是由一个语句为每个排序、分组或散列操作请求的询问。所以你可以有一个语句请求这个内存量 15 或 20 次。
您不需要在 postgresql.conf
中更改它 - 如果您知道以下查询将受益于 运行 的大型 work_mem,则可以动态更改它:
set session work_mem='2097151';
如果您使用更大的数字,您将收到一条错误消息,告诉您限制:
ERROR: 2097152 is outside the valid range for parameter "work_mem" (64 .. 2097151)
即使 Postgres 没有使用所有内存,它仍然可以从中受益。 Postgres(与 Oracle 不同)严重依赖文件系统缓存,而不是自己进行所有缓存。 shared_buffers
的值超过大约 8GB 很少显示出任何好处。
你做需要告诉Postgres操作系统通常使用多少内存用于缓存,通过将effective_cache_size
设置为适当的值。 Postgres 不会 使用 缓存,但它会影响计划者的选择,例如如果索引可能在文件系统缓存中,则优先使用索引扫描而不是 seq 扫描。
您可以在 Windows 任务管理器(或例如 ProcessExplorer)中查看文件系统缓存的当前大小
如上所述,在windows中依赖OS缓存更为有利。 如果您使用 sysinternals (Microsoft) 的 RAMMAP,您可以准确地看到 postgres 在 OS 缓存中使用了什么,以及实际缓存了多少。