diff --git a/.travis.yml b/.travis.yml index fd4a0c04e6d5c61d3a87b90e8651c2dabed1adf5..5d071be424f9cd431378297c3b8a94d524f03067 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,4 +22,5 @@ install: script: - cd $TRAVIS_BUILD_DIR - 'echo backend : Agg > matplotlibrc' # Otherwise it tries to use tkinter + - export PATH=$TRAVIS_BUILD_DIR/tools/x86_64/:$PATH # For trace-cmd - source init_env && lisa-test tests/lisa/ diff --git a/ipynb/examples/android/benchmarks/Android_Jankbench.ipynb b/ipynb/examples/android/benchmarks/Android_Jankbench.ipynb index 9dab2491c8fa20768d39470bcad59b71bf028ec5..88347cca09a6943d5bfc2be06d68dbe013ecd3a8 100644 --- a/ipynb/examples/android/benchmarks/Android_Jankbench.ipynb +++ b/ipynb/examples/android/benchmarks/Android_Jankbench.ipynb @@ -399,7 +399,10 @@ "def overall_statistics(df):\n", " byname_test = df.groupby(['name','test']).total_duration.describe(percentiles=[0.9, 0.95, 0.99])\n", " stats = pd.DataFrame(byname_test)\n", - " stats = stats.unstack()\n", + " # If using old Pandas, convert GroupBy.describe format to new version\n", + " # http://pandas.pydata.org/pandas-docs/version/0.20/whatsnew.html#groupby-describe-formatting\n", + " if 'count' not in stats.columns:\n", + " stats = stats.unstack\n", " return stats\n", "\n", "stats = overall_statistics(df)\n", diff --git a/ipynb/tutorial/00_LisaInANutshell.ipynb b/ipynb/tutorial/00_LisaInANutshell.ipynb index d91c10412517bde1d4b3fc4a47dbdc3adde34c15..2d117c0d9966d3184a69351419227d00dcbca996 100644 --- a/ipynb/tutorial/00_LisaInANutshell.ipynb +++ b/ipynb/tutorial/00_LisaInANutshell.ipynb @@ -2060,7 +2060,6 @@ "\n", "# # Group sched_switch event by task switching into the CPU\n", "# df = df.groupby('next_pid').describe(include=['object'])\n", - "# df = df.unstack()\n", "\n", "# # Sort sched_switch events by number of time a task switch into the CPU\n", "# df = df['next_comm'].sort_values(by=['count'], ascending=False)\n", diff --git a/libs/utils/analysis/tasks_analysis.py b/libs/utils/analysis/tasks_analysis.py index 42beae6a2233a45d4359f4c8f3843d29a6db1c47..8faf169a346dcdec75ef0b1745b0cdc3e2fbbccd 100644 --- a/libs/utils/analysis/tasks_analysis.py +++ b/libs/utils/analysis/tasks_analysis.py @@ -20,6 +20,7 @@ import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import numpy as np +import pandas as pd import pylab as pl import re @@ -77,10 +78,13 @@ class TasksAnalysis(AnalysisModule): len(big_tasks), min_utilization) # Compute number of samples above threshold - big_tasks_stats = big_tasks_events.groupby('pid')\ - .describe(include=['object']) - big_tasks_stats = big_tasks_stats.unstack()['comm']\ - .sort_values(by=['count'], ascending=False) + desc = big_tasks_events.groupby('pid').describe(include=['object']) + if isinstance(desc.index, pd.MultiIndex): + # We must be running on a pre-0.20.0 version of pandas. + # unstack will convert the old output format to the new. + # http://pandas.pydata.org/pandas-docs/version/0.20/whatsnew.html#groupby-describe-formatting + desc = desc.unstack() + big_tasks_stats = desc['comm'].sort_values(by=['count'], ascending=False) # Filter for number of occurrences big_tasks_stats = big_tasks_stats[big_tasks_stats['count'] > min_samples] @@ -307,17 +311,21 @@ class TasksAnalysis(AnalysisModule): signals_to_plot = {'residencies'} signals_to_plot = list(signals_to_plot.intersection(signals)) if len(signals_to_plot) > 0: - axes = plt.subplot(gs[plot_id, 0]) - axes.set_title( - 'Task [{0:d}:{1:s}] Residency (green: LITTLE, red: big)' - .format(tid, task_name) - ) - plot_id = plot_id + 1 - is_last = (plot_id == plots_count) - if 'sched_overutilized' in signals: - signals_to_plot.append('sched_overutilized') - self._plotTaskResidencies(axes, tid, signals_to_plot, is_last) - savefig = True + if not self._trace.has_big_little: + self._log.warning( + 'No big.LITTLE platform data, residencies plot disabled') + else: + axes = plt.subplot(gs[plot_id, 0]) + axes.set_title( + 'Task [{0:d}:{1:s}] Residency (green: LITTLE, red: big)' + .format(tid, task_name) + ) + plot_id = plot_id + 1 + is_last = (plot_id == plots_count) + if 'sched_overutilized' in signals: + signals_to_plot.append('sched_overutilized') + self._plotTaskResidencies(axes, tid, signals_to_plot, is_last) + savefig = True # Plot PELT signals signals_to_plot = {'load_sum', 'util_sum', 'period_contrib'}