Chromium Code Reviews| Index: components/web_cache/browser/web_cache_manager.cc |
| diff --git a/components/web_cache/browser/web_cache_manager.cc b/components/web_cache/browser/web_cache_manager.cc |
| index 97d1e196e632100490bb7342c69697b5d444e32e..fe215e6a3c3da7fe78c6e1f13ff121b27c700c23 100644 |
| --- a/components/web_cache/browser/web_cache_manager.cc |
| +++ b/components/web_cache/browser/web_cache_manager.cc |
| @@ -135,21 +135,15 @@ void WebCacheManager::ObserveActivity(int renderer_id) { |
| } |
| void WebCacheManager::ObserveStats(int renderer_id, |
| - uint64_t min_dead_capacity, |
| - uint64_t max_dead_capacity, |
| uint64_t capacity, |
| - uint64_t live_size, |
| - uint64_t dead_size) { |
| + uint64_t size) { |
| StatsMap::iterator entry = stats_.find(renderer_id); |
| if (entry == stats_.end()) |
| return; // We might see stats for a renderer that has been destroyed. |
| // Record the updated stats. |
| entry->second.capacity = capacity; |
| - entry->second.dead_size = dead_size; |
| - entry->second.live_size = live_size; |
| - entry->second.max_dead_capacity = max_dead_capacity; |
| - entry->second.min_dead_capacity = min_dead_capacity; |
| + entry->second.size = size; |
| } |
| void WebCacheManager::SetGlobalSizeLimit(uint64_t bytes) { |
| @@ -199,62 +193,47 @@ uint64_t WebCacheManager::GetDefaultGlobalSizeLimit() { |
| void WebCacheManager::GatherStats(const std::set<int>& renderers, |
| uint64_t* capacity, |
| - uint64_t* live_size, |
| - uint64_t* dead_size) { |
| - *capacity = *live_size = *dead_size = 0; |
| + uint64_t* size) { |
| + *capacity = *size = 0; |
| std::set<int>::const_iterator iter = renderers.begin(); |
| while (iter != renderers.end()) { |
| StatsMap::iterator elmt = stats_.find(*iter); |
| if (elmt != stats_.end()) { |
| *capacity += elmt->second.capacity; |
| - *live_size += elmt->second.live_size; |
| - *dead_size += elmt->second.dead_size; |
| + *size += elmt->second.size; |
| } |
| ++iter; |
| } |
| } |
| // static |
| -uint64_t WebCacheManager::GetSize(AllocationTactic tactic, |
| - uint64_t live_size, |
| - uint64_t dead_size) { |
| +uint64_t WebCacheManager::GetSize(AllocationTactic tactic, uint64_t size) { |
| switch (tactic) { |
| case DIVIDE_EVENLY: |
| // We aren't going to reserve any space for existing objects. |
| return 0; |
| case KEEP_CURRENT_WITH_HEADROOM: |
| // We need enough space for our current objects, plus some headroom. |
| - return 3 * GetSize(KEEP_CURRENT, live_size, dead_size) / 2; |
| + return 3 * GetSize(KEEP_CURRENT, size) / 2; |
| case KEEP_CURRENT: |
| // We need enough space to keep our current objects. |
| - return live_size + dead_size; |
| - case KEEP_LIVE_WITH_HEADROOM: |
| - // We need enough space to keep out live resources, plus some headroom. |
| - return 3 * GetSize(KEEP_LIVE, live_size, dead_size) / 2; |
| - case KEEP_LIVE: |
| - // We need enough space to keep our live resources. |
| - return live_size; |
| + return size; |
| default: |
| NOTREACHED() << "Unknown cache allocation tactic"; |
| return 0; |
| } |
| } |
| -bool WebCacheManager::AttemptTactic( |
| - AllocationTactic active_tactic, |
| - uint64_t active_live_size, |
| - uint64_t active_dead_size, |
| - AllocationTactic inactive_tactic, |
| - uint64_t inactive_live_size, |
| - uint64_t inactive_dead_size, |
| - AllocationStrategy* strategy) { |
| +bool WebCacheManager::AttemptTactic(AllocationTactic active_tactic, |
| + uint64_t active_used_size, |
| + AllocationTactic inactive_tactic, |
| + uint64_t inactive_used_size, |
| + AllocationStrategy* strategy) { |
| DCHECK(strategy); |
| - uint64_t active_size = GetSize(active_tactic, active_live_size, |
| - active_dead_size); |
| - uint64_t inactive_size = GetSize(inactive_tactic, inactive_live_size, |
| - inactive_dead_size); |
| + uint64_t active_size = GetSize(active_tactic, active_used_size); |
| + uint64_t inactive_size = GetSize(inactive_tactic, inactive_used_size); |
| // Give up if we don't have enough space to use this tactic. |
| if (global_size_limit_ < active_size + inactive_size) |
| @@ -307,8 +286,7 @@ void WebCacheManager::AddToStrategy(const std::set<int>& renderers, |
| // Add in the space required to implement |tactic|. |
| StatsMap::iterator elmt = stats_.find(*iter); |
| if (elmt != stats_.end()) { |
| - cache_size += GetSize(tactic, elmt->second.live_size, |
| - elmt->second.dead_size); |
| + cache_size += GetSize(tactic, elmt->second.size); |
| } |
| // Record the allocation in our strategy. |
| @@ -327,25 +305,12 @@ void WebCacheManager::EnactStrategy(const AllocationStrategy& strategy) { |
| // This is the capacity this renderer has been allocated. |
| uint64_t capacity = allocation->second; |
| - // We don't reserve any space for dead objects in the cache. Instead, we |
| - // prefer to keep live objects around. There is probably some performance |
| - // tuning to be done here. |
| - uint64_t min_dead_capacity = 0; |
| - |
| - // We allow the dead objects to consume up to half of the cache capacity. |
| - uint64_t max_dead_capacity = capacity / 2; |
| - if (base::SysInfo::IsLowEndDevice()) { |
| - max_dead_capacity = std::min(static_cast<uint64_t>(512 * 1024u), |
| - max_dead_capacity); |
| - } |
| - |
| // Find the WebCachePtr by renderer process id. |
| auto it = web_cache_services_.find(allocation->first); |
| DCHECK(it != web_cache_services_.end()); |
| const mojom::WebCachePtr& service = it->second; |
| DCHECK(service); |
| - service->SetCacheCapacities(min_dead_capacity, max_dead_capacity, |
| - capacity); |
| + service->SetCacheCapacity(capacity); |
| } |
| ++allocation; |
| } |
| @@ -383,27 +348,19 @@ void WebCacheManager::ReviseAllocationStrategy() { |
| FindInactiveRenderers(); |
| // Gather statistics |
| - uint64_t active_capacity, active_live_size, active_dead_size, |
| - inactive_capacity, inactive_live_size, inactive_dead_size; |
| - GatherStats(active_renderers_, &active_capacity, &active_live_size, |
| - &active_dead_size); |
| - GatherStats(inactive_renderers_, &inactive_capacity, &inactive_live_size, |
| - &inactive_dead_size); |
| + uint64_t active_capacity, active_size, inactive_capacity, inactive_size; |
| + GatherStats(active_renderers_, &active_capacity, &active_size); |
| + GatherStats(inactive_renderers_, &inactive_capacity, &inactive_size); |
| UMA_HISTOGRAM_COUNTS_100("Cache.ActiveTabs", active_renderers_.size()); |
| UMA_HISTOGRAM_COUNTS_100("Cache.InactiveTabs", inactive_renderers_.size()); |
| UMA_HISTOGRAM_MEMORY_MB("Cache.ActiveCapacityMB", |
| active_capacity / 1024 / 1024); |
| - UMA_HISTOGRAM_MEMORY_MB("Cache.ActiveDeadSizeMB", |
|
bashi
2016/11/25 07:04:35
nit: Shouldn't we deprecate this metric in histogr
hiroshige
2016/11/25 09:03:19
There are no corresponding entries for these UMAs
|
| - active_dead_size / 1024 / 1024); |
| - UMA_HISTOGRAM_MEMORY_MB("Cache.ActiveLiveSizeMB", |
| - active_live_size / 1024 / 1024); |
| + UMA_HISTOGRAM_MEMORY_MB("Cache.ActiveLiveSizeMB", active_size / 1024 / 1024); |
| UMA_HISTOGRAM_MEMORY_MB("Cache.InactiveCapacityMB", |
| inactive_capacity / 1024 / 1024); |
| - UMA_HISTOGRAM_MEMORY_MB("Cache.InactiveDeadSizeMB", |
|
bashi
2016/11/25 07:04:35
Same as Cache.ActiveDeadSizeMB
hiroshige
2016/11/25 09:03:19
ditto.
|
| - inactive_dead_size / 1024 / 1024); |
| UMA_HISTOGRAM_MEMORY_MB("Cache.InactiveLiveSizeMB", |
| - inactive_live_size / 1024 / 1024); |
| + inactive_size / 1024 / 1024); |
| // Compute an allocation strategy. |
| // |
| @@ -420,30 +377,21 @@ void WebCacheManager::ReviseAllocationStrategy() { |
| // we've found a workable strategy. |
| AllocationStrategy strategy; |
| if ( // Ideally, we'd like to give the active renderers some headroom and |
| - // keep all our current objects. |
| - AttemptTactic(KEEP_CURRENT_WITH_HEADROOM, active_live_size, |
| - active_dead_size, KEEP_CURRENT, inactive_live_size, |
| - inactive_dead_size, &strategy) || |
| - // If we can't have that, then we first try to evict the dead objects in |
| - // the caches of inactive renderers. |
| - AttemptTactic(KEEP_CURRENT_WITH_HEADROOM, active_live_size, |
| - active_dead_size, KEEP_LIVE, inactive_live_size, |
| - inactive_dead_size, &strategy) || |
| - // Next, we try to keep the live objects in the active renders (with some |
| - // room for new objects) and give whatever is left to the inactive |
| + // keep all our current objects. |
| + AttemptTactic(KEEP_CURRENT_WITH_HEADROOM, active_size, KEEP_CURRENT, |
| + inactive_size, &strategy) || |
| + // Next, we try to keep the current objects in the active renders (with |
| + // some room for new objects) and give whatever is left to the inactive |
| // renderers. |
| - AttemptTactic(KEEP_LIVE_WITH_HEADROOM, active_live_size, |
| - active_dead_size, DIVIDE_EVENLY, inactive_live_size, |
| - inactive_dead_size, &strategy) || |
| + AttemptTactic(KEEP_CURRENT_WITH_HEADROOM, active_size, DIVIDE_EVENLY, |
| + inactive_size, &strategy) || |
| // If we've gotten this far, then we are very tight on memory. Let's try |
| // to at least keep around the live objects for the active renderers. |
| - AttemptTactic(KEEP_LIVE, active_live_size, active_dead_size, |
| - DIVIDE_EVENLY, inactive_live_size, inactive_dead_size, |
| + AttemptTactic(KEEP_CURRENT, active_size, DIVIDE_EVENLY, inactive_size, |
| &strategy) || |
| // We're basically out of memory. The best we can do is just divide up |
| // what we have and soldier on. |
| - AttemptTactic(DIVIDE_EVENLY, active_live_size, active_dead_size, |
| - DIVIDE_EVENLY, inactive_live_size, inactive_dead_size, |
| + AttemptTactic(DIVIDE_EVENLY, active_size, DIVIDE_EVENLY, inactive_size, |
| &strategy)) { |
| // Having found a workable strategy, we enact it. |
| EnactStrategy(strategy); |