PostgreSQL 无法为连接创建新的进程

PostgreSQL could not fork new process for connection

前几天在使用 PostgreSQL 数据库的过程中遇到这样一个错误。
could not fork new process for connection: Resource temporarily unavailable
看字面意思是无法克隆一个新的进程供连接使用,资源暂时不可用。下面是程序提示的各种错误。

知识点介绍
PostgreSQL 数据库是一个进程架构的模型设计。它有一个主进程 Postmaster Process,当有客户端发起链接请求时,Postmaster 主进程负责创建一个后端的客户端进程 Client Process,之后由这个进程负责客户端的这次请求操作。

错误出现怀疑是连接数的设置问题,但是遇到过数据库连接数达到最大值的情况。PostgreSQL 数据库当连接数达到最大值时,报错是 FATAL: sorry, too many clients already。
通过下面的方法,可以排除是数据库连接数不足的问题。
SELECT COUNT(*) FROM pg_stat_activity;
SELECT * FROM pg_settings WHERE name LIKE '%max_connections%';
发现当前连接数还远没有达到最大连接数 max_connections 参数设置的值。

再看错误提示是资源暂时不可用
服务器资源无非就是 CPU、内存和磁盘 IO 这些,决定去看看服务器的资源使用情况,是否存在特别明显的瓶颈问题。

使用 Linux 的 top -c 发现当前系统的 CPU 不是很高,系统负载在 1、5、15 分钟内也不是很高没有特别明显的 CPU 问题。
使用 LInux 的 free -h 看剩余内存可用内存都还是比较充足的。内存不足一般会引发 OOM。
使用 LInux 的 df -h 查看磁盘空间还是很足的。
这些都不存在问题,接下来就是排查系统的 IO 了,使用 iostat -d -x 1 观察发现也不存在问题。

怀疑是数据库参数配置问题
涉及到的参数有如下几个参数。阅读 PostgreSQL 关于参数的详解,可以看到。
max_worker_processes 设置系统能够支持的后台进程的最大数量。
max_parallel_workers_per_gather 设置单个 Gather 或者 Gather Merge 节点能够开始的工作者的最大数量。并行工作者会从 max_worker_processes 建立的进程池中取得,数量由 max_parallel_workers 限制。
max_parallel_maintenance_workers 设置单一工具性命令能够启动的并行工作者的最大数目。当前,唯一一种支持使用并行工作者的工具性命令是 CREATE INDEX,并且只有在构建 B- 树索引时才能并行。
max_parallel_workers 设置系统为并行操作所支持的工作者的最大数量。
我之前有一篇文章介绍过 PostgreSQL 数据库的配置文件参数,所以大部分参数我还是比较清楚的,基本可以排查参数问题。

在此问题得到解决之前,重启过数据库服务,重启过程序,但是都扛不住 1 小时。日志文件暴增程序无法访问。

此时我觉得还是要从服务器入手。决定还是去看看 Linux 的一些配置限制。先使用 Linux 的 ulimit -a 去看一下文件句柄数这些,发现这些已经被运维工程师调整过了,继续查看 Linux 资源限制配置文件 /etc/security/limits.conf 发现几个参数的设置是已经被优化过的,数值一般不会达到的那种。搜索了下关于这个文件的介绍,这个文件的作用等等。在一篇关于 Linux 服务器系统文件的介绍中有这样的一个介绍 /etc/security/limits.d 下的文件会覆盖 /etc/security/limits.conf 文件中的参数值,然后就去查看了下 /etc/security/limits.d 中有哪些文件,当时在 /etc/security/limits.d 下只有一个文件 /etc/security/limits.d/20-nproc.conf 在这个文件中有这样的一个设置
*          soft    nproc 4096
它与 /etc/security/limits.conf 文件中设置的值不同,只有 4096。/etc/security/limits.d  这个文件中有一些设置是我们的运维工程师加进去的,就比如上面这行数据,在该文件中被设置的值是 65535。

到此时抱着试一试的态度我使用如下的命令进行了一个操作,使用 Linux ps 看下用户进程数
ps -elf | grep postgres | wc -l
最后发现得到的值是大于 4096 的

这个时候抱着试一试的态度拿自己的虚拟机测试了下,我将 /etc/security/limits.d/20-nproc.conf 下的参数值从 4096 修改为 10,然后重启服务器,因为需要模拟至少 10 个连接,我就打开 Navicat 客户端不断的创建新的会话执行相同的查询,当打开几个查询后,观察 PostgreSQL 日志文件,发现此时日志文件有大量的错误 LOG:  could not fork autovacuum worker process: Resource temporarily unavailable。当我看到有错误 Resource temporarily unavailable 时我的眼前是一亮的,我需要一个环境去验证我的猜想和判断。在经历了漫长的验证之后基本确定了是这个问题。接下来只需要在生产环境中进行修复即可。在生产环境升级后这个问题直到下班前都未再出现过,问题得到解决。

最后总结下,排查问题涉及的几个点:
1、数据库最大连接数设置:
SELECT COUNT(*) FROM pg_stat_activity;
SELECT * FROM pg_settings WHERE name LIKE '%max_connections%';

2、操作系统参数设置:
cat /etc/security/limits.conf
cat /etc/security/limits.d/20-nproc.conf

3、用户连接数去验证是否超过上面的值:
ps -elf | grep postgres | wc -l

4、查看 PostgreSQL 数据库服务主进程下的连接限制
ps -ef | grep /usr/pgsql-12/bin/postgres 获取主进程 ID
备注:这里 /usr/pgsql-12/bin/postgres 是你 PostgreSQL 数据库安装位置,这里的主要目的是获取 PostgreSQL 服务的主进程 ID,当然也有别的方式可以获取你的主进程 ID 号,比如 postmaster.pid 文件

cd /proc/pid
备注:这里进入的是操作系统进程下目录,这里的 pid 就是前面获取的主进程 ID 号

cat limits
备注:这里显示了你的很多限制信息,有兴趣的可以仔细看看都有一些啥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析

在安卓14 安卓15的固件中。如果修改了系统级别的app。那么就会触发安卓14 15的应用签名验证。要么会导致修改的固件会进不去系统,或者进入系统有bug。博文将从几方面来解析去除安卓14 15应用签名验证的几种方法。 💝💝💝通过博文了解: 1💝💝💝-----安卓14去除…

批量规范化与ResNet-paddle

批量规范化与ResNet——paddle部分 本文部分为paddle框架以及部分理论分析,torch框架对应代码可见批量规范化与ResNet import paddle print("paddle version:",paddle.__version__)paddle version: 2.6.1批量规范化 批量规范化(Batch Norma…

从零开始快速构建Vue3项目

一、技术选型 组件大类 具体插件 vue3插件 相关插件开发文档 基础架构搭建 初始项目搭建、打包构件工具:vite开始 | Vite路由管理及菜单权限封装vue-router介绍 | Vue Router状态管理Pinia介绍 | Pinia 中文文档API请求及异常封装axiosUI框架 element-uihttps…

74HC245

74HC245:典型的CMOS型缓冲门电路 在这里用于增加电压

BFS 算法专题(三):BFS 解决边权为 1 的最短路问题

目录 1. 迷宫中离入口最近的出口 1.1 算法原理 1.2 算法代码 2. 最小基因变化 ★★★ 2.1 算法原理 2.2 算法代码 3. 单词接龙 3.1 算法原理 3.2 算法代码 4. 为高尔夫比赛砍树 (hard) 4.1 算法原理 4.2 算法代码 1. 迷宫中离入口最近的出口 . - 力扣(…

「数据要素」行业简报|2024.11.上刊

纵观数据要素行业动态,洞察行业风向,把握行业脉搏! 一、政策发布 1、《山东省公共数据资源登记管理工作规范(试行)》公开征求意见 11月7日,为认真贯彻落实《中共中央办公厅 国务院办公厅关于加快公共数据资源开发利用的意见》《…

有什么好用的 WebSocket 调试工具吗?

在开发和测试 WebSocket 应用程序时,确保客户端能够正确地与服务器建立连接、发送和接收消息是非常重要的。 市面上有许多通用的 API 测试工具,它们大多专注于 HTTP 请求,而对于 WebSocket 的支持则显得较为有限。这种局限性使得开发者在寻找…

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议,和HTTP类似,因为轻量简单&…

鸿蒙HarmonyOS 网络请求获取数据Http

注意的是;要为接口返回值指定类型 ,以及定义接口数据类型 index.ets import { http } from kit.NetworkKit;interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: }Component export default struct TabBar {State dat…

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂,死如秋叶之静美

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂,死如秋叶之静美 《飞鸟集》[印]泰戈尔,一本有意思的诗集,中英文对照着读更有意思。“你是谁,读者,百年后读着我的诗?”让我觉得有些久别重逢,忽…

ROS Action

在 ROS 中,Action 是一种支持长时间异步任务的通信机制。与 Service 不同,Action 允许客户端发起一个请求,并在任务执行的过程中不断接收反馈,直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务,比如机器…

约束(MYSQL)

not null(非空) unique(唯一) default(默认约束,规定值) 主键约束primary key(非空且唯一) auto_increment(自增类型) 复合主键 check&#xff08…

笔记 | image may have poor performance,or fail,if run via emulation

在Docker Desktop中现象如图: 当你运行 AMD64 平台代码时(Intel 和 AMD 芯),你的 Mac 必须模拟其CPU架构(因为你自身是ARM)。这通常会非常吃性能。 Docker Desktop 警告你在模拟 Intel/AMD x64 CPU 时性能可…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:C 个人主页:Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的,共有m个数据(x,x,...,x)。我们希望将这m个数据的维度从n维降到k维,希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表…

JS 实现SSE通讯和了解SSE通讯

SSE 介绍: Server-Sent Events(SSE)是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比,SSE提供了更高效和实时的数据推送机制。 SSE基于HTTP协议,允许服务器将数据以事件流(…

C/C++每日一练:查找链表的中间节点

链表(Linked List) 链表是一种线性数据结构,由一系列节点(Node)通过指针链接在一起。与数组不同,链表中的元素在内存中不需要连续存储,每个节点包含两部分: 数据部分:存…

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密:密码学的基石及 RSA 算法详解 在当今数字化的时代,信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术,为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…

PH47代码框架全局函数及功能类

PH47代码框架全局函数及功能类 概述 全局函数及功能类体系是PH47框架当中除了4个逻辑层之外最重要的组成部分之一,它们可以在 整个PH7 代码框架及用户代码中使用。常用全局函数及功能类为 PH7 代码框架提供了最常用和最基础的功能实现。 全局函数主要包含了对时间…

力扣 LeetCode 203. 移除链表元素(Day2:链表)

解题思路: 方法一:头节点和非头节点分开处理 方法二:定义一个dummy虚拟节点,后面的节点就可以采用相同的处理方式 注意: cur需要指向要删除的节点的上一个节点,因为要越过这一个被删除的节点 class Sol…