log latency of bittorrent requests
This commit is contained in:
parent
2f6a68bad3
commit
ab8c1eb334
|
@ -409,6 +409,11 @@ namespace libtorrent
|
||||||
void set_port_filter(port_filter const& f);
|
void set_port_filter(port_filter const& f);
|
||||||
port_filter const& get_port_filter() const;
|
port_filter const& get_port_filter() const;
|
||||||
|
|
||||||
|
void request_latency_sample(int us)
|
||||||
|
{
|
||||||
|
m_request_latency.add_sample(us);
|
||||||
|
m_stats_counters.set_value(counters::request_latency, m_request_latency.mean());
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: move the login info into the tracker_request object
|
// TODO: move the login info into the tracker_request object
|
||||||
void queue_tracker_request(tracker_request& req
|
void queue_tracker_request(tracker_request& req
|
||||||
|
@ -592,6 +597,9 @@ namespace libtorrent
|
||||||
void add_redundant_bytes(size_type b, int reason)
|
void add_redundant_bytes(size_type b, int reason)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(b > 0);
|
TORRENT_ASSERT(b > 0);
|
||||||
|
// TODO: 3 the m_redundant_bytes array should be made part of
|
||||||
|
// the stats counters. That way another session_impl dependency
|
||||||
|
// from the peer connections would be removed
|
||||||
m_redundant_bytes[reason] += b;
|
m_redundant_bytes[reason] += b;
|
||||||
m_stats_counters.inc_stats_counter(counters::recv_redundant_bytes, b);
|
m_stats_counters.inc_stats_counter(counters::recv_redundant_bytes, b);
|
||||||
}
|
}
|
||||||
|
@ -1192,7 +1200,7 @@ namespace libtorrent
|
||||||
vm_statistics_data_t m_last_vm_stat;
|
vm_statistics_data_t m_last_vm_stat;
|
||||||
thread_cpu_usage m_network_thread_cpu_usage;
|
thread_cpu_usage m_network_thread_cpu_usage;
|
||||||
sliding_average<20> m_read_ops;
|
sliding_average<20> m_read_ops;
|
||||||
sliding_average<20> m_write_ops;;
|
sliding_average<20> m_write_ops;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// each second tick the timer takes a little
|
// each second tick the timer takes a little
|
||||||
|
@ -1232,6 +1240,10 @@ namespace libtorrent
|
||||||
|
|
||||||
counters m_stats_counters;
|
counters m_stats_counters;
|
||||||
|
|
||||||
|
// the sliding average of the latency (in microseconds) from an
|
||||||
|
// incoming request to sending the data back over the socket
|
||||||
|
sliding_average<50> m_request_latency;
|
||||||
|
|
||||||
#ifdef TORRENT_UPNP_LOGGING
|
#ifdef TORRENT_UPNP_LOGGING
|
||||||
std::ofstream m_upnp_log;
|
std::ofstream m_upnp_log;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -244,6 +244,8 @@ namespace libtorrent { namespace aux
|
||||||
|
|
||||||
virtual int peak_up_rate() const = 0;
|
virtual int peak_up_rate() const = 0;
|
||||||
|
|
||||||
|
virtual void request_latency_sample(int us) = 0;
|
||||||
|
|
||||||
enum torrent_list_index
|
enum torrent_list_index
|
||||||
{
|
{
|
||||||
// this is the set of (subscribed) torrents that have changed
|
// this is the set of (subscribed) torrents that have changed
|
||||||
|
|
|
@ -883,7 +883,8 @@ namespace libtorrent
|
||||||
void do_update_interest();
|
void do_update_interest();
|
||||||
int preferred_caching() const;
|
int preferred_caching() const;
|
||||||
void fill_send_buffer();
|
void fill_send_buffer();
|
||||||
void on_disk_read_complete(disk_io_job const* j, peer_request r);
|
void on_disk_read_complete(disk_io_job const* j, peer_request r
|
||||||
|
, ptime issue_time);
|
||||||
void on_disk_write_complete(disk_io_job const* j
|
void on_disk_write_complete(disk_io_job const* j
|
||||||
, peer_request r, boost::shared_ptr<torrent> t);
|
, peer_request r, boost::shared_ptr<torrent> t);
|
||||||
void on_seed_mode_hashed(disk_io_job const* j);
|
void on_seed_mode_hashed(disk_io_job const* j);
|
||||||
|
|
|
@ -335,6 +335,7 @@ namespace libtorrent
|
||||||
|
|
||||||
write_cache_blocks,
|
write_cache_blocks,
|
||||||
read_cache_blocks,
|
read_cache_blocks,
|
||||||
|
request_latency,
|
||||||
pinned_blocks,
|
pinned_blocks,
|
||||||
disk_blocks_in_use,
|
disk_blocks_in_use,
|
||||||
queued_disk_jobs,
|
queued_disk_jobs,
|
||||||
|
|
|
@ -2487,7 +2487,7 @@ namespace libtorrent
|
||||||
int rtt = int(total_milliseconds(time_now_hires() - i->request_time));
|
int rtt = int(total_milliseconds(time_now_hires() - i->request_time));
|
||||||
m_rtt.add_sample(rtt);
|
m_rtt.add_sample(rtt);
|
||||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||||
peer_log("*** RTT: %d ms [%s +/- %s ms]", rtt, m_rtt.mean()
|
peer_log("*** RTT: %d ms [%d +/- %d ms]", rtt, m_rtt.mean()
|
||||||
, m_rtt.avg_deviation());
|
, m_rtt.avg_deviation());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -5041,7 +5041,7 @@ namespace libtorrent
|
||||||
t->inc_refcount("async_read");
|
t->inc_refcount("async_read");
|
||||||
m_disk_thread.async_read(&t->storage(), r
|
m_disk_thread.async_read(&t->storage(), r
|
||||||
, boost::bind(&peer_connection::on_disk_read_complete
|
, boost::bind(&peer_connection::on_disk_read_complete
|
||||||
, self(), _1, r), this);
|
, self(), _1, r, time_now_hires()), this);
|
||||||
}
|
}
|
||||||
m_requests.erase(m_requests.begin() + i);
|
m_requests.erase(m_requests.begin() + i);
|
||||||
|
|
||||||
|
@ -5109,19 +5109,23 @@ namespace libtorrent
|
||||||
fill_send_buffer();
|
fill_send_buffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void peer_connection::on_disk_read_complete(disk_io_job const* j, peer_request r)
|
void peer_connection::on_disk_read_complete(disk_io_job const* j
|
||||||
|
, peer_request r, ptime issue_time)
|
||||||
{
|
{
|
||||||
// return value:
|
// return value:
|
||||||
// 0: success, piece passed hash check
|
// 0: success, piece passed hash check
|
||||||
// -1: disk failure
|
// -1: disk failure
|
||||||
|
|
||||||
|
int disk_rtt = int(total_microseconds(time_now_hires() - issue_time));
|
||||||
|
|
||||||
#ifdef TORRENT_VERBOSE_LOGGING
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
peer_log("*** FILE ASYNC READ COMPLETE [ ret: %d | piece: %d | s: %x | l: %x"
|
peer_log("*** FILE ASYNC READ COMPLETE [ ret: %d | piece: %d | s: %x | l: %x"
|
||||||
" | b: %p | c: %s | e: %s ]"
|
" | b: %p | c: %s | e: %s | rtt: %d us ]"
|
||||||
, j->ret, r.piece, r.start, r.length, j->buffer
|
, j->ret, r.piece, r.start, r.length, j->buffer
|
||||||
, (j->flags & disk_io_job::cache_hit ? "cache hit" : "cache miss")
|
, (j->flags & disk_io_job::cache_hit ? "cache hit" : "cache miss")
|
||||||
, j->error.ec.message().c_str());
|
, j->error.ec.message().c_str(), disk_rtt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_reading_bytes -= r.length;
|
m_reading_bytes -= r.length;
|
||||||
|
|
||||||
boost::shared_ptr<torrent> t = m_torrent.lock();
|
boost::shared_ptr<torrent> t = m_torrent.lock();
|
||||||
|
@ -5185,6 +5189,11 @@ namespace libtorrent
|
||||||
, r.piece, r.start, r.length);
|
, r.piece, r.start, r.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// TODO: 3 it would be nice if the sliding_average state required
|
||||||
|
// for this would be baked into the counters object, in which case this
|
||||||
|
// would not be a session_impl dependency.
|
||||||
|
m_ses.request_latency_sample(disk_rtt);
|
||||||
|
|
||||||
// we probably just pulled this piece into the cache.
|
// we probably just pulled this piece into the cache.
|
||||||
// if it's rare enough to make it into the suggested piece
|
// if it's rare enough to make it into the suggested piece
|
||||||
// push another piece out
|
// push another piece out
|
||||||
|
|
|
@ -1107,6 +1107,8 @@ namespace aux {
|
||||||
|
|
||||||
":connection attempt loops"
|
":connection attempt loops"
|
||||||
|
|
||||||
|
":request latency"
|
||||||
|
|
||||||
"\n\n", m_stats_logger);
|
"\n\n", m_stats_logger);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -4412,6 +4414,8 @@ retry:
|
||||||
|
|
||||||
STAT_COUNTER(connection_attempt_loops);
|
STAT_COUNTER(connection_attempt_loops);
|
||||||
|
|
||||||
|
STAT_COUNTER(request_latency);
|
||||||
|
|
||||||
fprintf(m_stats_logger, "\n");
|
fprintf(m_stats_logger, "\n");
|
||||||
|
|
||||||
#undef STAT_LOG
|
#undef STAT_LOG
|
||||||
|
|
|
@ -288,6 +288,11 @@ namespace libtorrent
|
||||||
|
|
||||||
METRIC(disk, write_cache_blocks, type_gauge)
|
METRIC(disk, write_cache_blocks, type_gauge)
|
||||||
METRIC(disk, read_cache_blocks, type_gauge)
|
METRIC(disk, read_cache_blocks, type_gauge)
|
||||||
|
|
||||||
|
// the number of microseconds it takes from receiving a request from a
|
||||||
|
// peer until we're sending the response back on the socket.
|
||||||
|
METRIC(disk, request_latency, type_gauge)
|
||||||
|
|
||||||
METRIC(disk, pinned_blocks, type_gauge)
|
METRIC(disk, pinned_blocks, type_gauge)
|
||||||
METRIC(disk, disk_blocks_in_use, type_gauge)
|
METRIC(disk, disk_blocks_in_use, type_gauge)
|
||||||
METRIC(disk, queued_disk_jobs, type_gauge)
|
METRIC(disk, queued_disk_jobs, type_gauge)
|
||||||
|
|
|
@ -321,6 +321,7 @@ reports = [
|
||||||
('pinned torrents', 'num torrents', '', '', ['pinned torrents']),
|
('pinned torrents', 'num torrents', '', '', ['pinned torrents']),
|
||||||
('loaded torrents', 'num torrents', '', '', ['loaded torrents', 'pinned torrents']),
|
('loaded torrents', 'num torrents', '', '', ['loaded torrents', 'pinned torrents']),
|
||||||
('requests', '', '', '', ['outstanding requests']),
|
('requests', '', '', '', ['outstanding requests']),
|
||||||
|
('request latency', 'us', '', 'latency from receiving requests to sending response', ['request latency']),
|
||||||
('incoming messages', 'num', '', 'number of received bittorrent messages, by type', [ \
|
('incoming messages', 'num', '', 'number of received bittorrent messages, by type', [ \
|
||||||
'num_incoming_choke', 'num_incoming_unchoke', 'num_incoming_interested', \
|
'num_incoming_choke', 'num_incoming_unchoke', 'num_incoming_interested', \
|
||||||
'num_incoming_not_interested', 'num_incoming_have', 'num_incoming_bitfield', \
|
'num_incoming_not_interested', 'num_incoming_have', 'num_incoming_bitfield', \
|
||||||
|
|
Loading…
Reference in New Issue