Commit dd60a7b7 authored by Francois Doray's avatar Francois Doray Committed by Commit Bot

[extensions] Add feature param to control the delay to suspend an extension event page.

Intensive wake up throttling limits wake ups from Javascript timers to
1 per minute for pages that have been backgrounded for 5 minutes. A
side-effect of this change is that pages that used to cause frequent
extension messages (e.g. navigation commit) now cause extension messages
only once per minute. Because extension processes can be terminated after
15 seconds of inactivity, keeping most pages idle for 1-minute intervals
*increases* extension process churn (extensions processes that were
kept alive permanently by frequent messages are now recreated every
minute).

This CL adds a feature param to control the inactivity delay to
terminate an extension page. We plan to experiment with a 65 seconds
delay (slightly longer than the intensive wake up throttling delay) and
assess impact on resource consumption (CPU + memory + power).

Bug: 1144166
Change-Id: If7b797f375b4ad37c753b8b43e32898e197a91ee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2510431
Commit-Queue: François Doray <fdoray@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#823421}
parent 8eb63210
......@@ -9,6 +9,7 @@
#include <vector>
#include "base/bind.h"
#include "base/feature_list.h"
#include "base/guid.h"
#include "base/location.h"
#include "base/logging.h"
......@@ -58,14 +59,39 @@ namespace extensions {
namespace {
// The time to delay between an extension becoming idle and
// sending a ShouldSuspend message.
unsigned g_event_page_idle_time_msec = 10000;
// Feature to control the delay between an extension becoming idle and sending a
// ShouldSuspend message.
const base::Feature kChangeExtensionEventPageSuspendDelay{
"ChangeExtensionEventPageSuspendDelay", base::FEATURE_DISABLED_BY_DEFAULT};
// The delay between an extension becoming idle and sending a ShouldSuspend
// message. The default value is used when the
// |kChangeExtensionEventPageSuspendDelay| feature is disabled.
//
// TODO(crbug.com/1144166): Cleanup the feature param after experiments with a
// longer delay are complete.
const base::FeatureParam<int> kEventPageSuspendDelayMs{
&kChangeExtensionEventPageSuspendDelay, "event-page-suspend-delay-ms",
10000};
// Overrides |kEventPageSuspendDelayMs| if not -1. For testing.
constexpr int kInvalidSuspendDelay = -1;
int g_event_page_suspend_delay_ms_for_testing = kInvalidSuspendDelay;
// The time to delay between sending a ShouldSuspend message and
// sending a Suspend message.
unsigned g_event_page_suspending_time_msec = 5000;
// Returns the delay between an extension becoming idle and sending a
// ShouldSuspend message, taking into account experiments and testing overrides.
base::TimeDelta GetEventPageSuspendDelay() {
if (g_event_page_suspend_delay_ms_for_testing != kInvalidSuspendDelay) {
return base::TimeDelta::FromMilliseconds(
g_event_page_suspend_delay_ms_for_testing);
}
return base::TimeDelta::FromMilliseconds(kEventPageSuspendDelayMs.Get());
}
std::string GetExtensionIdForSiteInstance(
content::SiteInstance* site_instance) {
if (!site_instance)
......@@ -626,7 +652,7 @@ void ProcessManager::CloseBackgroundHosts() {
// static
void ProcessManager::SetEventPageIdleTimeForTesting(unsigned idle_time_msec) {
CHECK_GT(idle_time_msec, 0u);
g_event_page_idle_time_msec = idle_time_msec;
g_event_page_suspend_delay_ms_for_testing = idle_time_msec;
}
// static
......@@ -816,7 +842,7 @@ void ProcessManager::DecrementLazyKeepaliveCount(
base::BindOnce(&ProcessManager::OnLazyBackgroundPageIdle,
weak_ptr_factory_.GetWeakPtr(), extension_id,
last_background_close_sequence_id_),
base::TimeDelta::FromMilliseconds(g_event_page_idle_time_msec));
GetEventPageSuspendDelay());
}
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment