|
3.5. 管理内核资源一次大型 PostgreSQL 安装会很容易达到各种操作系统的 资源上限.(在有些系统上,出厂设置低得你都不用一次 "大型" 安装.) 如果你碰到这类问题请继续阅读. 3.5.1. 共享内存和信号灯共享内存和信号灯的正确叫法是 " System V IPC " ( 还有消息队列,不过对于 PostgreSQL 而言没什么 关系.)尽管所有现代操作系统都提供这个特性,但并不是 所有系统缺省都打开它或者有足够的资源,尤其是有 BSD 亲源 的系统. (对于 QNX 和 BeOS 移植? PostgreSQL 自己提供这套 机制的替换实现.) 完全缺少这些机制的表现通常是在 postmaster 启动的时候的 Illegal system call 错误.这时除了重新配置内核以外 没什么可做的 -- PostgreSQL 没它们干不了活. 如果 PostgreSQL 超出了这些 IPC 资源的硬限制之一的时候 就会拒绝启动并且留下一条相当有启发性的错误信息告诉你它碰到了 什么问题以及需要为它做些什么. (又见 Section 3.3.1 .) 相关的内核参数在不同系统之间有着相对固定的术语; Table 3-2 是一个概况.不过,设置它们的方法却 多种多样.不过要注意的是,你可能最好重新启动你的机器,或者还要 重新编译内核来修改这些设置. Table 3-2. System V IPC 参数
最重要的共享内存参数是 SHMMAX , 以字节记的共享内存段可拥有的最大尺寸. 如果你收到来自 shmget 的一行 Invalid argument 这样的错误信息,那么很有可能是你超过限制了. 要求的共享内存段随着请求的缓冲区数量( -B 选项)和 允许的连接数量( -N 选项)的变化而变化,尽管前者是 主要因素. (因此,作为一种临时的解决方法,你可以降低这些设置来绕过失败.) 如果粗略地估计,你可以估计所需要的段尺寸是缓冲区数量乘以块 尺寸(缺省 8 kB)加上足够的盈余(至少半兆字节). 任何错误信息都会包含分配失败的尺寸. 不太可能出问题的是共享内存段的最小尺寸( SHMMIN ), 对 PostgreSQL 来说最多是 256 kB左右(通常只是 1),而 系统范围( SHMMNI )或每进程( SHMSEG ) 最大共享内存段数量不应该会产生问题,除非你的系统把它们设成零. 有些系统还对系统里的共享内存总量有限制;参阅下面平台相关的指导. PostgreSQL 每个允许的联接使用一个信号灯 ( -N 选项), 以 16 个为一套.每套信号灯还包含第十七个信号灯, 它里面存储一个 "magic number(标志数字)" , 以检测和其他应用使用的信号灯集冲突. 系统里的最大信号灯数目是由 SEMMNS 设置的, 因此这个值应该至少和联接设置一样大,并且每十六个联接还要另外加一个. (参阅 Table 3-2 里面的公式.) 参数 SEMMNI 决定 系统里一次可以存在的信号灯集的数目.因此这个参数至少应该为 ceil(max_connections % 16) .降低允许的联接数目是一个临时的 绕开失败的方法,这个启动失败通常被来自函数 semget() 的错误响应 " No space left on device " 搞得很让人迷惑. 有时候你还会发现有必要增大 SEMMAP ,使之至少按照 SEMMNS 配置.这个参数定义信号灯资源映射的尺寸, 可用的每个连续的信号灯块在这个映射中存放一条记录. 每当一套信号灯被释放,那么它要么会加入到该映射中一条相连的 已释放的块的入口中,要么注册成一条新的入口.如果映射填满了碎片, 那么被释放的信号灯就丢失了(除非重起).因此时间长信号灯空间的碎片 了会导致可用的信号灯比应该有的信号灯少. SEMMSL 参数,决定一套信号灯里可以有多少信号灯,对于 PostgreSQL 而言应该至少是 17. 许多设置与 "semaphore undo(信号灯恢复)" 有关,比如 SEMMNU 和 SEMUME ,这些与 PostgreSQL 无关.
3.5.2. 资源限制Unix 类系统强制了许多资源限制,这些限制可能干扰你的 PostgreSQL 服务器的运行. 这里尤其重要是对每个用户的进程数目的限制,每个进程打开文件数目, 以及一个进程可用的内存. 这些限制中每个都有一个 "硬" 限制和一个 "软" 限制. 软限制实际是管用的,但用户可以自己修改成最大为硬限制的数目. 而硬限制是只能由 root 用户修改的限制. 系统调用 setrlimit 负责设置这些参数. shell 的内建命令 ulimit (Bourne shells) 或 limit ( csh ) 就是用于在命令行上控制资源限制的. 在 BSD 衍生的系统上,文件 /etc/login.conf 控制在登录时对各种资源设置什么样的限制数值. 参阅 login.conf 获取细节. 相关的参数是 maxproc , openfiles ,和 datasize . 比如: default:\ ... :datasize-cur=256M:\ :maxproc-cur=256:\ :openfiles-cur=256:\ ... ( -cur 是软限制,后面附加 -max 就可以设置硬限制.) 内核通常也有一些与其具体实现相关的系统范围的一些资源的限制.
PostgreSQL 服务器每个联接都使用一个进程, 所以你应该至少允许和联接数相同的进程数,再加上你的系统其它部分 所需要的数目.通常这个并不是什么问题,但如果你在一台机器上 运行多个服务器,那你就要把事情理清楚. 打开文件数目的出厂缺省设置通常设置为 "社会友好" 数值,就是说允许许多用户共存于一台机器, 而不会导致只使用系统资源的不当比例.如果你在一台机器上运行许多 服务器,这也许就是你想要的,但是在特殊的服务器上,你可能需要提高 这个限制. 问题的另外一边,一些系统允许独立的进程打开非常多的文件; 如果有那么几个进程这么干,那系统范围的上限就很容易达到. 如果你发现这样的现象,并且不想修改系统范围的限止, 你就可以把 PostgreSQL 的 max_files_per_process 配置参数设置为你允许的 最大单进程打开文件数. |