문제
장기 실행 작업이 있는 애플리케이션에서 PHP 에이전트를 사용하면 메모리 사용량이 높아집니다.
해결책
분산 추적을 지원하기 위해 PHP 에이전트는 실행 시간에 상당한 양의 함수 호출 데이터를 유지해야 스팬이 가능한 한 정확하게 샘플링될 수 있습니다. 웹 트랜잭션 및 더 짧은 백그라운드 트랜잭션의 경우 CPU 및 메모리 오버헤드 측면에서 일반적으로 눈에 띄지 않습니다. 그러나 더 긴 백그라운드 트랜잭션의 경우 메모리 부족 상태가 발생하는 지점까지 증가된 메모리 오버헤드가 눈에 띄게 나타날 수 있습니다.
영향을 받는 트랜잭션이 메시지 대기열 소비자 또는 여러 외부 호출이 있는 루프와 같이 일련의 반복 프로세스를 수행하는 트랜잭션인 경우 각 반복을 별도의 트랜잭션으로 수동으로 계측할 수 있습니다. 이렇게 하면 각 트랜잭션 후에 사용된 메모리가 해제됩니다.
트랜잭션을 수동으로 시작 및 중지하면 다음과 같은 이점이 있습니다.
- 모든 PHP 에이전트 기능이 활성화된 상태로 유지되도록 허용합니다.
- 프로세스 작동 방식에 대한 보다 세분화된 데이터를 제공합니다.
이를 구현하려면 먼저 newrelic_end_transaction()
사용한 초기 자동 트랜잭션을 무시한 다음 newrelic_start_transaction()
및 newrelic_end_transaction()
사용하여 각 트랜잭션을 차례로 계측합니다.
다음 코드 샘플은 이 작업을 수행하는 방법을 보여줍니다. 실제 코드에서는 while()
구조를 적절한 PHP 루핑 문으로 교체하고 줄임표 위치에 함수 논리를 삽입합니다.
function example_long_task() { // Ensure PHP agent is available and // stop recording the current transaction if (extension_loaded('newrelic')) { newrelic_end_transaction(); }
// replace next while statement with actual loop while (<condition>) { if (extension_loaded('newrelic')) { // start recording a new transaction newrelic_start_transaction(ini_get("newrelic.appname")); transaction }
// your function logic starts ... ... // your function logic stops
// end transaction for current loop if (extension_loaded('newrelic')) { newrelic_end_transaction(); } }}