• EnglishEspañol日本語한국어Português
  • 로그인지금 시작하기

사용자의 편의를 위해 제공되는 기계 번역입니다.

영문본과 번역본이 일치하지 않는 경우 영문본이 우선합니다. 보다 자세한 내용은 이 페이지를 방문하시기 바랍니다.

문제 신고

장기 실행 PHP 작업에서 높은 메모리 로드

문제

장기 실행 작업이 있는 애플리케이션에서 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();
}
}
}
Copyright © 2024 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.