Skip to content

Instantly share code, notes, and snippets.

@bsmedberg
Last active August 18, 2017 18:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bsmedberg/53b6cc561bb4fc5685abfa175fde3342 to your computer and use it in GitHub Desktop.
Save bsmedberg/53b6cc561bb4fc5685abfa175fde3342 to your computer and use it in GitHub Desktop.
chrome-input-latency
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
# coding: utf-8
# ---
# title: "Chrome Input Latency"
# authors:
# - bsmedberg
# created_at: 2017-04-13
# ---
# In[1]:
import ujson as json
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import plotly.plotly as py
from plotly.graph_objs import *
from moztelemetry import get_pings_properties, get_one_ping_per_client
from moztelemetry.dataset import Dataset
from moztelemetry.histogram import Histogram
from operator import add
from datetime import date, timedelta
get_ipython().magic(u'matplotlib inline')
# In[2]:
sc.defaultParallelism
# In[7]:
def ping_filter(p):
if p.get("environment/system/os/name", None) != "Windows_NT":
return False
if p.get("payload/info/subsessionLength", 0) <= 0:
return False
if p.get("environment/settings/e10sEnabled", False) != True:
return False
addons = p.get("environment/addons/activeAddons", {}) or {}
for a in addons.itervalues():
if a.get("isSystem", False) != True:
return False
return True
def print_histogram(histogram, processtype, hours):
print "{} process:".format(processtype)
stotal = 0
for cutoff, count in histogram.buckets.sort_index(ascending=False).iteritems():
if cutoff < 150:
break
stotal = stotal + count
print " {:5}ms: {:0.3f} hours".format(cutoff, float(hours) / stotal)
def input_latency_mtbf(startdate, days=7, channel="nightly"):
sdstring = startdate.strftime("%Y%m%d")
edstring = (startdate + timedelta(days=days)).strftime("%Y%m%d")
pings = Dataset.from_source("telemetry") .where(docType='main') .where(submissionDate=lambda d: sdstring <= d <= edstring) .where(appUpdateChannel=channel) .records(sc)
data = get_pings_properties(pings, [
"environment/system/os/name",
"environment/settings/e10sEnabled",
"environment/addons/activeAddons",
"payload/histograms/INPUT_EVENT_RESPONSE_MS",
"payload/info/subsessionLength"], with_processes=True) \
.filter(ping_filter).cache()
total_session_length_hours = data .map(lambda p: p["payload/info/subsessionLength"]) .reduce(add) / 60 / 60
print "Input jank MTBF for {} channel, {} for {} days:".format(channel, startdate.strftime("%Y-%m-%d"), days)
print "Usage hours total: {}".format(total_session_length_hours)
aggregated_input_latency_chrome = data .map(lambda p: p.get("payload/histograms/INPUT_EVENT_RESPONSE_MS_parent", None)) .filter(lambda v: v is not None) .reduce(add)
chrome_histogram = Histogram("INPUT_EVENT_RESPONSE_MS", aggregated_input_latency_chrome)
print_histogram(chrome_histogram, "chrome", total_session_length_hours)
aggregated_input_latency_content = data .map(lambda p: p.get("payload/histograms/INPUT_EVENT_RESPONSE_MS_children", None)) .filter(lambda v: v is not None) .reduce(add)
content_histogram = Histogram("INPUT_EVENT_RESPONSE_MS", aggregated_input_latency_content)
print_histogram(content_histogram, "content", total_session_length_hours)
print
# Caculate mean time between failure (MTBF) of "hangs at least as long as X ms". Cut off at 150ms because for now that's not a failure case.
# In[8]:
input_latency_mtbf(date(2017, 4, 2), channel="nightly")
# In[9]:
input_latency_mtbf(date(2017, 4, 2), channel="beta")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment