getUsage () 는 현재 프로세스 또는 자식 프로세스의 리소스 사용을 얻는 PHP 기본 기능입니다. 사용자/커널 상태 CPU 시간, 메모리 페이지 고장, 컨텍스트 전환 시간 등과 같은 여러 시스템 수준에서 데이터를 포함하는 배열을 반환합니다.
$usage = getrusage();
일반적으로 사용되는 여러 분야는 다음과 같습니다.
ru_utime.tv_sec 및 ru_utime.tv_usec : 사용자 상태에 의해 소비 된 시간 (초 및 마이크로 초)
ru_stime.tv_sec 및 ru_stime.tv_usec : 시스템 상태에서 소비 된 시간 (초 및 마이크로 초)
RU_MINFLT : 디스크에서 호출 할 필요가없는 페이지 오류 수 (소프트 페이지 누락)
ru_majflt : 디스크에서 호출 된 페이지 오류 수 (하드 누락 페이지)
ru_nvcsw 및 ru_nivcsw : 자발적이고 비자발적 인 맥락 전환 시간
시스템에 대한 데이터베이스 쿼리의 영향을 모니터링하는 가장 직접적인 방법은 다음과 같습니다.
로그 query 전에 gettrusage () ;
쿼리 실행;
쿼리 후 gettrusage ()를 다시 기록합니다.
두 레코드의 차이점을 비교하십시오.
샘플 코드는 다음과 같습니다.
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;
}
이 방법을 사용하면 정상 논리를 방해하지 않고 시스템 리소스에 대한 쿼리의 영향을 지속적으로 수집하여 후속 최적화의 기초를 제공 할 수 있습니다.
다른 지수 구조의 영향의 비교
동일한 조건과 다른 인덱스 구조를 가진 쿼리를 사용하여 시스템 리소스 사용량을 비교하면 인덱스 조정이 효과적인 지 직관적으로 평가할 수 있습니다.
배치 쿼리 또는 빅 데이터 페이징 성능을 모니터링하십시오
Pagination 또는 Batch 쿼리에 직면하여 Ru_majflt 및 Ru_nvcsw 가 성장하는지 여부를 관찰하면 쿼리가 많은 메모리 페이징 또는 컨텍스트 전환을 유발하는지 여부를 결정할 수 있습니다.
스트레스 테스트에서 자원 사용 비교
Apache Benchmark, JMeter 등과 같은 도구와 협력하여 동시 테스트를 수행하고 자원 점유를 기록하며 높은 부하에서 시스템의 성능을 분석합니다.
디버깅 중에 브라우저에서 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);