Skip to content

Instantly share code, notes, and snippets.

@mattwoodrow
Last active December 17, 2018 00:28
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 mattwoodrow/7bba3a9debb6372584e353e9ca7cc9a1 to your computer and use it in GitHub Desktop.
Save mattwoodrow/7bba3a9debb6372584e353e9ca7cc9a1 to your computer and use it in GitHub Desktop.
wr-content-frame-time-reason
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"import ujson as json\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"from moztelemetry.dataset import Dataset\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can look at the schema of the dataset we are interested in:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[u'submissionDate',\n",
" u'sourceName',\n",
" u'sourceVersion',\n",
" u'docType',\n",
" u'appName',\n",
" u'appUpdateChannel',\n",
" u'appVersion',\n",
" u'appBuildId']"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Dataset.from_source('telemetry').schema"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's create a Dataset of Telemetry submissions for a given submission date:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"pings_dataset = (\n",
" Dataset.from_source('telemetry')\n",
" .where(docType='main')\n",
" #.where(appBuildId='20180721100146')\n",
" #.where(submissionDate ='20180925')\n",
" .where(submissionDate=lambda x: x > '20181201')\n",
" .where(appUpdateChannel=\"nightly\")\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Select only the properties we need and then take a 10% sample:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fetching 100921.84349MB in 356630 files...\n"
]
}
],
"source": [
"pings = (\n",
" pings_dataset\n",
" .select(\n",
" 'clientId',\n",
" buildId='application.buildId',\n",
" device_resest='payload.processes.gpu.histograms.DEVICE_RESET_REASON',\n",
" frame_time_reason='payload.processes.gpu.histograms.CONTENT_FRAME_TIME_REASON.values',\n",
" experiments='environment.experiments',\n",
" osName='environment.system.os.name',\n",
" gfx='environment.system.gfx')\n",
" .records(sc, sample=1.)\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"2796918"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pings.count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Caching is fundamental as it allows for an iterative, real-time development workflow:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"cached = pings.cache()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How many pings are we looking at?"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2796918"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cached.count()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"231060"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wrExperiment = cached.filter(lambda p: \"experiments\" in p and p[\"experiments\"]).filter(lambda p: \"prefflip-webrender-v1-3-1492568\" in p[\"experiments\"])\n",
"wrExperiment.count()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2659361"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cached = cached.filter(lambda p: \"features\" in p[\"gfx\"])\n",
"cached = cached.filter(lambda p: \"wrQualified\" in p[\"gfx\"][\"features\"])\n",
"cached.count()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"wrQualified = cached.filter(lambda p: p[\"gfx\"][\"features\"][\"wrQualified\"][\"status\"] == \"available\" )\n",
"wrQualified.count()\n",
"wrQualified = wrQualified.filter(lambda p: len(p[\"gfx\"][\"monitors\"]) == 1 and p[\"gfx\"][\"monitors\"][0][\"refreshRate\"] == 60)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"defaultdict(int, {u'basic': 6912, u'd3d11': 103688, u'webrender': 120458})"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wrExperiment = cached.filter(lambda p: \"experiments\" in p and p[\"experiments\"]).filter(lambda p: \"prefflip-webrender-v1-3-1492568\" in p[\"experiments\"])\n",
"wrExperiment.map(lambda p: p[\"gfx\"][\"features\"][\"compositor\"]).countByValue()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"wrExperiment = wrExperiment.filter(lambda p: p[\"gfx\"][\"features\"][\"wrQualified\"][\"status\"] == \"available\")\n",
"#wrExperiment = wrExperiment.filter(lambda p: len(p[\"gfx\"][\"monitors\"]) == 1 and p[\"gfx\"][\"monitors\"][0][\"refreshRate\"] == 60)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"defaultdict(int, {u'disabled': 113490, u'enabled': 117147})"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wrExperiment.map(lambda p: p[\"experiments\"][\"prefflip-webrender-v1-3-1492568\"][\"branch\"]).countByValue()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(117147, 113490)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"treatment = wrExperiment.filter(lambda p: p[\"experiments\"][\"prefflip-webrender-v1-3-1492568\"][\"branch\"] == \"enabled\")\n",
"control = wrExperiment.filter(lambda p: p[\"experiments\"][\"prefflip-webrender-v1-3-1492568\"][\"branch\"] == \"disabled\")\n",
"treatment.count(), control.count()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"defaultdict(int, {u'basic': 2854, u'd3d11': 2153, u'webrender': 112140})"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"treatment.map(lambda p: p[\"gfx\"][\"features\"][\"compositor\"]).countByValue()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(112140, 101299)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wrEnabled = treatment.filter(lambda p: p[\"gfx\"][\"features\"][\"compositor\"] == \"webrender\")\n",
"wrDisabled = control.filter(lambda p: p[\"gfx\"][\"features\"][\"compositor\"] == \"d3d11\")\n",
"wrEnabled.count(), wrDisabled.count()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"wrDisabled2 = wrDisabled.sample(False, wrEnabled.count()/(wrDisabled.count()*1.0))\n",
"wrDisabled3 = wrDisabled.sample(False, wrEnabled.count()/(wrDisabled.count()*1.0))\n",
"wrDisabled = wrDisabled.sample(False, wrEnabled.count()/(wrDisabled.count()*1.0))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(101299, 101299, 101299, 112140)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wrDisabled3.count(), wrDisabled.count(), wrDisabled2.count(), wrEnabled.count()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(101363, 101299)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"desired_count = float(min(wrEnabled.count(), wrDisabled.count()))\n",
"wrEnabled = wrEnabled.sample(False, desired_count / float(wrEnabled.count()))\n",
"wrDisabled = wrDisabled.sample(False, desired_count / float(wrDisabled.count()))\n",
"(wrEnabled.count(), wrDisabled.count())"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"def aggregate_series(s1, s2):\n",
" \"\"\"Function to sum up series; if one is None, return other\"\"\"\n",
" if s1 is None:\n",
" return s2\n",
" if s2 is None:\n",
" return s1\n",
" return s1.add(s2, fill_value=0)\n",
"\n",
"aggregated_enabled = (\n",
" wrEnabled\n",
" .filter(lambda p: p['frame_time_reason'])\n",
" .map(lambda p: pd.Series(p['frame_time_reason']))\n",
" .reduce(aggregate_series)\n",
")\n",
"\n",
"aggregated_disabled = (\n",
" wrDisabled\n",
" .filter(lambda p: p['frame_time_reason'])\n",
" .map(lambda p: pd.Series(p['frame_time_reason']))\n",
" .reduce(aggregate_series)\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f2f2959ddd0>"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\ny8knn5ztt98+3/72t/P3f//3uf322/PpT396jc9+8MEHc9hhh+XZz3523vOe9+Tqq6/OWWedlYce\neihnn332emdevnx5XvCCF+S2227LG9/4xuy888655JJLcu2113rmGQAAAACP7m//9m/TWsv111+f\nbbfdNklywgkn5DWveU3OPvvs/NVf/dWquffff3/+8z//M5tttlmSZNttt81pp52WH/3oR9lvv/2S\nJOedd1623HLLVWv+8i//MnvttVfe/va357bbbsuTn/zkNd7vpS99aebPn58kOemkk3L44Yfn3e9+\nd0499dRst912Y8685ZZb5qKLLsqPf/zjXHbZZTniiCOSJMcff3wOOOCAXv36xsRtmwAAAAAbiMsv\nvzyHH354Hnroodx9992rvl784hdn2bJlWbRo0aq5xx133KriLEkOOeSQtNby05/+dNXY6sXZvffe\nm7vvvjvPfvazs2LFinzve9972Oefcsopa7z+67/+6/z+97/Pl770pTFlXrp06arMV111VXbeeedV\nxVmSTJ48OSeccMIofkO9Z+cZAAAAwAbgrrvuytKlS/ORj3wkF1100cOuV1XuvPPOVbu7dt111zWu\nP+EJT0iS/OpXv1o19vOf/zxnnnlmPv/5z68xXlVZtmzZGusnTZqUPffcc42xffbZJ6213HrrreuV\nOUl+9rOfZe+9937YnH333Xed7/1YUZ4BAAAAbABWrFiRJDnqqKNy9NFHr3POAQcckB/+8IdJssau\ns9WtfPj+ihUr8sIXvjBLly7N2972tuy7777Zaqutcvvtt+foo49e9XmPReaJTHkGAAAAsAHYYYcd\nss022+Shhx7KC17wgvV+vxtuuCE333xzLrnkkrz2ta9dNd51C+aKFSvy05/+dI3dYTfddFOSZPfd\nd1/vzLvtttuq4m91N95446P9KOPKM88AAAAANgCTJk3KK1/5ynzmM59ZZ8k0ODg4qvdbuTNt7R1m\n73vf+zpPt7zwwgsf9vpxj3tcDj300PXO/NKXvjR33HFHPvOZz6wau/fee/PRj350ZD/QOLHzDAAA\nANjELN5gP/vcc8/NV77ylRx00EE5/vjjs99+++Wee+7JwoULc+21146qQHvqU5+avfbaK29605ty\n22235fGPf3w+85nPZOnSpeucv+WWW+bqq6/OMccck4MOOihXXnllrrrqqrz97W/P9ttvv96Zjz/+\n+Fx44YX5i7/4i3z3u9/NzjvvnEsuuSRbbbXV6H5JPaY8AwAAADYJAwMDmTx5apYvP6qvOSZPnpqB\ngYExrX3iE5+Yb3/725k3b14++9nP5sMf/nC23377PO1pT8t55523al7XzrHVxzfffPN84QtfyKmn\nnppzzz03kydPzhFHHJFTTjklBx544MPWbrHFFrn66qtz4okn5owzzsg222yTs88+O2eeeebDPmP1\nzxlp5ilTpuTaa6/NG97whlx44YWZOnVqjjrqqBx22GE57LDDxvT76oVa+ZC4jV1VzUyycOHChZk5\nc2a/4wAAAADjYNGiRZk1a1a6/v2/ZMmSUd/e2GsDAwOZPn16XzNs7B7tv4OV15PMaq0teqT3svMM\nAAAA2GRMnz5dccWoODAAAAAAADoozwAAAACgg/IMAAAAADoozwAAAACgg/IMAAAAADoozwAAAACg\ng/IMAAAAADoozwAAAACgg/IMAAAAADps3u8AsCFZsmRJBgcH+x1jQhsYGMj06dP7HQMAAAB6QnkG\nI7RkyZLs+9R9s/y+5f2OMqFNnjI5N914kwINAACAjYLyDEZocHBwqDg7IslAv9NMUIPJ8suXZ3Bw\nUHkGAABMSBPhjqLxuGPn7LPPzrx587JixYokye67754XvOAF+cd//Meefs7qnzU4OJjtttvuEef2\nOsfPfvaz7LHHHrn44ovzute9rifv+WiUZzBaA0me1O8QAAAAjNZEuaNoPO7YqapU1arXkyZNWuN1\nL639WY82d0OnPAMAAAA2CRPijqLH6I6dm266KZMmOSeyF5RnAAAAwKZlE7ijaIsttuh3hI2GChIA\nAABgA/L1r389z3rWszJlypQ85SlPyUc+8pGHzdl9991z3HHHrXr94IMP5pxzzsk+++yTKVOmZGBg\nIIcccki+/OUvr5pzww035Nhjj81ee+2VKVOmZOedd87rX//63HPPPevMcdddd+XII4/MtGnTMjAw\nkNNOOy3333//o+ZftmxZTjvttEyfPj2TJ0/OU57ylJx33nlprT1s3jHHHJNtt902T3jCE3Lsscdm\n6dKlI/019YydZwAAAAAbiB/84AeZPXt2nvjEJ2bevHl54IEHcvbZZ+eJT3ziGvPWftbYWWedlXPP\nPTcnnHBCnvWsZ+XXv/51vvvd72bRokU59NBDkyRf/OIXc8stt+S4447LTjvtlB/+8Ie56KKL8qMf\n/Sjf/OY313i/1lqOPPLI7LHHHjn33HPzrW99Kx/4wAeydOnSXHzxxZ3577vvvjz3uc/Nf//3f+fE\nE0/Mrrvumuuuuy5ve9vb8otf/CIXXHDBqrkve9nLct111+Wkk07KU5/61Hz2s5/N0Ucf/Zg/R015\nBgAAALCBOPPMM5MM7T7bZZddkiSvfOUrs//++z/iuiuvvDJ//Md/nA9/+MOdc0455ZScfvrpa4wd\ndNBBec1rXpNvfOMbOfjgg9e4ttdee+Xyyy9Pkpx00knZZptt8uEPfzhvfvObO/Ocf/75ueWWW3L9\n9ddnzz33TJIcf/zx2XnnnfPe9743b3rTm7LLLrvkc5/7XP7jP/4j733ve1dlOumkk/K85z3vEX/O\n8eC2TQAAAIANwIoVK3LNNdfkFa94xariLEn23XffzJ49+xHXbrvttvnhD3+YH//4x51zttxyy1Xf\n33///bn77rtz0EEHpbWWRYsWrTG3qnLKKaesMfaGN7whrbVceeWVnZ/xL//yLznkkEMybdq03H33\n3au+Dj300Dz44IP52te+lmSo7Ntiiy1y4oknrvGZKz/jsaQ8AwAAANgA3HXXXbnvvvuy9957P+za\nvvvu+4hr582bl6VLl2afffbJAQcckDPOOCM33HDDGnN+9atf5Y1vfGN22mmnTJkyJTvssEP23HPP\nVFWWLVv2sPdcO8dee+2VSZMm5dZbb+3McfPNN+fqq6/ODjvssMbXi170olRV7rzzziTJkiVLsvPO\nO2fq1Kmj+jnHg9s2AQAAADZyhxxySH7yk5/kc5/7XK655pp87GMfy/z583PRRRetOljg1a9+db71\nrW/ljDPOyIEHHpitt946K1asyOzZs7NixYpH/YyRPItsxYoVedGLXpS/+Zu/WecOsn322Wf0P9w4\nU54BAAAAbAB22GGHTJkyJTfffPPDrt14442Pun7bbbfN0UcfnaOPPjr33ntvDjnkkJx99tk57rjj\nsnTp0lx77bV5xzvekbe//e2r1jzSbZ4333xzdttttzXmrlixIrvvvnvnmr322iu//e1v8/znP/8R\ns+6222659tprc++9966x+2wkP2evuW0TAAAAYAMwadKkzJ49O//6r/+a2267bdX44sWLc8011zzi\n2nvuuWeN11OnTs3ee++d+++/P0my2WabJcnDdpjNnz9/nTvKWmv54Ac/uMbYBz7wgVRVXvKSl3Tm\nOPLII/PNb35znXmXLVu26vNf+tKX5oEHHljjgIMVK1bk7//+7522CQAAADCuBjfczz7nnHNy9dVX\n5znPeU5OPvnkPPDAA7nwwguz//775/vf/37nuv322y/Pe97zMmvWrGy33Xb5zne+k3/5l3/Jqaee\nmiTZZptt8tznPjfnnXdefv/732eXXXbJNddck1tvvbXzAf233HJLXv7yl+ewww7Lddddl0996lM5\n6qij8vSnP70zx1ve8pZcccUV+ZM/+ZMcc8wxmTVrVn73u9/l+9//fi6//PLceuut2W677XL44Yfn\n4IMPzlvf+tbccsst2W+//XL55ZfnN7/5zfr9AsdAeQYAAABsEgYGBjJ5yuQsv3x5X3NMnjI5AwMD\nY1r79Kc/Pddcc01OP/30nHXWWXnyk5+cefPm5Y477lijPKuqNXZovfGNb8wVV1yRL37xi7n//vuz\n22675Z3vfGfe/OY3r5qzYMGCvOENb8iHPvShtNYye/bsXHXVVXnSk570sN1ekyZNyqc//emceeaZ\nedvb3pbNN988p556as4777w15q2dY8qUKfna176Wd77znbnssstyySWX5PGPf3z22WefzJs3L9Om\nTVu17vOf/3xOO+20fOpTn0pV5eUvf3kuuOCCPPOZzxzT726s6rE+3rNfqmpmkoULFy7MzJkz+x2H\nDdCiRYsya9as5IQkT+p3mgnqjiQfSfz/DAAA6JeV/3br+nfJkiVLMjjYz61nQyXe9OnT+5phY/do\n/x2s+jd+Mqu1tuiR3svOMwAAAGCTMX36dMUVo+LAAAAAAADooDwDAAAAgA7KMwAAAADooDwDAAAA\ngA7KMwAAAADooDwDAAAAgA6b9zsAAAAAQK8tXry43xHoo17+7688AwAAADYaAwMDmTp1ao466qh+\nR6HPpk6dmoGBgfV+H+UZAAAAsNGYPn16Fi9enMHBwX5Hoc8GBgYyffr09X4f5RkAAACwUZk+fXpP\nShNIHBgAAAAAAJ2UZwAAAADQQXkGAAAAAB2UZwAAAADQYUKUZ1V1SFVdUVW3V9WKqnrZo8x/RVVd\nU1V3VtWyqrquql78WOUFAAAAYNMwIcqzJFsluT7JyUnaCOY/N8k1SV6SZGaSf0/y+ao6cNwSAgAA\nALDJ2bzfAZKktXZ1kquTpKpqBPPnrjX09qp6eZLDk/xn7xMCAAAAsCmaKDvP1stw4bZNknv6nQUA\n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\nkiRJkiR1+P8BUyi0vDLsWrAAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2f2b179b50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = pd.DataFrame()\n",
"\n",
"df['enabled'] = aggregated_enabled[:4]\n",
"df['disabled'] = aggregated_disabled[:4]\n",
"df.index = [\"OnTime\", \"NoVsync\", \"MissedComposite\", \"SlowComposite\"]\n",
"p = df.plot(kind='bar', figsize=(15, 7))\n",
"p.set_ylabel(\"Number of frames\")\n",
"p.set_xlabel(\"CONTENT_FRAME_TIME_REASON failure reason\")"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1107771564.0, 1396238327.0)"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(sum(aggregated_enabled), sum(aggregated_disabled))"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>enabled</th>\n",
" <th>disabled</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>OnTime</th>\n",
" <td>969739173.0</td>\n",
" <td>1.291693e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NoVsync</th>\n",
" <td>6987814.0</td>\n",
" <td>4.119902e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MissedComposite</th>\n",
" <td>81144277.0</td>\n",
" <td>5.859922e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SlowComposite</th>\n",
" <td>49900300.0</td>\n",
" <td>4.182621e+07</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" enabled disabled\n",
"OnTime 969739173.0 1.291693e+09\n",
"NoVsync 6987814.0 4.119902e+06\n",
"MissedComposite 81144277.0 5.859922e+07\n",
"SlowComposite 49900300.0 4.182621e+07"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f2f2896a610>"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nDSnTAAAAAKAhZRoAAAAANKRMAwAAAICGlGkAAAAA0JAyDQAAAAAaUqYBAAAAQEObDHcAWJ8tWLAg\nPT09wx2jo3V1daW7u3u4YwAAAEBbKNOgRQsWLMiEfSZkyTNLhjtKRxs1elTuvedehRoAAAAbBGUa\ntKinp6evSHt7kq7hTtOhepIlVy5JT0+PMg0AAGAdmzFjRmbOnJne3t4kyW677ZZDDz00X/rSl4bs\nu3p6erLNNtuscW67czz44IPZfffd8+UvfzlHHXVUW665Jso0WFtdSXYa7hAAAAC0ohO27xmq7XFK\nKSmlLP88YsSIFT4P5Xe91Nz1mTINAAAA2Ch1yvY962p7nHvvvTcjRngW5dpSpgEAAAAbpY7Yvmcd\nbo+z6aabDun1NxbqSAAAAGDjtmz7nuF4tanEu+WWW/Ka17wmo0ePzite8Yp84QtfeNGc3XbbLcce\ne+zyz88//3w++tGPZu+9987o0aPT1dWVgw8+ON/5zneWz7nrrrvynve8J3vuuWdGjx6d8ePH573v\nfW+eeOKJVeb49a9/nSOPPDJjx45NV1dXTj/99CxduvQl8y9atCinn356uru7M2rUqLziFa/IrFmz\nUmt90bxjjjkm48aNy8te9rK85z3vycKFC5v+NbWFlWkAAAAA67Gf/vSnmTp1arbffvvMnDkzzz33\nXGbMmJHtt99+hXkr71V23nnn5YILLsjxxx+f17zmNfnNb36T22+/PXPnzs1hhx2WJLnxxhszf/78\nHHvssdlxxx1z991355JLLsnPfvaz3HbbbStcr9aaI488MrvvvnsuuOCCfP/738+FF16YhQsX5stf\n/vJq8z/zzDM55JBD8t///d854YQTsssuu+TWW2/N2WefnV/96lf5zGc+s3zuH/3RH+XWW2/NiSee\nmH322SdXXXVVjj766HW6D5syDQAAAGA9du655ybpW5228847J0ne8Y53ZL/99lvjeddee23+8A//\nMJ///OdXO+ekk07KmWeeucLYlClT8q53vSvf+9738rrXvW6FY3vuuWeuvPLKJMmJJ56YrbbaKp//\n/OfzwQ9+cLV5Pv3pT2f+/Pn58Y9/nD322CNJctxxx2X8+PH51Kc+lQ984APZeeedc/XVV+fmm2/O\npz71qeWZTjzxxLz+9a9f48/Zbm7zBAAAAFhP9fb25oYbbsgf//EfLy/SkmTChAmZOnXqGs8dN25c\n7r777tx///2rnbP55psvf7906dI8/vjjmTJlSmqtmTt37gpzSyk56aSTVhg75ZRTUmvNtddeu9rv\n+PrXv56DDz44Y8eOzeOPP778ddhhh+X555/Pd7/73SR95d+mm26aE044YYXvXPYd64oyDQAAAGA9\n9etf/zrPPPNM9tprrxcdmzBhwhrPnTlzZhYuXJi99947BxxwQM4666zcddddK8x58sknc9ppp2XH\nHXfM6NGjs91222WPPfZIKSWLFi160TVXzrHnnntmxIgReeCBB1ab47777sv111+f7bbbboXXG9/4\nxpRS8thjjyXpe/rq+PHjM2bMmEH9nO3mNk8AAACAjdDBBx+cn//857n66qtzww035Itf/GJmz56d\nSy65ZPmDCv7kT/4k3//+93PWWWflwAMPzJZbbpne3t5MnTo1vb29L/kdTfYy6+3tzRvf+MZ8+MMf\nXuUKs7333nvwP9wQUqYBAAAArKe22267jB49Ovfdd9+Ljt1zzz0vef64ceNy9NFH5+ijj87ixYtz\n8MEHZ8aMGTn22GOzcOHC3HTTTTn//PNzzjnnLD9nTbeF3nfffdl1111XmNvb25vddttttefsueee\n+e1vf5vf//3fX2PWXXfdNTfddFMWL168wuq0Jj9nO7nNEwAAAGA9NWLEiEydOjX/+q//moceemj5\n+Lx583LDDTes8dwnnnhihc9jxozJXnvtlaVLlyZJRo4cmSQvWoE2e/bsVa44q7Xm4osvXmHswgsv\nTCklb3rTm1ab48gjj8xtt922yryLFi1a/v1vfvOb89xzz63wwITe3t587nOf8zRPAAAAAJr56Ec/\nmuuvvz6/+7u/m/e///157rnnctFFF2W//fbLnXfeudrz9t1337z+9a/P5MmTs8022+Q///M/8/Wv\nfz2nnnpqkmSrrbbKIYccklmzZuXZZ5/NzjvvnBtuuCEPPPDAajf8nz9/ft761rfm8MMPz6233prL\nLrss06dPz/7777/aHB/60IdyzTXX5C1veUuOOeaYTJ48OU8//XTuvPPOXHnllXnggQeyzTbb5Igj\njsjrXve6fOQjH8n8+fOz77775sorr8xTTz21dn+Bg6RMAwAAADZuPev3d++///654YYbcuaZZ+a8\n887Ly1/+8sycOTOPPPLICmVaKWWFFVynnXZarrnmmtx4441ZunRpdt1113z84x/PBz/4weVz5syZ\n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\n4CHA99rmVwNvr6r/bs/ZE7gMeCZw/JwVK0mSJEmSpLE1X0amDVsXKOAKgCSbABsC35o6oaquBn4E\nbN9HgZIkSZIkSRo/8y5MSxLgA8D3quqctnlDmnDtsqHTL2uPSZIkSZIkSX+zeTHNc8ihwJbADivj\nyfbdd1/WWWed27Tttttu7Lbbbivj6SVJkiRJkrSKOe644zjuuONu03bVVVd1+tp5FaYl+TDwVODR\nVXXpwKHfAwE24Laj0zYAzpzuOQ8++GC23XbblV2qJEmSJEmSVlGjBlL95Cc/4SEPechyv3beTPNs\ng7RnAP9QVYsHj1XVhTSB2hMGzr8Lze6f35/LOiVJkiRJkjS+5sXItCSHArsBTweuS7JBe+iqqlra\n3v8A8MYk5wMXAW8HfgN8eY7LlSRJkiRJ0piaF2Ea8C80Gwx8Z6j9hcAxAFX13iRrA4fT7PZ5GvCU\nqrppDuuUJEmSJEnSGJsXYVpVdZqOWlUHAAfMajGSJEmSJEmaWPNmzTRJkiRJkiSpb4ZpkiRJkiRJ\nUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJ\nkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4Zp\nkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElS\nR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmS\nJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmS\nJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJH\nhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIk\nSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIk\nSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeG\naZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJ\nUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkdr9F2AJEmStKpbvHgxS5Ys6buMVdr666/P\nRhtt1HcZkiTNOsM0SZIkaRqLFy9miy0WsnTp9X2XskpbsGBtzj13kYGaJGnsGaZJkiRJ01iyZEkb\npH0KWNh3OauoRSxdugdLliwxTJMkjT3DNEmSJKmThcC2fRchSZJ65gYEkiRJkiRJUkeGaZIkSZIk\nSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIk\nSZIkSVJHhmmSJEmSJElSR4ZpkiRJkiRJUkeGaZIkSZIkSVJHa/RdgCRJkiRJWr7FixezZMmSvstY\nZa2//vpstNFGfZehCWCYJkmSJEnSKm7x4sVsscVCli69vu9SVlkLFqzNuecuMlDTrDNMkyRJkrRS\nLFq0qO8SVlmOmNHfasmSJW2Q9ilgYd/lrIIWsXTpHixZssTfNc06wzRJkiRJf6NLIbDHHnv0Xcgq\na8FaCzj3l+fayddKsBDYtu8ipIlmmCZJkiTpb/QnKGBnYP2+a1kFLYGlJyx1xIwkjQnDNEmSJEkr\nx/rAvfouQpKk2bVa3wVIkiRJkiRJ84VhmiRJkiRJktSR0zwlSZIkSdJYcFfh6bmz8MphmCZJkiRJ\nkuY5dxXuwp2FVw7DNEmSJEmSNM+5q/ByubPwSmOYJkmSJEmSxoO7CmsOuAGBJEmSJEmS1JFhmiRJ\nkiRJktSRYZokSZIkSZLUkWGaJEmSJEmS1JFhmiRJkiRJktSRYZokSZIkSZLUkWGaJEmSJEmS1JFh\nmiRJkiRJktSRYZokSfPccccd13cJkiRJ0sRYo+8CVrYkLwf+DdgQ+Bnwyqr6336rkiStqMWLF7Nk\nyZK+y1ilHXXUUey22259lyFJkiRNhLEK05LsCrwfeAlwBrAvcHKS+1WVPTFJmmcWL17MFlssZOnS\n6/suZZW22mqrs3jxYjbaaKO+S5EkSZLG3liFaTTh2eFVdQxAkn8B/hHYG3hvn4VJkmZuyZIlbZD2\nKWBh3+WsohZxyy17cNppp7Fwoe/Rsqy//vqGjZIkSVopxiZMS3IH4CHAO6faqqqSfBPYvrfCJEkr\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f2f29e9d190>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = pd.DataFrame()\n",
"\n",
"percent_enabled = aggregated_enabled.map(lambda x: 100.0*x/aggregated_enabled[0:].sum())\n",
"percent_disabled = aggregated_disabled.map(lambda x: 100.0*x/aggregated_disabled[0:].sum())\n",
"\n",
"df['enabled'] = percent_enabled[:4]\n",
"df['disabled'] = percent_disabled[:4]\n",
"df.index = [\"OnTime\", \"NoVsync\", \"MissedComposite\", \"SlowComposite\"]\n",
"p = df.plot(kind='bar', figsize=(15, 7))\n",
"p.set_ylabel(\"Percentage of frames\")\n",
"p.set_xlabel(\"CONTENT_FRAME_TIME_REASON failure reason\")"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>enabled</th>\n",
" <th>disabled</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>OnTime</th>\n",
" <td>87.539634</td>\n",
" <td>92.512357</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NoVsync</th>\n",
" <td>0.630799</td>\n",
" <td>0.295072</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MissedComposite</th>\n",
" <td>7.325001</td>\n",
" <td>4.196936</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SlowComposite</th>\n",
" <td>4.504566</td>\n",
" <td>2.995635</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" enabled disabled\n",
"OnTime 87.539634 92.512357\n",
"NoVsync 0.630799 0.295072\n",
"MissedComposite 7.325001 4.196936\n",
"SlowComposite 4.504566 2.995635"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [default]",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
# coding: utf-8
# In[1]:
import ujson as json
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from moztelemetry.dataset import Dataset
get_ipython().magic(u'matplotlib inline')
# We can look at the schema of the dataset we are interested in:
# In[2]:
Dataset.from_source('telemetry').schema
# Let's create a Dataset of Telemetry submissions for a given submission date:
# In[3]:
pings_dataset = (
Dataset.from_source('telemetry')
.where(docType='main')
#.where(appBuildId='20180721100146')
#.where(submissionDate ='20180925')
.where(submissionDate=lambda x: x > '20181201')
.where(appUpdateChannel="nightly")
)
# Select only the properties we need and then take a 10% sample:
# In[4]:
pings = (
pings_dataset
.select(
'clientId',
buildId='application.buildId',
device_resest='payload.processes.gpu.histograms.DEVICE_RESET_REASON',
frame_time_reason='payload.processes.gpu.histograms.CONTENT_FRAME_TIME_REASON.values',
experiments='environment.experiments',
osName='environment.system.os.name',
gfx='environment.system.gfx')
.records(sc, sample=1.)
)
# In[5]:
pings.count()
# Caching is fundamental as it allows for an iterative, real-time development workflow:
# In[6]:
cached = pings.cache()
# How many pings are we looking at?
# In[7]:
cached.count()
# In[8]:
wrExperiment = cached.filter(lambda p: "experiments" in p and p["experiments"]).filter(lambda p: "prefflip-webrender-v1-3-1492568" in p["experiments"])
wrExperiment.count()
# In[9]:
cached = cached.filter(lambda p: "features" in p["gfx"])
cached = cached.filter(lambda p: "wrQualified" in p["gfx"]["features"])
cached.count()
# In[10]:
wrQualified = cached.filter(lambda p: p["gfx"]["features"]["wrQualified"]["status"] == "available" )
wrQualified.count()
wrQualified = wrQualified.filter(lambda p: len(p["gfx"]["monitors"]) == 1 and p["gfx"]["monitors"][0]["refreshRate"] == 60)
# In[11]:
wrExperiment = cached.filter(lambda p: "experiments" in p and p["experiments"]).filter(lambda p: "prefflip-webrender-v1-3-1492568" in p["experiments"])
wrExperiment.map(lambda p: p["gfx"]["features"]["compositor"]).countByValue()
# In[12]:
wrExperiment = wrExperiment.filter(lambda p: p["gfx"]["features"]["wrQualified"]["status"] == "available")
#wrExperiment = wrExperiment.filter(lambda p: len(p["gfx"]["monitors"]) == 1 and p["gfx"]["monitors"][0]["refreshRate"] == 60)
# In[13]:
wrExperiment.map(lambda p: p["experiments"]["prefflip-webrender-v1-3-1492568"]["branch"]).countByValue()
# In[14]:
treatment = wrExperiment.filter(lambda p: p["experiments"]["prefflip-webrender-v1-3-1492568"]["branch"] == "enabled")
control = wrExperiment.filter(lambda p: p["experiments"]["prefflip-webrender-v1-3-1492568"]["branch"] == "disabled")
treatment.count(), control.count()
# In[15]:
treatment.map(lambda p: p["gfx"]["features"]["compositor"]).countByValue()
# In[16]:
wrEnabled = treatment.filter(lambda p: p["gfx"]["features"]["compositor"] == "webrender")
wrDisabled = control.filter(lambda p: p["gfx"]["features"]["compositor"] == "d3d11")
wrEnabled.count(), wrDisabled.count()
# In[17]:
wrDisabled2 = wrDisabled.sample(False, wrEnabled.count()/(wrDisabled.count()*1.0))
wrDisabled3 = wrDisabled.sample(False, wrEnabled.count()/(wrDisabled.count()*1.0))
wrDisabled = wrDisabled.sample(False, wrEnabled.count()/(wrDisabled.count()*1.0))
# In[18]:
wrDisabled3.count(), wrDisabled.count(), wrDisabled2.count(), wrEnabled.count()
# In[19]:
desired_count = float(min(wrEnabled.count(), wrDisabled.count()))
wrEnabled = wrEnabled.sample(False, desired_count / float(wrEnabled.count()))
wrDisabled = wrDisabled.sample(False, desired_count / float(wrDisabled.count()))
(wrEnabled.count(), wrDisabled.count())
# In[20]:
def aggregate_series(s1, s2):
"""Function to sum up series; if one is None, return other"""
if s1 is None:
return s2
if s2 is None:
return s1
return s1.add(s2, fill_value=0)
aggregated_enabled = (
wrEnabled
.filter(lambda p: p['frame_time_reason'])
.map(lambda p: pd.Series(p['frame_time_reason']))
.reduce(aggregate_series)
)
aggregated_disabled = (
wrDisabled
.filter(lambda p: p['frame_time_reason'])
.map(lambda p: pd.Series(p['frame_time_reason']))
.reduce(aggregate_series)
)
# In[37]:
df = pd.DataFrame()
df['enabled'] = aggregated_enabled[:4]
df['disabled'] = aggregated_disabled[:4]
df.index = ["OnTime", "NoVsync", "MissedComposite", "SlowComposite"]
p = df.plot(kind='bar', figsize=(15, 7))
p.set_ylabel("Number of frames")
p.set_xlabel("CONTENT_FRAME_TIME_REASON failure reason")
# In[38]:
(sum(aggregated_enabled), sum(aggregated_disabled))
# In[39]:
df
# In[40]:
df = pd.DataFrame()
percent_enabled = aggregated_enabled.map(lambda x: 100.0*x/aggregated_enabled[0:].sum())
percent_disabled = aggregated_disabled.map(lambda x: 100.0*x/aggregated_disabled[0:].sum())
df['enabled'] = percent_enabled[:4]
df['disabled'] = percent_disabled[:4]
df.index = ["OnTime", "NoVsync", "MissedComposite", "SlowComposite"]
p = df.plot(kind='bar', figsize=(15, 7))
p.set_ylabel("Percentage of frames")
p.set_xlabel("CONTENT_FRAME_TIME_REASON failure reason")
# In[41]:
df
# In[ ]:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment