Macのコンテンツキャッシュのメトリック
コンテンツキャッシュは、メトリックを
/ライブラリ/Application Support/Apple/AssetCache/Metricsフォルダに保存します。
メトリックはキャッシュコンテンツと一緒に移動するのではなく、常にこの場所に保存されます。例えば、キャッシュを
/ライブラリ/Application Support/Apple/AssetCache/Data
から
/ボリューム/データ/ライブラリ/Application Support/Apple/AssetCache/Data
に移動しても、メトリックは
/ライブラリ/Application Support/Apple/AssetCache/Metricsに保存されたままになります
Macでコンテンツキャッシュが使用されたことがある場合、このフォルダにはMetrics.dbという名前のファイルが含まれ、同様の名前を持つ1つ以上のほかのファイルが含まれる場合があります。これらのファイルは、読み取り可能なSQLiteデータベースを構成します。
メトリックを記述するCoreDataオブジェクトモデルは、/usr/libexec/AssetCache/AssetCache.momdの「Metric」エンティティとして使用できます。
注記: これはここでのバージョン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 | コンテンツキャッシュがレポート期間中にキャッシュから消去し、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、サービスを利用できません)。 |
結果をグループ化する
上記の項目のいくつかをグループ化すると役立つ場合があります。以下にいくつかの提案を示します。すべてのコンテンツは整数ベースです。
コンテンツ | グループ化するオブジェクト | 説明 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
アップロード済みバイト数 | bytesImportedBy*の合計 | レポート期間中にコンテンツキャッシュからアップロードされたデータ量。 | |||||||||
キャッシュから提供されたバイト数 | bytesFromCacheTo*の合計 | コンテンツキャッシュがレポート期間中にそのキャッシュから提供したデータ量。この値と「提供済みバイト数」の値が近いほど、コンテンツキャッシュの効果が高いことになります。 | |||||||||
クライアントに提供されたバイト数 | bytesFrom*ToClientの合計 | コンテンツキャッシュがレポート期間中にクライアントAppleデバイスに提供したデータ量。 | |||||||||
ソースから提供されたバイト数 | bytesFromOriginTo*の合計 | コンテンツキャッシュがレポート期間中にインターネット経由でダウンロードしたデータ量。 | |||||||||
ダウンロード済みバイト数 | bytesFrom <Origin,Parent,Peer>To | コンテンツキャッシュがレポート期間中にインターネット経由かピアまたは親からダウンロードしたデータ量。 | |||||||||
ピアから提供されたバイト数 | bytesFromPeerTo*の合計 | コンテンツキャッシュがレポート期間中にそのピアコンテンツキャッシュのいずれかからダウンロードしたデータ量。 | |||||||||
ピアに提供されたバイト数 | bytesFrom*ToPeerの合計 | コンテンツキャッシュがレポート期間中にそのピアコンテンツキャッシュのいずれかに提供したデータ量。 | |||||||||
子に提供されたバイト数 | bytesFrom*ToChildの合計 | コンテンツキャッシュがレポート期間中にその子コンテンツキャッシュのいずれかに提供したデータ量。 | |||||||||
親から提供されたバイト数 | bytesFromParentTo*の合計 | コンテンツキャッシュがレポート期間中にその親コンテンツキャッシュのいずれかからダウンロードしたデータ量。 | |||||||||
提供済みバイト数 | コンテンツキャッシュがレポート期間中に提供したデータの総量。この値が0以外の場合は、コンテンツキャッシュが動作しています。 | bytesFrom*To*の合計 |
キャッシュプレッシャーデータを取得する
レポート期間中に、コンテンツキャッシュが緊急に必要としたストレージ領域の量を確認できます。キャッシュプレッシャーは低い方が望ましいです。
アクティビティモニタでは、キャッシュプレッシャーが以下のように計算されます:
requestsRejectedForNoSpace > 0の場合は100%
bytesPurgedYoungerThan1Day > 0の場合は80%
bytesPurgedYoungerThan7Days > 0の場合は60%
bytesPurgedYoungerThan30Days > 0の場合は40%
bytesPurgedTotal > 0の場合は20%
それ以外の場合は0%
アクティビティモニタは、上記の項目を次のように照合します。例えば、1つの期間より長い時間間隔で値を計算します。
バイト数、読み込み数、要求の数、または応答の数の場合は、それらを時間間隔で合計します。
キャッシュプレッシャーの場合は、時間間隔全体の最大値を計算します。
メトリックデータベースを読み取るためのサンプルコード
#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
}
}