forked from premiere/premiere-libtorrent
make performance counters able to blend in values, reducing a peer_connection -> session dependency on a sliding average state (this can be used for disk stats too)
This commit is contained in:
parent
7c9c25e359
commit
02f3e48eaa
|
@ -409,12 +409,6 @@ 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
|
||||||
, std::string login, boost::weak_ptr<request_callback> c
|
, std::string login, boost::weak_ptr<request_callback> c
|
||||||
|
@ -1224,10 +1218,6 @@ 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
|
||||||
|
|
|
@ -241,8 +241,6 @@ 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
|
||||||
|
|
|
@ -388,6 +388,7 @@ namespace libtorrent
|
||||||
boost::int64_t operator[](int i) const;
|
boost::int64_t operator[](int i) const;
|
||||||
|
|
||||||
void set_value(int c, boost::int64_t value);
|
void set_value(int c, boost::int64_t value);
|
||||||
|
void blend_stats_counter(int c, boost::int64_t value, int ratio);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -5189,10 +5189,7 @@ 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
|
m_counters.blend_stats_counter(counters::request_latency, disk_rtt, 5);
|
||||||
// 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
|
||||||
|
|
|
@ -71,6 +71,22 @@ namespace libtorrent {
|
||||||
return m_stats_counter[c] += value;
|
return m_stats_counter[c] += value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ratio is a vaue between 0 and 100 representing the percentage the value
|
||||||
|
// is blended in at.
|
||||||
|
void counters::blend_stats_counter(int c, boost::int64_t value, int ratio)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(c >= 0);
|
||||||
|
TORRENT_ASSERT(c < num_counters);
|
||||||
|
TORRENT_ASSERT(ratio >= 0);
|
||||||
|
TORRENT_ASSERT(ratio <= 100);
|
||||||
|
|
||||||
|
TORRENT_ASSERT(num_stats_counters);
|
||||||
|
|
||||||
|
// TODO: 2 to make this thread safe, use compare_exchange_weak
|
||||||
|
boost::uint64_t current = m_stats_counter[c];
|
||||||
|
m_stats_counter[c] = (current * (100-ratio) + value * ratio) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
void counters::set_value(int c, boost::int64_t value)
|
void counters::set_value(int c, boost::int64_t value)
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(c >= 0);
|
TORRENT_ASSERT(c >= 0);
|
||||||
|
|
|
@ -38,6 +38,8 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// TODO: 3 this function could just use the static metrics array
|
||||||
|
// instead of taking it as an argument. Also, document it
|
||||||
int find_metric_idx(std::vector<stats_metric> const& metrics
|
int find_metric_idx(std::vector<stats_metric> const& metrics
|
||||||
, char const* name)
|
, char const* name)
|
||||||
{
|
{
|
||||||
|
@ -48,6 +50,9 @@ namespace libtorrent
|
||||||
return i->value_index;
|
return i->value_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: 3 the type of counter does not need to be stored in this array.
|
||||||
|
// when the user asks for the list of counters, that field could be
|
||||||
|
// generated based on the range of the counter index.
|
||||||
#define METRIC(category, name, type) { #category "." #name, counters:: name, stats_metric:: type},
|
#define METRIC(category, name, type) { #category "." #name, counters:: name, stats_metric:: type},
|
||||||
const static stats_metric metrics[] =
|
const static stats_metric metrics[] =
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue