如何设置 shmall、shmmax、shmmin 等...一般情况下以及针对 postgresql

如何设置 shmall、shmmax、shmmin 等...一般情况下以及针对 postgresql

我用过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

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

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

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

有人能解释一下如何从头开始真正地设置它们吗?

答案1

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

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

答案2

哦!我发现了一个很棒的工具,它为你提供了一个调整 postgresql 服务器的起点。

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

答案3

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

答案4

这取决于服务器上还运行着什么,如果这是一台纯 PostgreSQL 服务器,那么 PostgreSQL 就是寻找这些设置的正确地方。
如果您正在运行具有特定内存需求的其他应用程序/服务,那么您将需要在这些不同的应用程序之间找到最佳设置。

如果您看到数据库性能有所提高,而其他应用程序性能没有下降,那么我就不必担心这一点。

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

相关内容