设为首页 收藏本站
查看: 881|回复: 0

[经验分享] PostgreSQL启动过程中的那些事八:设置文件描述符个数

[复制链接]

尚未签到

发表于 2016-11-21 07:19:40 | 显示全部楼层 |阅读模式
这一节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函数关闭。
  
  
 
    上个图,看一下函数调用过程梗概,中间略过部分细节
  
  
  DSC0000.bmp

设置VFD方法调用流程图

  
  

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

 * set_max_safe_fds

 *     Determinenumber of filedescriptorsthat fd.c is allowed to use

 */

void

set_max_safe_fds(void)

{

    int        usable_fds;

    int        already_open;

 

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

     * We want to setmax_safe_fds to

     *         MIN(usable_fds, max_files_per_process - already_open)

     * less the slop factor forfiles that are opened without consulting

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

     * or theexperimentally-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 FDsreserved for system() etc.

     */

    max_safe_fds -= NUM_RESERVED_FDS;

 

    /*

     * Make sure we still haveenough to get by.

     */

    if (max_safe_fds < FD_MINFREE)

       ereport(FATAL,

              (errcode(ERRCODE_INSUFFICIENT_RESOURCES),

               errmsg("insufficient file descriptors available to startserver 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);

}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303105-1-1.html 上篇帖子: 一个php中的数据输出到excel的例子(database:PostgreSQL) 下篇帖子: PostgreSQL启动过程中的那些事十二:为postmaster进程设置信号句柄
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表