How to Test Performance

How to Test Performance

Load Testing

Server Side

Legacy Tests - https://github.com/edx/load-tests (internal-only repo)

Framework - https://github.com/locustio/locust(used currently in edx-load-tests. We also have a fork, and some legacy JMeter scripts)

Client Side (Browser)

Framework - http://www.sitespeed.io/ (Install via npm)

Useful add-in - https://github.com/edx/edx-sitespeed (for logged-in sessions)

Network throttling tools: Network Link Conditioner, tc (ubuntu native), wondersharper (which does not work on virtual machines), etc


Monitoring in Environments

New Relic


Profiling

PyInstrument

PyInstrument can be helpful because of the way it writes output data as a call tree. More info here:

Example of a profile using pyinstrument, writing output to a file:

from pyinstrument import Profiler profiler = Profiler(use_signal=False) profiler.start() # Do stuff here profiler.stop() # write profile data to file with open('my.log', 'w') as f: f.write(profiler.output_text())

SnakeViz

Here are the steps to profile your python code with cProfile and then view the results using SnakeViz.

Tips

When profiling locally, disable features that would affect performance numbers.  For instance, the following can be set in the a local [lms/cms]/envs/private.py file:

from .common import INSTALLED_APPS, MIDDLEWARE_CLASSES, FEATURES def tuple_without(source_tuple, exclusion_list): """Return new tuple excluding any entries in the exclusion list. Needed because tuples are immutable. Order preserved.""" return tuple([i for i in source_tuple if i not in exclusion_list]) INSTALLED_APPS = tuple_without(INSTALLED_APPS, ['debug_toolbar', 'debug_toolbar_mongo']) MIDDLEWARE_CLASSES = tuple_without(MIDDLEWARE_CLASSES, [ 'django_comment_client.utils.QueryCountDebugMiddleware', 'debug_toolbar.middleware.DebugToolbarMiddleware', ]) DEBUG_TOOLBAR_MONGO_STACKTRACES = False import contracts contracts.disable_all()