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 天的橫列
【提示】你可以透過更改 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 | 在回報期間從其快取清除的內容快取資料量,此資料量加入快取的時間為不到一天前。 | ||||||||||
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 數 | bytesFrom <Origin,Parent,Peer>To | 在回報期間透過網際網路或是從對等點或上層下載的內容快取資料量。 | |||||||||
已上傳的 Byte | bytesImportedBy* 的總和 | 在回報期間透過內容快取上傳的資料量。 | |||||||||
從上層提供的 Byte 數 | bytesFromParentTo* 的總和 | 在回報期間從其任一上層內容快取下載的內容快取資料量。 | |||||||||
從快取提供的 Byte 數 | bytesFromCacheTo* 的總和 | 在回報期間從其快取提供的內容快取資料量。此值越接近「提供的 Byte 數」值,內容快取的幫助越大。 | |||||||||
從來源提供的 Byte 數 | bytesFromOriginTo* 的總和 | 在回報期間透過網際網路下載的內容快取資料量。 | |||||||||
從對等點提供的 Byte 數 | bytesFromPeerTo* 的總和 | 在回報期間從其任一對等點內容快取下載的內容快取資料量。 | |||||||||
提供的 Byte 數 | 在回報期間提供的內容快取總資料量。如果此值不是零,表示內容快取運作中。 | bytesFrom*To* 的總和 | |||||||||
提供給子項目的 Byte 數 | bytesFrom*ToChild 的總和 | 在回報期間提供給其任一子內容快取的內容快取資料量。 | |||||||||
提供給用戶端的 Byte 數 | bytesFrom*ToClient 的總和 | 在回報期間提供到用戶端 Apple 裝置的內容快取資料量。 | |||||||||
提供給對等點的 Byte 數 | bytesFrom*ToPeer 的總和 | 在回報期間提供給其任一對等點內容快取的內容快取資料量。 |
取得快取壓力資料
你可以檢視報告期間內容快取需要更多存儲空間的緊迫程度。快取壓力越低越好。
「活動監視器」計算快取壓力的方式如下:
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
}
}