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

Unified Diff: content/browser/loader/resource_scheduler.cc

Issue 692723002: Add histograms to gather ResourceScheduler information. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Second round of comments. Created 6 years, 1 month 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
Index: content/browser/loader/resource_scheduler.cc
diff --git a/content/browser/loader/resource_scheduler.cc b/content/browser/loader/resource_scheduler.cc
index 6cc902ea561895a7c7216103c6146b5b7107ff68..cd1429831f1bcdf5c4ac0dce2fb04eecb5200ad4 100644
--- a/content/browser/loader/resource_scheduler.cc
+++ b/content/browser/loader/resource_scheduler.cc
@@ -7,7 +7,9 @@
#include "content/browser/loader/resource_scheduler.h"
#include "base/metrics/field_trial.h"
+#include "base/metrics/histogram.h"
#include "base/stl_util.h"
+#include "base/time/time.h"
#include "content/common/resource_messages.h"
#include "content/browser/loader/resource_message_delegate.h"
#include "content/public/browser/resource_controller.h"
@@ -23,6 +25,23 @@
namespace content {
+namespace {
+
+void PostHistogram(const char* base_name,
+ const char* suffix,
+ base::TimeDelta time) {
+ std::string histogram_name =
+ base::StringPrintf("ResourceScheduler.%s_%s", base_name, suffix);
+ base::HistogramBase* histogram_counter = base::Histogram::FactoryTimeGet(
+ histogram_name,
+ base::TimeDelta::FromMilliseconds(1),
+ base::TimeDelta::FromMinutes(5),
+ 50,
+ base::Histogram::kUmaTargetedHistogramFlag);
+ histogram_counter->AddTime(time);
+}
+} // namespace
mmenke 2014/11/03 19:01:19 nit: Blank line before end of namespace.
aiolos (Not reviewing) 2014/11/03 20:16:01 Done.
+
static const size_t kCoalescedTimerPeriod = 5000;
static const size_t kMaxNumDelayableRequestsPerClient = 10;
static const size_t kMaxNumDelayableRequestsPerHost = 6;
@@ -132,6 +151,7 @@ class ResourceScheduler::ScheduledResourceRequest
fifo_ordering_(0) {
TRACE_EVENT_ASYNC_BEGIN1("net", "URLRequest", request_,
"url", request->url().spec());
+ client_state_on_creation_ = scheduler_->GetClientState(client_id_);
mmenke 2014/11/03 19:01:19 optional nit: I think it's preferred to have "cli
aiolos (Not reviewing) 2014/11/03 20:16:02 Done.
}
~ScheduledResourceRequest() override { scheduler_->RemoveRequest(this); }
@@ -139,10 +159,30 @@ class ResourceScheduler::ScheduledResourceRequest
void Start() {
TRACE_EVENT_ASYNC_STEP_PAST0("net", "URLRequest", request_, "Queued");
ready_ = true;
- if (deferred_ && request_->status().is_success()) {
+ if (!request_->status().is_success())
+ return;
+ base::TimeTicks time = base::TimeTicks::Now();
+ ClientState current_state = scheduler_->GetClientState(client_id_);
+ const char* client_state = "Other";
+ if (current_state == client_state_on_creation_ && current_state == ACTIVE)
+ client_state = "Active";
+ else if (current_state == client_state_on_creation_ &&
+ current_state == BACKGROUND)
+ client_state = "Background";
mmenke 2014/11/03 19:01:20 nit: Use braces on all blocks of an if statements
aiolos (Not reviewing) 2014/11/03 20:16:01 Done.
+
+ if (deferred_) {
deferred_ = false;
controller()->Resume();
- }
+ PostHistogram("RequestTimeDeferred", client_state, time - time_deferred_);
+ } else
+ PostHistogram("RequestTimeDeferred",
+ client_state,
+ base::TimeDelta::FromMicroseconds(0));
mmenke 2014/11/03 19:01:19 nit: Per above comment, should use braces here.
aiolos (Not reviewing) 2014/11/03 20:16:01 Done.
+ PostHistogram(
+ "RequestTimeThrottled", client_state, time - request_->creation_time());
+ // TODO(aiolos): Remove one of the above sets of histograms after gaining an
+ // understanding of the difference between them and which one is more
+ // interesting.
}
void set_request_priority_params(const RequestPriorityParams& priority) {
@@ -177,7 +217,10 @@ class ResourceScheduler::ScheduledResourceRequest
}
// ResourceThrottle interface:
- void WillStartRequest(bool* defer) override { deferred_ = *defer = !ready_; }
+ void WillStartRequest(bool* defer) override {
+ deferred_ = *defer = !ready_;
+ time_deferred_ = base::TimeTicks::Now();
+ }
const char* GetNameForLogging() const override { return "ResourceScheduler"; }
@@ -187,6 +230,7 @@ class ResourceScheduler::ScheduledResourceRequest
}
ClientId client_id_;
+ ResourceScheduler::ClientState client_state_on_creation_;
net::URLRequest* request_;
mmenke 2014/11/03 19:01:19 While you're here, can client_id_ and request_ be
aiolos (Not reviewing) 2014/11/03 20:16:01 request_ can't be const because of the usage of ur
bool ready_;
bool deferred_;
@@ -194,6 +238,7 @@ class ResourceScheduler::ScheduledResourceRequest
ResourceScheduler* scheduler_;
RequestPriorityParams priority_;
uint32 fifo_ordering_;
+ base::TimeTicks time_deferred_;
DISALLOW_COPY_AND_ASSIGN(ScheduledResourceRequest);
};
@@ -754,9 +799,11 @@ scoped_ptr<ResourceThrottle> ResourceScheduler::ScheduleRequest(
net::URLRequest* url_request) {
DCHECK(CalledOnValidThread());
ClientId client_id = MakeClientId(child_id, route_id);
- scoped_ptr<ScheduledResourceRequest> request(
- new ScheduledResourceRequest(client_id, url_request, this,
- RequestPriorityParams(url_request->priority(), 0)));
+ scoped_ptr<ScheduledResourceRequest> request(new ScheduledResourceRequest(
+ client_id,
+ url_request,
+ this,
+ RequestPriorityParams(url_request->priority(), 0)));
ClientMap::iterator it = client_map_.find(client_id);
if (it == client_map_.end()) {
@@ -998,6 +1045,14 @@ void ResourceScheduler::LoadCoalescedRequests() {
}
}
+ResourceScheduler::ClientState ResourceScheduler::GetClientState(
+ ClientId client_id) const {
+ ClientMap::const_iterator client_it = client_map_.find(client_id);
+ if (client_it == client_map_.end())
+ return UNKNOWN;
+ return client_it->second->is_active() ? ACTIVE : BACKGROUND;
+}
+
void ResourceScheduler::ReprioritizeRequest(ScheduledResourceRequest* request,
net::RequestPriority new_priority,
int new_intra_priority_value) {
@@ -1034,5 +1089,4 @@ ResourceScheduler::ClientId ResourceScheduler::MakeClientId(
int child_id, int route_id) {
return (static_cast<ResourceScheduler::ClientId>(child_id) << 32) | route_id;
}
-
} // namespace content
mmenke 2014/11/03 19:01:19 nit: Blank line before end of namespace.
aiolos (Not reviewing) 2014/11/03 20:16:01 Done.

Powered by Google App Engine
This is Rietveld 408576698