시작하기 전에 제 동료인 마이클 니칭거의 블로그를 소개해 드리면, nginx 및 PHP-FPM을 사용하지 않는 경우 기본 PHP 및 Couchbase 환경을 설정하는 가장 좋은 방법에 대해 배울 수 있습니다:
http://nitschinger.at/Getting-Started-with-Couchbase-and-PHP
최근 많은 사람들이 nginx 및 php-FPM과 함께 Couchbase PHP SDK를 사용하는 것을 보고 있습니다. 그러나 이러한 사용자들 사이에서 몇 가지 반복되는 문제가 있었는데, 이 글에서 이 문제를 해결하고자 합니다!
발생할 수 있는 문제는 FPM을 통해 Couchbase에 대한 연결 수를 제어할 수 없다는 것입니다. PHP 하위 프로세스의 수에 따라 달라질 수 있습니다. 사실; FPM에서는 프로세스 수만큼 Couchbase에 대한 연결이 필요하지 않습니다.
성능에 큰 영향을 미치는 것을 알 수 있습니다. FPM max_children이 300으로 설정되어 있고 부하가 걸리면 300개의 PHP 프로세스가 실행되고 각 프로세스에는 4개의 퍼시스턴트 CouchbaseClient 인스턴스가 있을 수 있다고 가정해 봅시다. 16대의 머신에서 이는 거의 20,000개의 클라이언트 객체에 해당합니다. 이러한 여러 병렬 FPM 프로세스는 하나의 Couchbase 연결을 공유할 수 없으며, 이것이 우리의 주요 문제입니다. 또 다른 문제는 300개 프로세스에 도달하면 이러한 연결이 끊어지고 다시 시작된다는 것입니다. 이는 비용이 많이 들기 때문에 피하고 싶은 문제입니다.
한 걸음 물러서서 문제의 근원으로 돌아가 보겠습니다. 카우치베이스 스마트 클라이언트는 토폴로지 변경에 대한 알림을 받기 위해 클러스터 REST 관리자에 대한 연결을 열어 둡니다. 이는 일반적으로 제한된 수의 프로세스를 사용하는 대부분의 언어에서 잘 작동하며, 각 프로세스에 2~3개의 객체만 사용하므로 각 서버에는 클러스터에 대한 이러한 연결이 5개만 있을 수 있습니다. 그러나 FPM을 사용하는 PHP 배포에서는 일반적으로 약 2000개의 프로세스를 스핀업하고 각 프로세스에 _ONE_ Couchbase 개체만 사용하는 경우 각 서버는 REST 서버에 대한 연결 2k를 차지하게 됩니다.
하지만 이러한 문제를 해결할 수 있는 몇 가지 방법이 있습니다. 한 가지 방법은 카우치베이스 구성 캐시 (PHP SDK v1.1.5 이상에서 사용 가능). config_cache를 사용할 때 새 클라이언트 인스턴스를 만들면 먼저 클러스터 구성의 캐시된 버전을 찾고, 이를 찾으면 노드에 구성에 대해 전혀 쿼리하지 않고 캐시된 값만 사용합니다. 캐시된 구성을 통해 연결할 수 없는 경우에만 코드에서 생성자에게 전달한 Couchbase 노드 중 하나에 대한 연결(포트 8091, HTTP 사용)이 열립니다.
config_cache는 라이브러리가 클러스터 토폴로지가 포함된 파일을 저장할 수 있는 디렉터리의 선택적 경로입니다. (구성을 다운로드하기 위해 매번 REST 서버에 연결하는 대신 구성을 캐시하는 데 사용됩니다.) 연결 캐시를 활성화하려면 다음 행을 Couchbase.ini file:
카우치베이스.config_cache = "/경로/투/어떤/디렉토리"
구성 캐시에 대한 자세한 내용은 여기에서 확인할 수 있습니다: http://www.couchbase.com/wiki/display/couchbase/libcouchbase+configuration+cache
Config_Cache를 활용하면 연결의 약 ¾을 제거하여 리소스를 절약하고 문제를 부분적으로 해결할 수 있습니다. 영구 연결도 더 많이 공유되므로 효율성을 높일 수 있습니다. 최대_자녀 수를 줄이고 최대_요청 수를 늘려서 병렬 프로세스를 너무 많이 실행하지 않도록 FPM 구성을 변경할 수도 있습니다. 시간이 지남에 따라 PHP 프로세스에 어떤 종류의 메모리 팽창이 나타나는지에 따라 pm.max_requests 값을 300에서 3000 또는 5000으로 조정하면 이러한 클라이언트 객체를 다시 생성해야 하는 횟수도 줄일 수 있습니다. 또한 pm.max_children의 수를 100개 정도로 줄일 수도 있습니다.
참고할 수 있도록 샘플 FPM.conf 파일을 살펴보세요: https://gist.github.com/rbin/82e47f7f75f2072f02fd