在 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 以外的其他資料庫)而不作另行通知。 這可能要求對你已設定的任何程式碼進行更新,以𢑥集內容快取資料。
內容快取:
為其運行的每一分鐘將新橫列加至資料庫
不會在閒置時加入「全部為零」橫列;其只會跳過加入那些橫列
不指定現有橫列
定期刪除超過 30 日的橫列
貼士:你可以將原本為 60 秒的報告時間更改,方法是更改 MetricsInterval
進階設定,且你可以透過更改 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,無法取得服務)。 |
將結果分組
將上述的部份項目分組可能會對你有用。 以下是一些建議。 所有內容均為整數為基礎。
內容 | 已分組的項目 | 説明 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
已上載的 Byte 數 | bytesImportedBy* 的總和 | 在報告時段透過內容快上載的資料量。 | |||||||||
已下載的 Byte 數 | bytesFrom <Origin,Parent,Peer>To | 在報告時段內容快取透過互聯網,或者從對等點或上層下載的資料量。 | |||||||||
已提供的 Byte 數 | 在報告時段內容快取提供的資料總量。 如果此數值為非零值,代表內容快取正在運作。 | bytesFrom*To* 的總和 | |||||||||
由原始點提供的 Byte 數 | bytesFromOriginTo* 的總和 | 在報告時段內容快取透過互聯網下載的資料量。 | |||||||||
向下層提供的 Byte 數 | bytesFrom*ToChild 的總和 | 在報告時段內容快取向其任何下層內容快取提供的資料量。 | |||||||||
向用户端提供的 Byte 數 | bytesFrom*ToClient 的總和 | 在報告時段內容快取提供給用户端 Apple 裝置的資料量。 | |||||||||
向對等點提供的 Byte 數 | bytesFrom*ToPeer 的總和 | 在報告時段內容快取向其任何對等點內容快取提供的資料量。 | |||||||||
從上層提供的 Byte 數 | bytesFromParentTo* 的總和 | 在報告時段內容快取從其任何上層內容快取下載的資料量。 | |||||||||
從快取提供的 Byte 數 | bytesFromCacheTo* 的總和 | 在報告時段內容快取從其快取提供的資料量。 此數值越接近已提供的 Byte 數值,就代表內容快取的作用越大。 | |||||||||
從對等點提供的 Byte 數 | bytesFromPeerTo* 的總和 | 在報告時段內容快取從其任何對等點內容快取下載的資料量。 |
取得快取壓力資料
你可以檢視在報告時段內容快取對更多儲存空間的急需程度。 快取壓力越低越好。
「活動監視器」會以下列方式計算快取壓力:
requestsRejectedForNoSpace > 0 時為 100%
bytesPurgedYoungerThan1Day > 0 時為 80%
bytesPurgedYoungerThan7Days > 0 時為 60%
bytesPurgedYoungerThan30Days > 0 時為 40%
bytesPurgedTotal > 0 時為 20%
否則為 0%
「活動監視器」也會以下列方式整理上述的項目,例如計算一個時間週期內超過一個時段的值。
針對 Byte 數、輸入項目數量、要求數量或回複數量,將它們在時間週期內相加。
針對快取壓力,計算在時間週期內的最大值。
用於閲讀指標資料庫的範例碼
#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
}
}