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 postgres
82061 454472 4224 postgres
82062 165624 1264 postgres
82063 454456 1288 postgres
82064 454456 1288 postgres
82066 454456 1268 postgres
82067 456072 2124 postgres
82068 454456 1268 postgres
82069 456020 2024 postgres
重要注意事项
- 重新启动服务:在改变这些内核参数时,通常需要重新启动数据库服务以使更改生效。
- 系统限制:务必了解系统的物理内存限制,不要设置过高的值,以免影响系统的整体性能和稳定性。
- 调优:根据实际使用情况和数据库负载,酌情调优共享内存参数,找到最佳配置。
通过合理地设置这些共享内存参数,可以显著提升数据库系统(例如 PostgreSQL)的性能和稳定性。因此,好的配置和调优对于高负载、高性能数据库系统是非常重要的。