linux下跨进程传递文件描述符

问题

在web开发中,以典型的php-fpm为例,对于到外部系统的连接(如:mysql、redis)等都提供了持久连接接口(pconnect),但是受限于多进程模型,事实上是每个php-fpm进程都有单独的一个连接池的(参见:《当php遇上redis》),大量空闲连接的存在不仅对系统资源造成了浪费(不单指fd空间,像mysql的每连接一线程会附带大量内存空间:sort_buffer、read_buffer等),而且整个系统将无法横向扩展(如:mysql连接数限制)。如果可以在进程间共享文件描述符,将可以大大提升系统性能,促进多进程模型的应用。

方案

在linux平台下,sendmsg、recvmsg可以将一个进程的文件描述符传递给另一进程使用,这使得实现系统级的连接池成为可能。

实现

《The Linux Programming Interface》61.13.3 Passing File Descriptors