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

Side by Side 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: 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <set> 5 #include <set>
6 6
7 #include "content/browser/loader/resource_scheduler.h" 7 #include "content/browser/loader/resource_scheduler.h"
8 8
9 #include "base/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "base/metrics/histogram.h"
10 #include "base/stl_util.h" 11 #include "base/stl_util.h"
11 #include "content/common/resource_messages.h" 12 #include "content/common/resource_messages.h"
12 #include "content/browser/loader/resource_message_delegate.h" 13 #include "content/browser/loader/resource_message_delegate.h"
13 #include "content/public/browser/resource_controller.h" 14 #include "content/public/browser/resource_controller.h"
14 #include "content/public/browser/resource_request_info.h" 15 #include "content/public/browser/resource_request_info.h"
15 #include "content/public/browser/resource_throttle.h" 16 #include "content/public/browser/resource_throttle.h"
16 #include "ipc/ipc_message_macros.h" 17 #include "ipc/ipc_message_macros.h"
17 #include "net/base/host_port_pair.h" 18 #include "net/base/host_port_pair.h"
18 #include "net/base/load_flags.h" 19 #include "net/base/load_flags.h"
19 #include "net/base/request_priority.h" 20 #include "net/base/request_priority.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 ResourceScheduler* scheduler, 123 ResourceScheduler* scheduler,
123 const RequestPriorityParams& priority) 124 const RequestPriorityParams& priority)
124 : ResourceMessageDelegate(request), 125 : ResourceMessageDelegate(request),
125 client_id_(client_id), 126 client_id_(client_id),
126 request_(request), 127 request_(request),
127 ready_(false), 128 ready_(false),
128 deferred_(false), 129 deferred_(false),
129 classification_(NORMAL_REQUEST), 130 classification_(NORMAL_REQUEST),
130 scheduler_(scheduler), 131 scheduler_(scheduler),
131 priority_(priority), 132 priority_(priority),
132 fifo_ordering_(0) { 133 fifo_ordering_(0),
134 request_seen_(base::TimeTicks::Now()) {
mmenke 2014/10/30 15:14:19 Should include base/time.h (Timer, included in the
aiolos (Not reviewing) 2014/10/31 23:33:27 Done.
133 TRACE_EVENT_ASYNC_BEGIN1("net", "URLRequest", request_, 135 TRACE_EVENT_ASYNC_BEGIN1("net", "URLRequest", request_,
134 "url", request->url().spec()); 136 "url", request->url().spec());
135 } 137 }
136 138
137 ~ScheduledResourceRequest() override { scheduler_->RemoveRequest(this); } 139 ~ScheduledResourceRequest() override { scheduler_->RemoveRequest(this); }
138 140
139 void Start() { 141 void Start() {
140 TRACE_EVENT_ASYNC_STEP_PAST0("net", "URLRequest", request_, "Queued"); 142 TRACE_EVENT_ASYNC_STEP_PAST0("net", "URLRequest", request_, "Queued");
141 ready_ = true; 143 ready_ = true;
142 if (deferred_ && request_->status().is_success()) { 144 if (deferred_ && request_->status().is_success()) {
mmenke 2014/10/30 15:14:19 If request_->status() isn't success, should we eve
aiolos (Not reviewing) 2014/10/30 16:58:47 Easy enough to change.
mmenke 2014/10/30 17:30:40 Glancing at the loader, looks like we're fine.
143 deferred_ = false; 145 deferred_ = false;
144 controller()->Resume(); 146 controller()->Resume();
145 } 147 }
148 base::TimeDelta time_deferred = base::TimeTicks::Now() - request_seen_;
mmenke 2014/10/30 15:14:19 This this the time we want? We could measure time
aiolos (Not reviewing) 2014/10/30 16:58:47 I can see value from both options. I'm guessing we
mmenke 2014/10/30 17:30:40 I'm fine with adding both, and a TODO to remove on
aiolos (Not reviewing) 2014/10/31 23:33:27 Done.
149 std::string histogram_name = base::StringPrintf(
150 "ResourceScheduler.%sRequestTimeDeferred",
Ilya Sherman 2014/10/30 03:18:11 Optional nit: I'd recommend having the Active vs.
mmenke 2014/10/30 15:14:19 It also makes the histograms more searchable.
aiolos (Not reviewing) 2014/10/31 23:33:27 Done.
151 scheduler_->IsClientActive(client_id_) ? "Active" : "Background");
152 base::HistogramBase* histogram_counter = base::Histogram::FactoryTimeGet(
153 histogram_name,
154 base::TimeDelta::FromMilliseconds(1),
155 base::TimeDelta::FromMinutes(5),
156 100,
mmenke 2014/10/30 15:14:19 Do we really need 100 buckets? Think 50 should be
aiolos (Not reviewing) 2014/10/31 23:33:27 Done.
157 base::Histogram::kUmaTargetedHistogramFlag);
158 histogram_counter->AddTime(time_deferred);
146 } 159 }
147 160
148 void set_request_priority_params(const RequestPriorityParams& priority) { 161 void set_request_priority_params(const RequestPriorityParams& priority) {
149 priority_ = priority; 162 priority_ = priority;
150 } 163 }
151 const RequestPriorityParams& get_request_priority_params() const { 164 const RequestPriorityParams& get_request_priority_params() const {
152 return priority_; 165 return priority_;
153 } 166 }
154 const ClientId& client_id() const { return client_id_; } 167 const ClientId& client_id() const { return client_id_; }
155 net::URLRequest* url_request() { return request_; } 168 net::URLRequest* url_request() { return request_; }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 } 200 }
188 201
189 ClientId client_id_; 202 ClientId client_id_;
190 net::URLRequest* request_; 203 net::URLRequest* request_;
191 bool ready_; 204 bool ready_;
192 bool deferred_; 205 bool deferred_;
193 RequestClassification classification_; 206 RequestClassification classification_;
194 ResourceScheduler* scheduler_; 207 ResourceScheduler* scheduler_;
195 RequestPriorityParams priority_; 208 RequestPriorityParams priority_;
196 uint32 fifo_ordering_; 209 uint32 fifo_ordering_;
210 base::TimeTicks request_seen_;
mmenke 2014/10/30 15:14:19 "request_seen_" makes me think "Did we see the req
aiolos (Not reviewing) 2014/10/31 23:33:27 Acknowledged.
197 211
198 DISALLOW_COPY_AND_ASSIGN(ScheduledResourceRequest); 212 DISALLOW_COPY_AND_ASSIGN(ScheduledResourceRequest);
199 }; 213 };
200 214
201 bool ResourceScheduler::ScheduledResourceSorter::operator()( 215 bool ResourceScheduler::ScheduledResourceSorter::operator()(
202 const ScheduledResourceRequest* a, 216 const ScheduledResourceRequest* a,
203 const ScheduledResourceRequest* b) const { 217 const ScheduledResourceRequest* b) const {
204 // Want the set to be ordered first by decreasing priority, then by 218 // Want the set to be ordered first by decreasing priority, then by
205 // decreasing intra_priority. 219 // decreasing intra_priority.
206 // ie. with (priority, intra_priority) 220 // ie. with (priority, intra_priority)
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 void ResourceScheduler::LoadCoalescedRequests() { 1005 void ResourceScheduler::LoadCoalescedRequests() {
992 DCHECK(should_coalesce_); 1006 DCHECK(should_coalesce_);
993 ClientMap::iterator client_it = client_map_.begin(); 1007 ClientMap::iterator client_it = client_map_.begin();
994 while (client_it != client_map_.end()) { 1008 while (client_it != client_map_.end()) {
995 Client* client = client_it->second; 1009 Client* client = client_it->second;
996 client->LoadCoalescedRequests(); 1010 client->LoadCoalescedRequests();
997 ++client_it; 1011 ++client_it;
998 } 1012 }
999 } 1013 }
1000 1014
1015 bool ResourceScheduler::IsClientActive(ClientId client_id) {
1016 ClientMap::iterator client_it = client_map_.find(client_id);
mmenke 2014/10/30 15:14:19 const_iterator
aiolos (Not reviewing) 2014/10/31 23:33:27 Done.
1017 if (client_it == client_map_.end()) {
1018 return false;
mmenke 2014/10/30 15:14:19 When there's no client, we just let requests throu
aiolos (Not reviewing) 2014/10/31 23:33:27 I made a separate histogram for those requests plu
1019 }
mmenke 2014/10/30 15:14:19 don't use braces when both condition and body of a
aiolos (Not reviewing) 2014/10/31 23:33:27 Done.
1020 return client_it->second->is_active();
mmenke 2014/10/30 15:14:19 Formatting here is off
aiolos (Not reviewing) 2014/10/31 23:33:27 Done.
1021 }
1022
1001 void ResourceScheduler::ReprioritizeRequest(ScheduledResourceRequest* request, 1023 void ResourceScheduler::ReprioritizeRequest(ScheduledResourceRequest* request,
1002 net::RequestPriority new_priority, 1024 net::RequestPriority new_priority,
1003 int new_intra_priority_value) { 1025 int new_intra_priority_value) {
1004 if (request->url_request()->load_flags() & net::LOAD_IGNORE_LIMITS) { 1026 if (request->url_request()->load_flags() & net::LOAD_IGNORE_LIMITS) {
1005 // We should not be re-prioritizing requests with the 1027 // We should not be re-prioritizing requests with the
1006 // IGNORE_LIMITS flag. 1028 // IGNORE_LIMITS flag.
1007 NOTREACHED(); 1029 NOTREACHED();
1008 return; 1030 return;
1009 } 1031 }
1010 RequestPriorityParams new_priority_params(new_priority, 1032 RequestPriorityParams new_priority_params(new_priority,
(...skipping 18 matching lines...) Expand all
1029 client->ReprioritizeRequest( 1051 client->ReprioritizeRequest(
1030 request, old_priority_params, new_priority_params); 1052 request, old_priority_params, new_priority_params);
1031 } 1053 }
1032 1054
1033 ResourceScheduler::ClientId ResourceScheduler::MakeClientId( 1055 ResourceScheduler::ClientId ResourceScheduler::MakeClientId(
1034 int child_id, int route_id) { 1056 int child_id, int route_id) {
1035 return (static_cast<ResourceScheduler::ClientId>(child_id) << 32) | route_id; 1057 return (static_cast<ResourceScheduler::ClientId>(child_id) << 32) | route_id;
1036 } 1058 }
1037 1059
1038 } // namespace content 1060 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698