`

PostgreSQL启动过程中的那些事八:设置文件描述符个数

阅读更多

这一节 pg postmaster 启动时估算数据库的要打开的文件数,设置VFD数。

Pg 用“虚拟”文件描述符( VFDs )缓存来处理打开的文件。因各种原因服务器打开很多文件描述符,包括基表、临时文件(例如排序和 hash spool files )和像那样随机对 C 例程库的调用;超过系统对单进程能打开的文件数的限制是很容易的。操作系统打开一个文件占用一个文件描述符( FD )。(在现代 OS 上这个值大概是 256 ,但是在其他 OS 上可能低至 32 WinServer2003 里是 512

根据实际 OS 文件描述符按需打开或关闭, “虚拟”文件描述符 由该 LRU Last Recently Used ,最近最少使用)池管理。明显的, 如果一个文件通过这套接口打开,所有后续操作必须也通过这套接口操作(文件类型不是一个真实的文件描述符)。

为了该机制能工作,服务器上的大多数(如果不是所有)文件打开应该使用这些接口来代替 C 函数库(例如 open(2) fopen(3) )。负责, pg 可以发现实际文件描述符( FD )不够用。

这个事情我赶上过,数据库不是 pg ,在一个用户的生产环境上报数据库的 license 文件已过期,但实际上 license 文件是永不过期。后来定位是因为数据库频繁操作 license 文件时没有使用 VFD 这套接口, FD 达到了 OS 系统对单进程能打开的文件数的限制引起的,所以有了另一片博文《 Windows 系统进程打开文件句柄数的限制 》,解决办法是使用这套接口操作或者使用 C 函数打开后及时使用 C 函数关闭。

 

    上个图,看一下函数调用过程梗概,中间略过部分细节

 

设置 VFD 方法调用流程图


2 设置 max_safe_fds

话说 main()-> ->PostmasterMain()-> -> set_max_safe_fds () ,设置了最大可用的 VFD ,具体只是计算相关数字,没有涉及相关管理的数据结构,所以把代码贴出来

/*

  * set_max_safe_fds

  *     Determine number of filedescriptors that fd.c is allowed to use

  */

void

set_max_safe_fds ( void )

{

    int         usable_fds;

    int         already_open;

 

    /*----------

      * We want to set max_safe_fds to

      *         MIN(usable_fds, max_files_per_process - already_open)

      * less the slop factor for files that are opened without consulting

      * fd.c.  This ensures that we won't exceed either max_files_per_process

      * or the experimentally-determined EMFILE limit.

      *----------

      */

    count_usable_fds(max_files_per_process,

                    &usable_fds, &already_open);

 

    max_safe_fds = Min(usable_fds, max_files_per_process - already_open);

 

    /*

      * Take off the FDs reserved for system() etc.

      */

    max_safe_fds -= NUM_RESERVED_FDS;

 

    /*

      * Make sure we still have enough to get by.

      */

    if (max_safe_fds < FD_MINFREE)

       ereport(FATAL,

              (errcode(ERRCODE_INSUFFICIENT_RESOURCES),

                errmsg( "insufficient file descriptors available to start server process" ),

                errdetail( "System allows %d, we need at least %d." ,

                        max_safe_fds + NUM_RESERVED_FDS,

                        FD_MINFREE + NUM_RESERVED_FDS)));

 

    elog(DEBUG2, "max_safe_fds = %d, usable_fds = %d, already_open = %d" ,

         max_safe_fds, usable_fds, already_open);

}

  • 大小: 48.7 KB
0
0
分享到:
评论

相关推荐

    postgresql 常用命令大全

    - **功能**: 列出pg_description中对指定对象的描述,如表、表的列、类型、操作符或聚集。 - **示例**: `\dd table_name` 显示`table_name`的相关描述。 **4. \df** - **功能**: 列出所有函数。 - **示例**: `\...

    postgresql--内核分析--多进程结构

    - 创建新进程时,操作系统会为该进程分配必要的资源,包括但不限于内存空间、文件描述符以及打开的文件等。 - 进程间可以通过共享内存、管道、信号等方式进行通信。 #### 二、进程间的通信方式 **1. 共享内存**: -...

    postgres中文文档.pdf

    - **服务器设置和操作**:包括启动、停止数据库服务,以及日常运维操作。 - **服务器配置**:详细介绍了配置参数的意义及其对数据库性能的影响。 - **用户认证**:支持多种认证方式,如密码验证、证书验证等。 - **...

    postgreql-9.6.2

    3. **配置**:安装完成后,需要配置`postgresql.conf`文件以设置数据库参数,如数据目录、端口、最大连接数等。同时,需要初始化数据库集群,通常使用`initdb`命令。 4. **启动与停止**:使用`pg_ctl`或操作系统...

    CentOS 7下安装PostgreSQL 9.6的教程分享

    在本文中,我们将深入探讨如何在CentOS 7操作系统上安装PostgreSQL 9.6,一个强大的开源对象关系型数据库管理系统。PostgreSQL因其高度稳定性和丰富的功能特性而被广泛使用,支持多种操作系统,包括各种Linux发行版...

    unix系统配置文件.pdf

    - `/etc/fdprm` 文件用于配置文件描述符限制。 21. **/etc/filesystems** - 此文件定义了可以在系统上使用的文件系统类型。 22. **/etc/ftpusers & /etc/ftphosts & /etc/ftpaccess & /etc/ftpconversions** ...

    postgres-REL_14_5.tar.gz

    "postgres-REL_14_5.tar.gz" 是一个与 PostgreSQL 数据库服务器相关的压缩文件,版本号为 14.5。PostgreSQL 是一个开源的对象关系数据库管理系统 (ORDBMS),以其高度稳定、功能丰富、支持多种编程语言以及遵循 ACID...

    tomcat从windows向linux转移部署.pdf

    标题和描述提及的是将一个基于Java的J2EE项目从Windows环境迁移到Linux环境下的Tomcat服务器上进行部署的过程。这个过程涉及到多个关键步骤和注意事项,以下是详细的解释: 1. **Classpath问题**: 在Windows和...

    Ambari搭建HadoopAmbari搭建Hadoop_.docx

    - **检查最大打开文件描述符**:为了提高系统性能,应确保系统配置文件中设置的最大打开文件描述符数量足够高。 ##### 1.3 收集信息 - 收集所有集群节点的IP地址、主机名等基本信息。 - 准备好SSH密钥,以便在集群...

    Greenplum数据仓库安装部署

    - **文件描述符和进程限制**:通过修改`/etc/security/limits.conf`文件,增加每个用户可打开文件的最大数量和最大进程数。 - **文件系统优化**:为提高I/O性能,可以对数据分区采用XFS文件系统,并配置特定参数如`...

    plsql命令大全

    [command]**: 在 shell 中执行命令或启动一个交互式的 shell。 - 示例:`\! ls -l` 在 shell 中执行 `ls -l` 命令。 - **\?**: 获取关于反斜杠(`\`)命令的帮助。 - 示例:`\?` 显示所有反斜杠命令的帮助信息。 - *...

    webwork+hibernate+spring配置包

    这通常意味着作者已经处理好了框架之间的版本兼容性问题,以及相关的配置文件,如XML配置文件、pom.xml依赖管理和web.xml部署描述符等。 关于【标签】"webwork hibernate spring": 1. **WebWork**:这是一个早期...

    BSD Operating System Hacks

    - **实践方法**:学习mtree命令的基本语法及如何创建mtree文件描述符文件。 **Hack23:系统克隆** - **技巧概述**:此技巧提供了一种方法来复制整个系统的配置和数据到另一台机器。 - **实践方法**:使用dd命令来...

    my_linux_daemon.rar_daemon_linux 守护

    3. **关闭标准文件描述符**:关闭标准输入(0)、标准输出(1)和标准错误(2),防止与任何打开的文件描述符关联。可以重定向到/dev/null,这样所有输出都被丢弃。 4. **信号处理**:守护进程需要处理各种信号,如...

    jsp网络广告系统 SQL数据库

    "可直接运行"意味着这个压缩包包含了所有必要的文件和配置,下载后无需额外设置,只需导入数据库并启动Tomcat服务器即可使用。"亲测~"暗示这个系统已经过实际测试,证明它是可以正常工作的。 在【压缩包子文件的...

    讯友网络相册.zip

    4. **Web应用结构**:如果这是一个Web应用,可能会有`WEB-INF`目录,包含`web.xml`部署描述符和Servlet类。 5. **测试代码**:`test`目录可能包含JUnit或其他测试框架的测试用例,确保代码质量。 6. **文档**:可能...

    LearningRoom:jsp新手开发小案例;开发环境,netbeans+glassfish+postgresql+jsp(java8)

    3. 配置文件:如glassfish服务器的部署描述符,用于配置应用的运行环境。 4. README或指导文档:提供项目搭建和运行的步骤,帮助用户理解案例的实施过程。 通过学习这个小案例,新手开发者能够了解JSP开发的基本...

    2个相互守护防杀的进程.两个进程互相守护防杀

    一个普通的用户进程可以通过特定的函数调用(比如在Unix/Linux中使用`fork()`、`setsid()`、`chdir()`等)来转换为守护进程,这包括脱离控制终端、改变工作目录到根目录(防止占用资源)以及关闭不必要的文件描述符...

    我的ror的第一天

    在描述中提到的“rails的安装顺序”是一个关键知识点,对于初学者来说,正确安装Rails是开始学习的首要步骤。通常,Rails的安装包括以下几个步骤: 1. **系统要求**:确保计算机上安装了Ruby编程语言的最新稳定版本...

Global site tag (gtag.js) - Google Analytics