Performance and scalability

Revision as of 15:21, 26 November 2009 by Tim Hunt (talk | contribs) (Limit the amount of RAM each page requires to generate)

Jump to: navigation, search

Performance is about allowing Moodle to support as many users as possible with a certain amount of hardware.

Of course you can always always buy a bigger server. Scalability means ensuring that if you buy a server that is about twice as powerful, it can then handle about twice as much load.

This page is part of the Moodle coding guidelines

Writing code that scales and performs

Every page should only use a fixed number of database queries

  • Be very suspicious if you ever see database code inside a loop.
    • This is sometimes hard to spot if the database access is hidden in a function.
  • Instead use JOINs and subqueries. (get_records_sql, get_recordset_sql, etc.).
    • Or look for a Moodle API function that gets the information you want as efficiently as possible. (For example, get_users_by_capability)
    • See the Database guidelines for how to write SQL that will work on all our supported databases.

Limit the amount of RAM each page requires to generate

  • Large reports should be broken into pages of a fixed size.
  • Processing large amounts of data from the database should be handled with a recordset (when you cannot do all the processing in the database with SQL).

Be cautious about other external calls

Like a database query, there are other operations that are much slower than just executing PHP code. For example:

  • running a shell script
  • making a web-service call
  • (to a lesser extent) working with files.

Whenever you are doing these things, worry about performance.

How to improve the performance of your code

Measure during development

  • Use tools like JMeter to subject your new code to load.
  • Use the random course/user generator (build in to Moodle 2.0, available as an add on for Moodle 1.9), so you can test with many users and courses.

Measure in production

  • Moodle has the facility to log the slowest database queries each day, and email them to you. Turn it on.

How big a site should Moodle be able to manage

Looking at the statistics, the largest sites in the world currently have

  • Up to 1 000 000 users
  • Up to 50 000 courses
  • Up to 5 000 users per course
  • Up to 50 roles
  • Up to 100 course categories nested up to about 10 levels deep.
  • Up to XXX activities in a course.
  • Please add more things here.

When planning and testing your code, these are the sorts of numbers you should be contemplating. However, do not assume that Moodle sites will never get bigger than this.

Even if you can't test sites this big on your development server, you should use the generator script so you can test your code in a Moodle site that is not tiny.

See also