현재 위치: > 최신 기사 목록> GetUsage ()를 사용하여 데이터베이스 쿼리 전후에 시스템 압력 변경을 감지하여 성능을 향상시키는 방법은 무엇입니까?

GetUsage ()를 사용하여 데이터베이스 쿼리 전후에 시스템 압력 변경을 감지하여 성능을 향상시키는 방법은 무엇입니까?

M66 2025-06-11

getUsage ()

getUsage () 는 현재 프로세스 또는 자식 프로세스의 리소스 사용을 얻는 PHP 기본 기능입니다. 사용자/커널 상태 CPU 시간, 메모리 페이지 고장, 컨텍스트 전환 시간 등과 같은 여러 시스템 수준에서 데이터를 포함하는 배열을 반환합니다.

 $usage = getrusage();

일반적으로 사용되는 여러 분야는 다음과 같습니다.

  • ru_utime.tv_secru_utime.tv_usec : 사용자 상태에 의해 소비 된 시간 (초 및 마이크로 초)

  • ru_stime.tv_secru_stime.tv_usec : 시스템 상태에서 소비 된 시간 (초 및 마이크로 초)

  • RU_MINFLT : 디스크에서 호출 할 필요가없는 페이지 오류 수 (소프트 페이지 누락)

  • ru_majflt : 디스크에서 호출 된 페이지 오류 수 (하드 누락 페이지)

  • ru_nvcswru_nivcsw : 자발적이고 비자발적 인 맥락 전환 시간


데이터베이스 쿼리 전후에 getUsage ()를 호출하십시오

시스템에 대한 데이터베이스 쿼리의 영향을 모니터링하는 가장 직접적인 방법은 다음과 같습니다.

  1. 로그 query 전에 gettrusage () ;

  2. 쿼리 실행;

  3. 쿼리 후 gettrusage ()를 다시 기록합니다.

  4. 두 레코드의 차이점을 비교하십시오.

샘플 코드는 다음과 같습니다.

 function getResourceUsageDiff($start, $end) {
    $diff = [];
    foreach ($end as $key => $value) {
        if (isset($start[$key])) {
            $diff[$key] = $value - $start[$key];
        }
    }
    return $diff;
}

$before = getrusage();

// 데이터베이스 쿼리 시뮬레이션
$mysqli = new mysqli("localhost", "user", "password", "database");
$result = $mysqli->query("SELECT * FROM users WHERE email LIKE '%@example.com'");

$after = getrusage();

$usageDiff = getResourceUsageDiff($before, $after);

echo "<pre>";
print_r($usageDiff);
echo "
";

이 코드는 쿼리에 의해 생성 된 시스템 리소스의 변경을 출력 할 수 있습니다. 예를 들어 Ru_stime.tv_usec이 크게 증가한 경우 쿼리로 인해 시스템 상태 CPU가 증가하고 많은 I/O 작업이있을 수 있습니다.


보다 직관적 인 디스플레이 : 기능 캡슐화 및 로깅

보다 실용적인 목적을 위해 측정 프로세스는 쿼리 문 및 리소스 변경의 자동 기록을 지원하여 기능으로 캡슐화 될 수 있습니다.

 function profileQuery($query, $mysqli) {
    $before = getrusage();

    $result = $mysqli->query($query);

    $after = getrusage();
    $usageDiff = getResourceUsageDiff($before, $after);

    file_put_contents("/var/log/db_profile.log", json_encode([
        'query' => $query,
        'usage' => $usageDiff,
        'time'  => date('c')
    ]) . PHP_EOL, FILE_APPEND);

    return $result;
}

이 방법을 사용하면 정상 논리를 방해하지 않고 시스템 리소스에 대한 쿼리의 영향을 지속적으로 수집하여 후속 최적화의 기초를 제공 할 수 있습니다.


실제 응용 프로그램 제안

  1. 다른 지수 구조의 영향의 비교
    동일한 조건과 다른 인덱스 구조를 가진 쿼리를 사용하여 시스템 리소스 사용량을 비교하면 인덱스 조정이 효과적인 지 직관적으로 평가할 수 있습니다.

  2. 배치 쿼리 또는 빅 데이터 페이징 성능을 모니터링하십시오
    Pagination 또는 Batch 쿼리에 직면하여 Ru_majfltRu_nvcsw 가 성장하는지 여부를 관찰하면 쿼리가 많은 메모리 페이징 또는 컨텍스트 전환을 유발하는지 여부를 결정할 수 있습니다.

  3. 스트레스 테스트에서 자원 사용 비교
    Apache Benchmark, JMeter 등과 같은 도구와 협력하여 동시 테스트를 수행하고 자원 점유를 기록하며 높은 부하에서 시스템의 성능을 분석합니다.


추가 : Beautify Output (디버깅 용)

디버깅 중에 브라우저에서 getTrusage () 의 변경 사항을보다 명확하게 보려면 다음 코드를 사용하여 출력을 포맷 할 수 있습니다.

 function formatUsage(array $usage) {
    return sprintf(
        "User CPU: %.4fs, System CPU: %.4fs, Major Faults: %d, Voluntary CS: %d",
        $usage['ru_utime.tv_sec'] + $usage['ru_utime.tv_usec'] / 1e6,
        $usage['ru_stime.tv_sec'] + $usage['ru_stime.tv_usec'] / 1e6,
        $usage['ru_majflt'] ?? 0,
        $usage['ru_nvcsw'] ?? 0
    );
}

echo formatUsage($usageDiff);