Postgres与OS内核相关的几个参数设置

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: Postgres在postgresql.conf里面的配置参数有几个是和OS的内核参数紧密相关的,通常默认值是偏小的,但设置过大也会造成Postgres的启动失败,官方文档(Part 17.3)有较详细的说明,但没有例子,这里给出实际示例。
Postgres在postgresql.conf里面的配置参数有几个是和OS的内核参数紧密相关的,通常默认值是偏小的,但设置过大也会造成Postgres的启动失败,官方文档(Part 17.3)有较详细的说明,但没有例子,这里给出实际示例。 

测试环境: 
DB: postgres 9.1.3 
OS: CentOS 6.2 / Redhat
--内核参数文件位置:
/proc/sys/kernel
/etc/sysctl.conf
[root@localhost ~]# sysctl -a|more
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
kernel.msgmax = 65536
kernel.msgmni = 2005
kernel.msgmnb = 65536
[postgres@localhost ~]$ cat /proc/sys/kernel/sem
250     32000   32      128
(semmsl  semmns  semopm  semmni)

1.shared_buffers VS shmget 
shared_buffers是共享内存的意思,如果该值超过系统的内存值(包括swap),会造成启动失败 
shmget是get share memory,它是创建一个共享内存的函数
[root@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          1006        872        134          0        100        629
-/+ buffers/cache:        142        863
Swap:         2015         13       2002
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ vi /database/pgdata/postgresql.conf 
shared_buffers = 5GB
[postgres@localhost ~]$ pg_start
server starting
[postgres@localhost ~]$ FATAL:  could not create shared memory segment: Cannot allocate memory
DETAIL:  Failed system call was shmget(key=1949001, size=5609447424, 03600).
HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory or swap space, or exceeded your kernel's SHMALL parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMALL.  To reduce the request size (currently 5609447424 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
        The PostgreSQL documentation contains more information about shared memory configuration.

解决办法是减小shared_buffers、max_connections值,也或者加大shmall值、shmax值、加大内存和swap,如果设置超大,大过内核值,则直接报错Invalid argument,如

[postgres@localhost ~]$ vi /database/pgdata/postgresql.conf
shared_buffers = 222222GB
max_connections = 100
[postgres@localhost ~]$ pg_start
server starting
[postgres@localhost ~]$ FATAL:  invalid value for parameter "shared_buffers": "222222GB"
HINT:  Value exceeds integer range. 
2.max_connections VS semget 
max_connections是最大连接数,即允许客户端连接的最大连接数,增大连接可以允许接入更多的客户端,但设置过大同样会造成DB启动失败 
semget是获取信号的一个函数,即get semaphore
[postgres@localhost ~]$ vi /database/pgdata/postgresql.conf 
max_connections = 5000
[postgres@localhost ~]$ pg_start
server starting
[postgres@localhost ~]$ FATAL:  could not create semaphores: No space left on device
DETAIL:  Failed system call was semget(1949125, 17, 03600).
HINT:  This error does *not* mean that you have run out of disk space.  It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded.  You need to raise the respective kernel parameter.  Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.
        The PostgreSQL documentation contains more information about configuring your system for PostgreSQL.

上述的空间不够不是指的是磁盘空间不够,而是创建semaphores时空间参数不够,系统调用参数semget报错,但是错误信息感觉有些迷惑......解决办法通常是减小max_connections,或者增大内核参数,如semmni,semmns等,在/proc/sys/kernel/sem里面调整,如
[root@localhost ~]# sysctl -w kernel.sem="500 64000 50 150"
kernel.sem = 500 64000 50 150
[root@localhost ~]# cat /proc/sys/kernel/sem
500     64000   50      150
附参数说明 

 Name  Desc  Reasonable Value
 shmmax  Maximum size of shared memory segment (bytes)  at least several megabytes (see text)
 shmmin  Minimum size of shared memory segment (bytes)  1
 shmall  Total amount of shared memory available (bytes or pages)  if bytes, same as SHMMAX; if pages, ceil(SHMMAX/PAGE_SIZE)
 shmseg  Maximum number of shared memory segments per process only 1 segment is needed, but the default is much higher
 shmmni Maximum number of shared memory segments system-wide like SHMSEG plus room for other applications
 semmni Maximum number of semaphore identifiers (i.e., sets) at least ceil((max_connections + autovacuum_max_workers + 4) / 16)
 semmns  Maximum number of semaphores system-wide ceil((max_connections + autovacuum_max_workers
+ 4) / 16) * 17 plus room for other applications
 semmsl  Maximum number of semaphores per set  at least 17
 semmap  Number of entries in semaphore map  see text
 semvmx  Maximum value of semaphore at least 1000 (The default is often 32767; do not change unless necessary)
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
7天前
|
存储 物联网 调度
操作系统的心脏:内核深度解析
在数字世界的构建中,操作系统扮演着基石的角色,而其核心—内核,则是这一复杂系统的灵魂。本文将深入探讨操作系统内核的工作原理,揭示它是如何管理硬件资源、运行程序以及提供系统服务的。通过理解内核的结构和功能,我们可以更好地把握计算机系统的运作机制,进而优化和创新我们的技术实践。
|
28天前
|
安全 调度 开发者
探索操作系统的心脏:现代内核架构与挑战
【10月更文挑战第7天】 本文深入探讨了现代操作系统内核的复杂性和功能性,从微观角度剖析了内核在系统运行中的核心作用及其面临的主要技术挑战。通过浅显易懂的语言解释专业概念,旨在为读者提供一个关于操作系统内核的全面视角。
35 2
|
16天前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
1天前
|
存储 人工智能 安全
操作系统的心脏——内核深度解析
【10月更文挑战第29天】 本文深入探讨了操作系统的核心组件——内核,包括其定义、功能、架构以及在现代计算中的重要性。通过对比不同操作系统内核的设计哲学和技术实现,揭示了内核如何影响系统性能、稳定性和安全性。此外,文章还讨论了未来内核技术的潜在发展方向,为读者提供了一个全面了解内核工作原理的平台。
|
2天前
|
缓存 网络协议 Linux
Linux操作系统内核
Linux操作系统内核 1、进程管理: 进程调度 进程创建与销毁 进程间通信 2、内存管理: 内存分配与回收 虚拟内存管理 缓存管理 3、驱动管理: 设备驱动程序接口 硬件抽象层 中断处理 4、文件和网络管理: 文件系统管理 网络协议栈 网络安全及防火墙管理
18 4
|
4天前
|
存储 程序员 Linux
深入理解操作系统:从用户到内核的旅程
【10月更文挑战第31天】本文将带领读者踏上一场从应用层到内核层的探索之旅,揭示操作系统如何协调硬件资源、管理进程和提供系统服务。我们将通过具体代码示例,展示如何在Linux环境下编写简单的程序来与操作系统交互,并解释背后的原理。文章旨在为非专业读者提供一个易于理解的操作系统概念框架,同时为有志于深入了解计算机科学核心的读者打下坚实基础。
|
12天前
|
存储 Linux 调度
探索操作系统的心脏:内核设计与实现
【10月更文挑战第23天】在这篇文章中,我们将深入探讨现代操作系统的核心—内核。通过浅显易懂的语言和实例,本文旨在揭示操作系统内核的设计哲学、关键组件以及它们如何协同工作以支持复杂的系统功能。无论你是初学者还是有一定基础的开发者,本篇文章将为你打开一扇了解操作系统深层工作原理的大门。
27 8
|
10天前
|
安全 数据安全/隐私保护
探索操作系统的心脏:内核
【10月更文挑战第25天】操作系统是现代计算的核心,而内核则是这个核心中的心脏。本文将深入浅出地探讨内核的设计、功能以及它如何管理计算机资源。我们将通过简单的比喻和实例来理解复杂的技术概念,使读者能够在轻松的氛围中掌握这一主题。
|
10天前
|
存储 调度
探索操作系统的心脏:内核
【10月更文挑战第25天】在数字世界的每一次跳动中,都有一个不可见却至关重要的部分在默默工作——操作系统的内核。它是计算机系统的指挥中心,管理着硬件资源,协调着软件运行。本文将揭开内核的神秘面纱,带你领略其精妙的设计和复杂的功能。从进程管理到内存分配,再到文件系统,我们将一探究竟,看看这个让计算机活起来的“心脏”是如何跳动的。
19 2
|
10天前
|
算法 调度
探索操作系统的心脏:内核与进程管理
【10月更文挑战第25天】在数字世界的复杂迷宫中,操作系统扮演着关键角色,如同人体中的心脏,维持着整个系统的生命力。本文将深入浅出地剖析操作系统的核心组件——内核,以及它如何通过进程管理来协调资源的分配和使用。我们将从内核的概念出发,探讨它在操作系统中的地位和作用,进而深入了解进程管理的机制,包括进程调度、状态转换和同步。此外,文章还将展示一些简单的代码示例,帮助读者更好地理解这些抽象概念。让我们一起跟随这篇文章,揭开操作系统神秘的面纱,理解它如何支撑起我们日常的数字生活。

热门文章

最新文章