Linux的内核参数kernel.shmmax、kernel.shmall 和 kernel.shmmni
Linux的内核参数kernel.shmmax、kernel.shmall 和 kernel.shmmni
在 Linux 系统中,kernel.shmmax
、kernel.shmall
和 kernel.shmmni
是内核参数,用于控制和配置共享内存(Shared Memory)。这些参数特别对于数据库系统(例如 PostgreSQL 或 Oracle)优化非常重要,因为这些数据库常常依赖共享内存来管理缓存和其他重要数据结构。
参数说明
-
kernel.shmmax
:- 描述:控制一个单一共享内存段的最大大小,单位为字节。
- 默认值:通常内核有一个默认的大值,但在数据库系统里,通常需要调整这个值以配合需要。
- 配置示例:
sysctl -w kernel.shmmax=68719476736 # 67,108,864 KB = 64 GB
-
kernel.shmall
:- 描述:系统范围内允许的共享内存的总页数大小。
- 默认值:不仅取决于内存和系统架构,而且通常在数据库负载较高的系统里,需要进行调整。
- 配置示例:
sysctl -w kernel.shmall=16777216 # 16777216 pages * 4096 bytes/page = 64 GB
-
kernel.shmmni
:- 描述:系统范围内允许的共享内存段的最大数量。
- 默认值:此值通常比较大,但如果系统需要使用大量小的共享内存段,可能需要增加。
- 配置示例:
sysctl -w kernel.shmmni=4096 # 允许最多 4096 个共享内存段
查看和配置共享内存参数
查看当前参数设置
可以通过以下命令查看当前系统的共享内存参数设置:
sysctl -a | grep shm
或者直接查看特定参数的值:
sysctl kernel.shmmax
sysctl kernel.shmall
sysctl kernel.shmmni
临时设置共享内存参数
使用 sysctl
命令可以临时设置这些参数,参数会立即生效,但在系统重启后会丢失:
sysctl -w kernel.shmmax=<value>
sysctl -w kernel.shmall=<value>
sysctl -w kernel.shmmni=<value>
例如:
sysctl -w kernel.shmmax=68719476736
sysctl -w kernel.shmall=16777216
sysctl -w kernel.shmmni=4096
永久设置共享内存参数
要使这些参数在系统重启后保持,编辑 /etc/sysctl.conf
文件,添加以下内容:
kernel.shmmax = 68719476736
kernel.shmall = 16777216
kernel.shmmni = 4096
之后,使用以下命令使更改生效:
sysctl -p
PostgreSQL 配置示例
在 PostgreSQL 中,共享内存参数 kernel.shmmax
和 kernel.shmall
的配置尤其重要,因为 PostgreSQL 使用共享内存来管理大型共享缓冲区池等关键数据结构。
以下是配置示例:
设置共享内存参数(假设是在 64 GB 内存的系统中运行 PostgreSQL)
# 设置单个共享内存段的最大大小为 64 GB
sysctl -w kernel.shmmax=68719476736# 设置系统范围内允许的共享内存页数为 64 GB,假设内存页大小为 4096 字节
sysctl -w kernel.shmall=16777216# 设置系统允许的最大共享内存段的数量
sysctl -w kernel.shmmni=4096
PostgreSQL 配置
在 PostgreSQL 配置文件 postgresql.conf
中,你需要确保 shared_buffers
适当配置。例如:
# 假设系统有 64 GB 内存,可以将 shared_buffers 设置为 16 GB
shared_buffers = 16GB
检查设置是否生效
运行 PostgreSQL 并检查共享内存的使用情况:
[pg16@test ~]$ ps -e -o pid,vsz,rss,comm | grep postgres82061 454472 4224 postgres82062 165624 1264 postgres82063 454456 1288 postgres82064 454456 1288 postgres82066 454456 1268 postgres82067 456072 2124 postgres82068 454456 1268 postgres82069 456020 2024 postgres
重要注意事项
- 重新启动服务:在改变这些内核参数时,通常需要重新启动数据库服务以使更改生效。
- 系统限制:务必了解系统的物理内存限制,不要设置过高的值,以免影响系统的整体性能和稳定性。
- 调优:根据实际使用情况和数据库负载,酌情调优共享内存参数,找到最佳配置。
通过合理地设置这些共享内存参数,可以显著提升数据库系统(例如 PostgreSQL)的性能和稳定性。因此,好的配置和调优对于高负载、高性能数据库系统是非常重要的。