Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(364)

Unified Diff: chrome/common/startup_metric_utils.cc

Issue 11785014: Record metrics for slow startups (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Android/Linux Aurora compile failure Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/startup_metric_utils.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/startup_metric_utils.cc
diff --git a/chrome/common/startup_metric_utils.cc b/chrome/common/startup_metric_utils.cc
index 2292fffe77da3a7991b9e62ddff2aac2bfd4150b..e29aaf244c9d0e95e78b26fc2db761c3f01082c4 100644
--- a/chrome/common/startup_metric_utils.cc
+++ b/chrome/common/startup_metric_utils.cc
@@ -4,21 +4,38 @@
#include "chrome/common/startup_metric_utils.h"
+#include "base/hash_tables.h"
#include "base/logging.h"
+#include "base/metrics/histogram.h"
+#include "base/synchronization/lock.h"
+#include "base/sys_info.h"
#include "base/time.h"
namespace {
// Mark as volatile to defensively make sure usage is thread-safe.
// Note that at the time of this writing, access is only on the UI thread.
-static volatile bool g_non_browser_ui_displayed = false;
+volatile bool g_non_browser_ui_displayed = false;
const base::Time* MainEntryPointTimeInternal() {
static base::Time main_start_time = base::Time::Now();
return &main_start_time;
}
-static bool g_main_entry_time_was_recorded = false;
+typedef base::hash_map<std::string,base::TimeDelta> SubsystemStartupTimeHash;
+
+SubsystemStartupTimeHash* GetSubsystemStartupTimeHash() {
+ static SubsystemStartupTimeHash* slow_startup_time_hash =
+ new SubsystemStartupTimeHash;
+ return slow_startup_time_hash;
+}
+
+base::Lock* GetSubsystemStartupTimeHashLock() {
+ static base::Lock* slow_startup_time_hash_lock = new base::Lock;
+ return slow_startup_time_hash_lock;
+}
+
+bool g_main_entry_time_was_recorded = false;
} // namespace
namespace startup_metric_utils {
@@ -37,9 +54,64 @@ void RecordMainEntryPointTime() {
MainEntryPointTimeInternal();
}
+// Return the time recorded by RecordMainEntryPointTime().
const base::Time MainEntryStartTime() {
DCHECK(g_main_entry_time_was_recorded);
return *MainEntryPointTimeInternal();
}
+void OnBrowserStartupComplete() {
+ // Bail if uptime < 7 minutes, to filter out cases where Chrome may have been
+ // autostarted and the machine is under io pressure.
+ const int64 kSevenMinutesInMilliseconds =
+ base::TimeDelta::FromMinutes(7).InMilliseconds();
+ if (base::SysInfo::Uptime() < kSevenMinutesInMilliseconds)
+ return;
+
+ const base::TimeDelta kStartupTimeMin(base::TimeDelta::FromMilliseconds(1));
+ const base::TimeDelta kStartupTimeMax(base::TimeDelta::FromMinutes(5));
+ static const size_t kStartupTimeBuckets(100);
+
+ // The Startup.BrowserMessageLoopStartTime histogram recorded in
+ // chrome_browser_main.cc exhibits instability in the field which limits its
+ // usefulness in all scenarios except when we have a very large sample size.
+ // Attempt to mitigate this with a new metric:
+ // * Measure time from main entry rather than the OS' notion of process start
+ // time.
+ // * Only measure launches that occur 7 minutes after boot to try to avoid
+ // cases where Chrome is auto-started and IO is heavily loaded.
+ base::TimeDelta startup_time_from_main_entry =
+ base::Time::Now() - MainEntryStartTime();
+ UMA_HISTOGRAM_LONG_TIMES(
+ "Startup.BrowserMessageLoopStartTimeFromMainEntry",
+ startup_time_from_main_entry);
+
+ // Record histograms for the subsystem times for startups > 10 seconds.
+ const base::TimeDelta kTenSeconds = base::TimeDelta::FromSeconds(10);
+ if (startup_time_from_main_entry < kTenSeconds)
+ return;
+ {
+ base::AutoLock locker(*GetSubsystemStartupTimeHashLock());
+ SubsystemStartupTimeHash* time_hash = GetSubsystemStartupTimeHash();
+ for (SubsystemStartupTimeHash::iterator i = time_hash->begin();
+ i != time_hash->end();
+ ++i) {
+ const std::string histogram_name = i->first;
+ base::Histogram* counter = base::Histogram::FactoryTimeGet(
+ histogram_name,
+ kStartupTimeMin,
+ kStartupTimeMax,
+ kStartupTimeBuckets,
+ base::Histogram::kUmaTargetedHistogramFlag);
+ counter->AddTime(i->second);
+ }
+ }
+}
+
+ScopedSlowStartupUMA::~ScopedSlowStartupUMA() {
+ base::AutoLock locker(*GetSubsystemStartupTimeHashLock());
+ (*GetSubsystemStartupTimeHash())[histogram_name_] =
+ base::TimeTicks::Now() - start_time_;
+}
+
} // namespace startup_metric_utils
« no previous file with comments | « chrome/common/startup_metric_utils.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698