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.xdnf.cn/news/14790.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验,现有两个随机均匀的有样本组A、B,对其中一个组A做出某种改动,实验结束后分析两组用户行为数据,通过显著性检验,判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

Anolis8.2系统中搭建python环境

文章目录 安装依赖项依赖项介绍 下载python源码包安装python源码包 安装依赖项 [rootPython ~]# dnf install -y gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel xz-devel libffi-devel uuid-devel libnsl2-d…

Gurobi学术版+Anaconda安装步骤

注意:在anaconda虚拟环境中安装gurobi库是不需要在本地下载gurobi这个软件的,只需要conda install gurobi即可,或者指定版本的安装conda install -c gurobi gurobi11.0.3。 step0:安装ananconda step1:获得学术许可&a…

OBOO鸥柏:旗下户外景区自助触摸查询一体机已布局智慧城市便民

OBOO鸥柏作为户外自助查询一体机制造商品牌源头工厂一体化,鸥柏室外液晶广告屏凭借其独特的展览展示交互式查询互动优势,OBOO鸥柏正逐渐成为城市公共服务与商业信息查询的商用及工业液晶显示终端机新标杆。基于智慧城市便民化布局主要体现于以下几点&…

Mysql每日一题(分组+select嵌套查询)

本题我通过自己的努力,利用多个知识点,完成了本题,目前还没有查看题解,一会会给出别人题解的方法,自己写的代码就很很繁琐很麻烦,如果是大佬,可能知道这一题就直接这个窗口函数加这个窗口函数就…

Java并发篇--线程池

线程池 为什么要创建线程池 因为CPU核心数量有限,如果每来一个任务就创建一个线程,就会使线程数远远多于CPU核心数,使线程上下文切换过于频繁,会导致系统性能降低。而且每创建一个线程都会占用一定的内存,如果每来一个任务就创建一个线程,内存消耗太大了。 ThreadPoolExecuto…

ubontu--cuDNN安装

1. 下载 cuDNN https://developer.nvidia.com/cudnn 2. 拷贝到服务器/home/<username>文件夹下 解压缩到当前文件夹&#xff1a; tar -xvf cudnn-linux-x86_64-9.5.1.17_cuda11-archive.tar.xz复制头文件和库文件到cuda安装目录/usr/local/cuda/ sudo cp /home/usern…

Mac终端使用brew命令报错:zsh: command not found: brew

当在终端中出现 zsh: command not found: brew 这个错误时&#xff0c;可能是因为 Homebrew 没有被正确安装&#xff0c;或者它的路径没有被添加到环境变量中。 1. 检查 Homebrew 是否已安装&#xff1a; 打开终端&#xff0c;运行以下命令来检查 Homebrew 是否已安装&#xf…

斯坦福iDP3——改进3D扩散策略以赋能人形机器人的训练:不再依赖相机校准和点云分割(含源码解析)

前言 今天10.23日&#xff0c;明天1024则将作为长沙程序员代表&#xff0c;在CSDN和长沙相关部门举办的1024程序员节开幕式上发言&#xff0c;欢迎广大开发者来长工作 生活 考察 创业&#xff0c;​包括我司七月也一直在招聘大模型与机器人开发人员 后天&#xff0c;则将和相关…

Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】

下面是项目级完整配置1➡eslint:【吐血分享,博主踩过的坑你跳过去!!跳不过去?太过分了给博主打钱】 浏览器自动打开项目: 你想释放双手吗?你想每天早上打开电脑运行完项目自动在浏览器打开吗?不要9998,不要998,只要你在我们爱的 package.json 中配置一下即可显示。如…

DataWorks on EMR StarRocks,打造标准湖仓新范式

在大数据领域&#xff0c;数据仓库和实时分析系统扮演着至关重要的角色。DataWorks 基于大数据引擎&#xff0c;为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台&#xff0c;为用户带来智能化的数据开发和分析体验。而阿里云提供的 EMR Serverless St…

谷歌浏览器的实验性功能介绍

谷歌浏览器&#xff08;Google Chrome&#xff09;作为全球最受欢迎的网络浏览器之一&#xff0c;以其快速、稳定和丰富的扩展功能而闻名。除了常见的功能外&#xff0c;Chrome还提供了许多实验性功能&#xff0c;这些功能可以通过启用一些隐藏的标志来访问。本文将详细介绍如何…

Acrobat Pro DC 2023(pdf免费转化word)

所在位置 通过网盘分享的文件&#xff1a;Acrobat Pro DC 2023(64bit).tar 链接: https://pan.baidu.com/s/1_m8TT1rHTtp5YnU8F0QGXQ 提取码: 1234 --来自百度网盘超级会员v4的分享 安装流程 打开安装所在位置 进入安装程序 找到安装程序 进入后点击自定义安装&#xff0c;这里…

【论文复现】STM32设计的物联网智能鱼缸

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STM32设计的物联网智能鱼缸 【1】项目功能介绍【2】设计需求总结【3】项目硬件模块组成 1.2 设计思路【1】整体设计思路【2】ESP8266工作模式…

Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!

作者&#xff1a;来自 Elastic Platform Product Team Elastic Search AI 平台&#xff08;Elasticsearch、Kibana 和机器学习&#xff09;的 8.16 版本包含大量新功能&#xff0c;可提高性能、优化工作流程和简化数据管理。 使用更好的二进制量化 (Better Binary Quantizatio…

ubuntu20.04安装FLIR灰点相机BFS-PGE-16S2C-CS的ROS驱动

一、Spinnaker 安装 1.1Spinnaker 下载 下载地址为&#xff1a; https://www.teledynevisionsolutions.com/support/support-center/software-firmware-downloads/iis/spinnaker-sdk-download/spinnaker-sdk–download-files/?pnSpinnakerSDK&vnSpinnakerSDK 在上述地址中…

OCR+多模态数据技术,赋能海洋数据智能处理

海洋是推动高质量发展的关键区域&#xff0c;也是人类未来发展的宝库。然而&#xff0c;我们对海洋生态系统的深入理解尚不足5%。海洋大数据&#xff0c;通过观测、监测、调查、分析和统计等手段获得&#xff0c;已成为我们探索海洋世界的主要工具。 如图1所示&#xff0…

JUC学习笔记

文章目录 锁生产者消费者问题8锁现象集合类不安全Callable创建线程的三种方式 常用辅助类CountDownLatchCyclibarrierSamphore 本篇博客是之前学习JUC时记录的内容&#xff0c;对于并发编程知识只是浅浅谈及&#xff0c;并不深入。也算是给自己开新坑。建一个JUC的专栏&#xf…

集合卡尔曼滤波(EnsembleKalmanFilter)的MATLAB例程(三维、二维)

本 M A T L A B MATLAB MATLAB代码实现了一个三维动态系统的集合卡尔曼滤波&#xff08;Ensemble Kalman Filter, EnKF&#xff09;示例。代码的主要目的是通过模拟真实状态和测量值&#xff0c;使用 EnKF 方法对动态系统状态进行估计。 文章目录 参数设置初始化真实状态定义状…

OpenGL ES 共享上下文实现多线程渲染

OpenGL ES 共享上下文时,可以共享哪些资源? 共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenGL ES 和…