如何设置shmall,shmmax,shmmin等…一般而言和针对PostgreSQL


11

我使用了PostgreSQL文档来设置它,例如以下配置:

>>> cat /proc/meminfo 
MemTotal:       16345480 kB
MemFree:         1770128 kB
Buffers:          382184 kB
Cached:         10432632 kB
SwapCached:            0 kB
Active:          9228324 kB
Inactive:        4621264 kB
Active(anon):    7019996 kB
Inactive(anon):   548528 kB
Active(file):    2208328 kB
Inactive(file):  4072736 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              3432 kB
Writeback:             0 kB
AnonPages:       3034588 kB
Mapped:          4243720 kB
Shmem:           4533752 kB
Slab:             481728 kB
SReclaimable:     440712 kB
SUnreclaim:        41016 kB
KernelStack:        1776 kB
PageTables:        39208 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172740 kB
Committed_AS:   14935216 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      399340 kB
VmallocChunk:   34359334908 kB
HardwareCorrupted:     0 kB
AnonHugePages:    456704 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

>>> ipcs -l          

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4316816
max total shared memory (kbytes) = 4316816
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages Limits --------
max queues system wide = 31918
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

sysctl.conf提取,由我计算:

kernel.shmall = 1079204
kernel.shmmax = 4420419584

postgresql.conf非默认值,由我计算:

max_connections = 60            # (change requires restart)
shared_buffers = 4GB            # min 128kB
work_mem = 4MB              # min 64kB
wal_sync_method = open_sync     # the default is the first option
checkpoint_segments = 16        # in logfile segments, min 1, 16MB each
checkpoint_completion_target = 0.9  # checkpoint target duration, 0.0 - 1.0
effective_cache_size = 6GB

这样合适吗?如果不是(或不一定),在哪种情况下合适?

我们确实注意到此配置的性能有了很好的改进,您将如何改进呢?

如何计算内核内存管理参数?

谁能解释一下如何从头开始真正设置它们?


这有很多问题,您还没有告诉我们您当前的问题是什么(如果有),或者您的使用模式是什么。读一本有关PostgreSQL性能的书可能是值得的。
hmallett 2012年

我的问题是我不相信自己进行了正确的设置。我认为内核内存管理选项不是特定于PostgreSQL的,而且我不确定PostgreSQL是否最适合讨论这些选项。当然,在有关PostgreSQL性能的任何文章中都提到了它们,但这是Linux的选择,我很期待真正了解如何进行总体调整。
jpic 2012年

Answers:


11

我在这里回答了另一个问题:

Git无法推送错误“内存不足”

我不是在这里回答您所有的问题,而是您标题中的问题:

如何设置shmall,shmmax,shmmni等…一般而言和针对PostgreSQL

对于某些内核发行版,有一些设置可以阻止内核将最大内存分配给单个进程:

设置内核参数

修改/etc/sysctl.conf文件以包括适合您的操作系统的行:

# Red Hat Enterprise Linux 3.0 and CentOS 3.x 
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmin = 1
kernel.shmseg = 10

# semaphores: 
semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128
fs.file-max = 65536

# Red Hat Enterprise Linux 4.0 and CentOS 4.x 
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152

如果您的进程超出限制,则尽管系统上报告了最大内存,但内核仍会终止该进程。

注意:请谨慎使用这些设置。您可能不想使用该示例中的设置,因为我是从我们环境中的服务器上将它们提取出来的。

一些额外的注意事项:

要使用sysctl更新和测试内核设置​​,请使用以下命令:

列出当前设置:

sysctl -A | grep shm
sysctl -w kernel.shmmax=<value> to write in sysctl.conf
sysctl -p /etc/sysctl.conf to read/reload the values from sysctl.conf

通过编辑/etc/selinux/config文件来禁用安全linux ,并确保SELINUX标志设置如下。

SELINUX=disabled

这样合适吗?如果不是(或不一定),在哪种情况下合适?

当ISP提供程序不希望单个客户进程占用共享服务器上的所有资源时,通常在数据中心环境中更严格地定义内核设置。

除非您有一个进程由于资源匮乏而被内核杀死,否则通常不必设置内核内存参数。

在某些情况下,postgres还可以为特定页面大小分配更多的内存,而不是共享内存中可用的内存:

* The PostgreSQL server failed to start. Please check the log output:
2011-11-04 05:06:26 UTC FATAL: could not create shared memory segment: Invalid
argument
2011-11-04 05:06:26 UTC DETAIL: Failed system call was shmget(key=5432001, size
=161849344, 03600).
2011-11-04 05:06:26 UTC HINT: This error usually means that PostgreSQL’s reques
t for a shared memory segment exceeded your kernel’s SHMMAX parameter. You can
either reduce the request size or reconfigure the kernel with larger SHMMAX. To
reduce the request size (currently 161849344 bytes), reduce PostgreSQL’s shared
_buffers parameter (currently 19200) and/or its max_connections parameter (curre
ntly 53).
If the request size is already small, it’s possible that it is less than
your kernel’s SHMMIN parameter, in which case raising the request size or recon
figuring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memo
ry configuration.
…fail!

可以通过调整内核资源设置来解决上述示例之类的错误。此处详细介绍了用于确定资源设置的推荐设置和方法:

http://www.postgresql.org/docs/9.1/static/kernel-resources.html

但是,除非遇到与postgres流程相关的资源匮乏情况,否则您实际上不必触摸这些设置。这些情况通常发生在共享环境或分配了很少资源的服务器中。

谁能解释一下如何从头开始真正设置它们?

至于Postgres调整,您应该阅读以下内容:

http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server


1
“注意:请谨慎使用这些设置。您可能不想在该示例中使用这些设置,因为我是从我们环境中的服务器中提取这些设置的。” 我应该如何为我的环境计算它们?
jpic 2012年

1
嘿jpic,我进行了更新,以提供有关内核设置的更多详细信息。
杰森·亨特利

2

哦!!我在这里找到了一个很棒的工具来计算我们的postgresql服务器的optimus mem配置。

http://pgtune.leopard.in.ua/


该工具不会计算最佳配置,它为您调整服务器提供了一个起点,因为它主要基于硬件设置为您提供了答案。数据库大小,查询数量和大小对于调整配置参数也很重要。
EAmez,

1

这些内核配置是全局的,而不是特定于进程的,因此将它们设置为适当sysctl.conf


问题是关于确定内核共享内存管理参数的值,“如何”而不是“哪里”……感谢您的努力。
jpic 2012年

是的 那里很琐碎。它的肉怎么样。
亨利·邱

0

好吧,这取决于服务器上正在运行的其他内容,如果这是纯PostgreSQL服务器,那么PostgreSQL是寻找这些设置的正确位置。
如果您正在运行具有特定内存需求的其他应用程序/服务,则需要在这些不同的应用程序之间找到最佳设置。

如果您看到数据库的性能有所提高,而其他应用程序的性能没有损失,那么我就不必为此担心。

通常,数据库对内存设置最敏感,因为它们也很可能是应用程序性能的瓶颈,因此对于DB优化系统很有意义。


如何“在这些不同的应用程序之间找到最佳设置”?我没有性能问题,我在寻找配置共享内存内核设置的规范方法,真正的专业人士将如何做?假设有人为您处理一台运行中的服务器,并提供少量服务,而您只需要设置内存管理设置,您会怎么做?
jpic 2012年

没有黄金法则,您只需看看供应商说了什么,然后对其进行测试。如果您在同一台计算机上运行多个应用程序,请尝试针对内存占用最大的应用程序(在大多数情况下为DB)进行优化。但是除了查看供应商的建议和测试之外,没有唯一的解决方案
Sibster 2012年

我知道没有黄金法则。我希望这笔赏金会激发真正了解这一点的人写一些指导。但我认为毕竟没有人真正完全理解这一点-因为没有人能够给出简单的解释。
jpic 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.