问题发生环境:
Nginx
PHP 5.3.10 as php-fpm extension to nginx
mongodb-php-driver 1.2.12
MongoDB 2.2
此问题是 MongoDB PHP Driver 1.2.x 的官方特性导致的,描述请看 PHP-202 和 PHP-347 。简单地说,PHP-FPM模式下,每一个 PHP Worker 进程都有自己独立的 mongodb 连接池,从而导致连接数极易超标,内存数也随之倍增。
一,PHP服务背景:
某个 Web 应用是通过 Nginx+factcgi 运行的 PHP 程序提供服务的。
PHP-FPM的最大子进程数,是通过 php-fpm.conf 的 max_children 参数设置的(或pm=dynamic时由 spare_servers+start_servers 参数综合决定)。这个值曾被设置为512 。
二,MongoDB服务背景:
mongodb 实例的最大连接数限制可以通过启动参数中的 maxConns 设置:
maxConns:默认值取决于系统的限制(如 ulimit 和 file descriptor)。如果没设置这个参数, mongodb 自己不会限制连接数。但,你不能设置超过 20,000 。
一般不刻意设置 maxConns 参数。
三,MongoDB PHP Driver 的可怕连接池特性(BUG?)
MongoDB 官方提供的 mongodb-php-driver 在 1.3.0 以下版本(1.2.0~1.2.1x),拥有一个可怕的连接池实现方案,在执行任何查询时,都会从连接池中请求一个连接,完成之后再归还给连接池。这里的完成是指持有该连接的变量离开了它的作用域。www.2cto.com
PHP-FPM模式下,一个 PHP Web 应用能对 MongoDB instance 建立的并发连接数计算方式如下:
进程数:max-children = 512 ,那么是 512 个进程;
一个MongoDB实例对应一个连接池:主站配置了165和166两个副本集实例;
连接池中的连接数:mongodb-php-driver 对此不做任何限制,可以无限增加直到句柄耗尽为止。
——————郑昀:此计算方式出自 mongo.connecting.pools ——————
根据 mongodb 官方文档说明,虽然连接数无限增长理论上是有可能的,但实际观测发现,一个 Web Server 与一个 mongodb 实例的连接数通常会稳定在一个值上,不会有太大的起伏 。
那么,假设一个 PHP Web 应用向 mongodb-165 发起的连接数为 :
750 个,
该 MongoDB 实例为此需要维护的内存数至少为:
750 × 默认10MB = 7.5 GB

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.
