Mac의 콘텐츠 캐싱 지표
콘텐츠 캐싱은 지표를 다음 폴더에 저장합니다.
/Library/Application Support/Apple/AssetCache/Metrics
지표는 캐시된 콘텐츠와 이동하지 않고 항상 이 위치에 저장됩니다. 예를 들어 캐시를
/Library/Application Support/Apple/AssetCache/Data
경로에서
/Volumes/Data/Library/Application Support/Apple/AssetCache/Data로 이동해도
지표는 계속 다음 디렉토리에 저장됩니다.
/Library/Application Support/Apple/AssetCache/Metrics
Mac에서 콘텐츠 캐싱이 사용된 적 있다면 이 폴더는 Metrics.db라는 이름의 파일을 포함하고 비슷한 이름의 파일을 한 개 이상 포함하고 있을 수 있습니다. 이 파일들은 읽을 수 있는 SQLite 데이터베이스를 구성합니다.
지표를 설명하는 CoreData 대상체 모델은 /usr/libexec/AssetCache/AssetCache.momd에서 ‘지표’ 엔티티로 사용할 수 있습니다.
참고: 여기에서는 버전 7 모델에 대해 설명하고 있지만 Apple은 공지 없이 macOS의 향후 릴리즈에서 이 모델을 변경하거나 SQLite 이외의 데이터베이스를 사용할 수 있습니다. 이러한 경우 캐싱 콘텐츠 데이터를 집계하도록 구성한 모든 스크립트를 업데이트해야 할 수 있습니다.
콘텐츠 캐시는 다음과 같은 특징이 있습니다.
실행 시 분마다 데이터베이스에 새로운 행을 추가합니다.
대기 시 ‘모두 0’인 행을 추가하지 않고 바로 건너뜁니다.
기존 행을 수정하지 않습니다.
30일이 지난 행을 주기적으로 삭제합니다.
팁: MetricsInterval
고급 설정에서는 보고 기간을 60초에서 다른 값으로 변경할 수 있고, MetricsMaxAge
고급 설정에서는 저장된 행의 최대 사용 기간을 30일에서 다른 값으로 변경할 수 있습니다.
데이터베이스의 각 행에는 다음 열이 포함되어 있습니다. creationDate
를 제외한 모든 대상체는 선택사항입니다.
대상체 | 설명 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
bytesDropped | 보고 기간 동안 콘텐츠 캐시에서 다운로드했지만 캐시에 추가하지 못한 데이터의 크기입니다. | ||||||||||
bytesFromCacheToChild | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromCacheToClient | 보고 기간 동안 클라이언트 Apple 기기가 자체 캐시에서 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromCacheToPeer | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 피어 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromOriginToChild | 보고 기간 동안 콘텐츠 캐시가 인터넷을 통해 다운로드하고 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromOriginToClient | 보고 기간 동안 클라이언트 Apple 기기가 인터넷을 통해 다운로드하고 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromOriginToPeer | 보고 기간 동안 콘텐츠 캐시가 인터넷을 통해 다운로드하고 피어 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromParentToChild | 보고 기간 동안 콘텐츠 캐시가 상위 콘텐츠 캐시에서 다운로드하고 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromParentToClient | 보고 기간 동안 클라이언트 Apple 기기가 상위 콘텐츠 캐시에서 다운로드하고 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromParentToPeer | 보고 기간 동안 콘텐츠 캐시가 상위 콘텐츠 캐시에서 다운로드하고 피어 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromPeerToChild | 보고 기간 동안 콘텐츠 캐시가 피어 콘텐츠 캐시에서 받고 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesFromPeerToClient | 보고 기간 동안 클라이언트 Apple 기기가 피어 콘텐츠 캐시에서 받고 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. | ||||||||||
bytesImportedByHTTP | 보고 기간 동안 콘텐츠 캐시가 HTTP를 통해 받은 데이터의 크기입니다. | ||||||||||
bytesImportedByXPC | 보고 기간 동안 콘텐츠 캐시가 XPC를 통해 받은 데이터의 크기입니다. | ||||||||||
bytesPurgedTotal | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 제거한 데이터의 크기입니다. bytesPurgedYoungerThan30Days를 포함합니다. | ||||||||||
bytesPurgedYoungerThan1Day | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 제거한 데이터의 크기이며, 이는 캐시에 추가된 지 1일이 지나지 않았습니다. | ||||||||||
bytesPurgedYoungerThan30Days | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 제거한 데이터의 크기이며, 이는 캐시에 추가된 지 30일이 지나지 않았습니다. bytesPurgedYoungerThan7Days를 포함합니다. | ||||||||||
bytesPurgedYoungerThan7Days | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 제거한 데이터의 크기이며, 이는 캐시에 추가된 지 7일이 지나지 않았습니다. bytesPurgedYoungerThan1Day를 포함합니다. | ||||||||||
creationDate | 이 지표 대상체가 수집된 날짜입니다. 이 지표 항목은 creationDate에 종료되는 기간까지 콘텐츠 캐시의 성능을 설명합니다. | ||||||||||
importsByHTTP | 보고 기간 동안 콘텐츠 캐시가 HTTP를 통해 받은 업로드 요청 수입니다. | ||||||||||
importsByXPC | 보고 기간 동안 콘텐츠 캐시가 XPC를 통해 받은 업로드 요청 수입니다. | ||||||||||
period | creationDate에 종료되는 보고 기간의 지속 시간(초)입니다. | ||||||||||
repliesFromCacheToChild | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromCacheToClient | 보고 기간 동안 클라이언트 Apple 기기가 자체 캐시에서 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromCacheToPeer | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 피어 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromOriginToChild | 보고 기간 동안 콘텐츠 캐시가 인터넷을 통해 다운로드하고 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromOriginToClient | 보고 기간 동안 클라이언트 Apple 기기가 인터넷을 통해 다운로드하고 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromOriginToPeer | 보고 기간 동안 콘텐츠 캐시가 인터넷을 통해 다운로드하고 피어 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromParentToChild | 보고 기간 동안 콘텐츠 캐시가 상위 콘텐츠 캐시에서 다운로드하고 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromParentToClient | 보고 기간 동안 Apple 기기가 상위 콘텐츠 캐시에서 다운로드하고 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromParentToPeer | 보고 기간 동안 콘텐츠 캐시가 상위 콘텐츠 캐시에서 다운로드하고 피어 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromPeerToChild | 보고 기간 동안 콘텐츠 캐시가 피어 콘텐츠 캐시에서 받고 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
repliesFromPeerToClient | 보고 기간 동안 클라이언트 Apple 기기가 피어 콘텐츠 캐시에서 받고 하위 콘텐츠 캐시로 제공한 응답 수입니다. | ||||||||||
requestsFromChild | 보고 기간 동안 콘텐츠 캐시가 하위 콘텐츠 캐시에서 받은 다운로드 요청 수입니다. | ||||||||||
requestsFromClient | 보고 기간 동안 클라이언트 Apple 기기가 하위 콘텐츠 캐시에서 받은 다운로드 요청 수입니다. | ||||||||||
requestsFromPeer | 보고 기간 동안 콘텐츠 캐시가 피어 콘텐츠 캐시에서 받은 다운로드 요청 수입니다. | ||||||||||
requestsRejectedForNoSpace | 보고 기간 동안 콘텐츠 캐시가 높은 캐시 압력(HTTP 응답 코드 503, Service Unavailable 수신)으로 인해 거부한 다운로드 요청 수 입니다. |
그룹 결과
위 항목 중 일부를 그룹화하면 유용할 수 있습니다. 다음은 몇 가지 제안 사항입니다. 모든 콘텐츠는 정수 기반입니다.
콘텐츠 | 그룹화된 대상체 | 설명 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
다운로드된 바이트 | bytesFrom <Origin,Parent,Peer>To | 보고 기간 동안 콘텐츠 캐시가 인터넷을 통해 다운로드하거나 피어 또는 상위 콘텐츠 캐시에서 다운로드한 데이터의 크기입니다. | |||||||||
상위에서 제공된 바이트 | bytesFromParentTo* 합계 | 보고 기간 동안 콘텐츠 캐시가 모든 상위 콘텐츠 캐시에서 다운로드한 데이터의 크기입니다. | |||||||||
업로드된 바이트 | bytesImportedBy* 합계 | 보고 기간 동안 콘텐츠 캐시를 통해 업로드한 데이터의 크기입니다. | |||||||||
원본에서 제공된 바이트 | bytesFromOriginTo* 합계 | 보고 기간 동안 콘텐츠 캐시가 인터넷을 통해 다운로드한 데이터의 크기입니다. | |||||||||
제공된 바이트 | 보고 기간 동안 콘텐츠 캐시가 제공한 데이터의 총 크기입니다. 크기가 0이 아니면 콘텐츠 캐시의 정상 작동을 의미합니다. | bytesFrom*To* 합계 | |||||||||
캐시에서 제공된 바이트 | bytesFromCacheTo* 합계 | 보고 기간 동안 콘텐츠 캐시가 자체 캐시에서 제공한 데이터의 크기입니다. 이 값이 제공된 바이트의 값에 가까울수록 콘텐츠 캐시가 더 많이 도움이 됩니다. | |||||||||
클라이언트로 제공된 바이트 | bytesFrom*ToClient 합계 | 보고 기간 동안 콘텐츠 캐시가 클라이언트 Apple 기기로 제공한 데이터의 크기입니다. | |||||||||
피어로 제공된 바이트 | bytesFrom*ToPeer 합계 | 보고 기간 동안 콘텐츠 캐시가 모든 피어 콘텐츠 캐시로 제공한 데이터의 크기입니다. | |||||||||
피어에서 제공된 바이트 | bytesFromPeerTo* 합계 | 보고 기간 동안 콘텐츠 캐시가 모든 피어 콘텐츠 캐시에서 다운로드한 데이터의 크기입니다. | |||||||||
하위로 제공된 바이트 | bytesFrom*ToChild 합계 | 보고 기간 동안 콘텐츠 캐시가 모든 하위 콘텐츠 캐시로 제공한 데이터의 크기입니다. |
캐시 압력 데이터 받기
보고 기간 동안 콘텐츠 캐시에 더 많은 저장 공간이 얼마나 긴급하게 필요한지 검토할 수 있습니다. 캐시 압력은 낮을수록 좋습니다.
활성 상태 보기는 다음과 같이 캐시 압력을 계산합니다.
100%: requestsRejectedForNoSpace > 0인 경우
80%: bytesPurgedYoungerThan1Day > 0인 경우
60%: bytesPurgedYoungerThan7Days > 0인 경우
40%: bytesPurgedYoungerThan30Days > 0인 경우
20%: bytesPurgedTotal > 0인 경우
0%: 그 밖의 경우
활성 상태 보기는 또한 위의 항목을 다음과 같이 취합하여 계산합니다(예: 한 기간보다 긴 시간 간격 동안 값을 계산하는 경우).
바이트 수, 가져오기 수, 요청 수 또는 응답 수의 경우, 시간 간격 동안 합산합니다.
캐시 압력의 경우, 시간 간격 동안의 최대값을 계산합니다.
지표 데이터베이스를 읽기 위한 샘플 코드
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
void readMetricsSinceDate(NSDate *date)
{
NSURL *modelURL = [NSURL fileURLWithPath:@"/usr/libexec/AssetCache/AssetCache.momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
if (model == nil) {
// handle the error
}
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSURL *databaseURL = [NSURL fileURLWithPath:@"/Library/Application Support/Apple/AssetCache/Metrics/Metrics.db"];
NSError *storeError = nil;
NSPersistentStore *store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:databaseURL options:@{ NSReadOnlyPersistentStoreOption: @YES } error:&storeError];
if (store == nil) {
// handle the error
}
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.persistentStoreCoordinator = coordinator;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Metric"];
request.predicate = [NSPredicate predicateWithFormat:@"%K > %@", @"creationDate", date];
request.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES] ];
NSError *fetchError = nil;
NSArray *results = [context executeFetchRequest:request error:&fetchError];
if (results == nil) {
// handle the error
}
for (NSManagedObject *result in results) {
NSNumber *bytesDropped = [result valueForKey:@"bytesDropped"];
// ...
NSNumber *requestsRejectedForNoSpace = [result valueForKey:@"requestsRejectedForNoSpace"];
// use the values
}
}