Jira Legacy | ||||||
---|---|---|---|---|---|---|
|
Table of Contents:
- Goals
- Testing Strategy
- Thread and comment pool
- Spikes in production data
- Staff vs. Normal user
- Pagination issue
- Other notes
- Endpoints
- Seeding data
- Forums Analysis
- Test Details
Anchor | ||||
---|---|---|---|---|
|
Understand the load we are able to handle with the discussion API for when the mobile app is released.
- What can the server handle?
- Understand the the overhead between the discussion API and the ruby forums code.
- Does the Discussion API perform better, worse, or on par with the browser's forums?
- What does the forums performance look like in general?
Usage patterns to look out for:
- Default page size for the browser is 25 while the mobile device will be using 10. It is possible that more requests could be sent for the same amount of information.
- Push notifications
- There is a possibility for a different usage pattern to look out for. If there is a popular thread, bursts of requests can be expected.
- Increased forum usage as there is currently no notifications for the browser.
- The browser can display the Threads, Response, and Comments all at once. The mobile app treats all three of these as separate views. It is possible that more requests could be sent for the same amount of information.
- General Usage. Discussions on mobile could naturally increase discussion forums usage.
Endpoints:
- /courses/(course_id)/
- GET
- /course_topics/(course_id)
- GET
- /threads/
- /threads/(thread_id)
- /comments
- /comments/(comment_id)
Testing Strategy:
Originally the plan was to isolate each endpoint and determine what kind of load it can handle, but after analysis of the data, some of these endpoints seem unnecessary to isolate for a load test. These endpoints include DELETE and PATCH which are a significantly small part of the overall load in production. For the isolated test for these endpoints, it will be paired with it's appropriate GET Thread/Comment. For example, every DELETE Thread request requires a thread_id. We obtain this thread_id by calling GET Thread List with randomize parameters, which returns a list of threads where one is then randomly selected. This selected thread is then DELETEd. Below is the chart of the additional request we make. As long the ratio of how many of these requests happen in each task is understood, we can get the desired endpoint distribution.
...
Request
...
Anchor | ||||
---|---|---|---|---|
|
Originally the plan was to isolate each endpoint and determine what kind of load it can handle, but after analysis of the data, some of these endpoints seem unnecessary to isolate for a load test. These endpoints include DELETE and PATCH which are a significantly small part of the overall load in production. For the isolated test for these endpoints, it will be paired with it's appropriate GET Thread/Comment. For example, every DELETE Thread request requires a thread_id. We obtain this thread_id by calling GET Thread List with randomize parameters, which returns a list of threads where one is then randomly selected. This selected thread is then DELETEd. Below is the chart of the additional request we make. As long the ratio of how many of these requests happen in each task is understood, we can get the desired endpoint distribution.
Request | Requires | Returns | Order of requests | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
GET Thread | thread_id | Thread | Taken from thread_id pool | |||||||||
GET Thread List | Thread List | GET Thread List | ||||||||||
GET Comment List | thread_id | Comment List | GET Thread List | GET Comment List | ||||||||
POST Thread | course_id | Thread | POST Thread | |||||||||
POST Response | thread_id | Comment | GET Thread List | POST Response | ||||||||
POST Comment | Comment | Comment | GET Thread List | GET Comment List | POST comment | |||||||
PATCH Thread | thread_id | Thread | GET Thread List | PATCH Thread | ||||||||
PATCH Comment | comment_id | Comment | GET Thread List | GET Comment List | PATCH Comment | |||||||
DELETE Thread | thread_id | No Content | POST Thread List | GET Thread List | DELETE Thread | |||||||
DELETE Response | comment_id | No Content | GET Thread List | POST Response | GET Comment List | DELETE Response* | ||||||
DELETE Comment | comment_id | No Content | GET Thread List | GET Comment List | POST Thread | course_id | Thread | POST Thread | ||||
POST Response | thread_id | Comment | GET Thread List | POST Response | ||||||||
POST Comment | Comment | Comment | GET Thread List | GET Comment List | POST comment | |||||||
PATCH Thread | thread_id | Thread | GET Thread List | PATCH Thread | ||||||||
PATCH Comment | comment_id | Comment | GET Thread List | GET Comment List | PATCH Comment | |||||||
DELETE Thread | thread_id | No Content | POST Thread List | GET Thread List | DELETE Thread | |||||||
DELETE Response | comment_id | No Content | GET Thread List | POST Response | GET Comment List | DELETE Response* | ||||||
DELETE Comment | comment_id | No Content | GET Thread List | GET Comment List | POST Comment | DELETE Comment* |
*GET Thread List can always return a response (so we delete a random response), but will not always return a comment so the comment created will be the one deleted.
Thread and Comment pool:
Various methods of select post data were considered.
- Selecting threads from a smaller pool or selecting the same thread. Rather than getting the entire list of thread_ids to send requests against, we would just store a random portion of the threads. A test was run to see if matters whether the retrieved thread was random or not, but the sandbox it was run against did not have the correct mongo indexes set up. Regardless, this strategy would not work when trying to DELETE threads as the pool of potential threads would be smaller. Additionally this relies on storing data that must be shared amongst the locust users which could lead to race conditions as a locust user could be trying to GET a thread that another locust user was in the middle of DELETEing. When dealing with much larger file IO operations, it could cause some limitations on the machine that spawns the locusts.
- Retrieving the list of thread ids when starting locust. This method was effective up until the number of threads in the data set started to increase. As the median number of posts in a course is ~2000, when trying to retrieve 20*(page size max of 100), it would take 20 queries. Additionally, as mentioned in the above strategy, storing data amongst the locust users is not a trivial task. Each locust user would try to generate it's own list of threads which is unacceptable. If a thread was POSTed or DELETEd, only that locust user would have that updated information. Attempts at using the lazy module did not work either as each list of threads was instantiated separately by each locust user. Again, even if the locust users were able to use the same global variables, there would be race conditions.
Calling GET thread_list per DELETE/PATCH/GET_comment. Since the ratio of GET thread_list is significantly higher than any of the other calls except for GET Thread, we can achieve the desired distribution of requests for the discussion API without having to store any of the thread_ids. The table below is a 7 day snapshot on NewRelic for the discussion forums. The only drawback is that in order to GET a single thread, we need to have a thread_id. This issue will be discussed in the next bullet.
Action Count Discussion API Call .forum.views:single_thread 675980 4760 GET Thread .forum.views:forum_form_discussion 234783 1653 GET Thread List .forum.views:inline_discussion 155176 1093 GET Thread List create_thread 31176 220 POST Thread create_comment 27438 193 POST comment create_sub_comment 14345 101 POST comment users 13820 97 - .forum.views:user_profile 12336 87 - .forum.views:followed_threads 7698 54 GET Thread List vote_for_comment 6731 47 PATCH Comment vote_for_thread 6242 44 PATCH Thread upload 4208 30 - update_comment 3403 24 PATCH Comment follow_thread 3870 27 PATCH Thread update_thread 2827 20 PATCH Thread delete_thread 2091 15 DELETE Thread endorse_comment 1232 9 PATCH Comment delete_comment 770 5 DELETE Comment flag_abuse_for_comment 373 3 PATCH Comment flag_abuse_for_thread 142 1 PATCH Thread - Using pre-stored thread_id data. Since GET Thread is called more than GET Thread List, we cannot use GET Thread List to get a thread_id. Instead, we can use a pre-defined set of thread_ids as mentioned in the first two bullets. This will allow us to be able to test GET Threads in isolation. Unfortunately the issue of trying to GET a DELETEd thread may still arise. Another option could be to have the locust user only call GET Thread List once and then run multiple GET Thread's. Again, the same issue still arises if one of those Threads happened to get DELETEd.
Production Spikes in response time:
When running some early tests, it was found that some of the requests that were believed to be slow on production, were not appearing that way on the loadtests.
Looking at the errors that show up on GET Thread, the response time is 20s, which is the time out limit. When looking for this thread, a 404 is returned. Other factors that are involved are courses that have many posts, may take longer to GET information from. These courses, although the exception, mixed in with normal courses, could explain the spikes in the data.
Staff vs. Normal User:
Using users with staff access was thrown into consideration as it would be make some of the permissions a bit more difficult for some discussion forums actions such as editing the body of a thread. Some tests were ran to see if there was a difference. No difference was found the tests that were designed to check for a difference.
Things that were left out:
Moderator actions
- Pin Thread - Not implemented
- Open/Close Thread -Not implemented
- Endorsed - Not Implemented
Course topics - This will be addressed at another time.
Pagination:
(FILL THIS UTTTT)
/threads/
...
Will also be testing against different course sizes.
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 10 locust users with min/max time of 1000/2000ms, GET requests for sent for either a single thread or randomly from a selection of 10% of the threads in a course. This was tested against a sandbox.
Update: This conclusion is invalid as the sandbox does not have the proper indexes.
|
...
Expand | ||
---|---|---|
| ||
Unfortunately locust ran into a calculation error when running a post test so there is no table data. After 1,000,000 posts in 24 hours, the response time remain constant. This was tested against https://courses-loadtest.edx.org/ |
/threads/{thread_id}
...
Waiting on Loadtest env to get meaningful results. Refer to /threads/get
...
Expand | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||
This was tested against a t2.large sandbox.
|
Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 2 locust user intentionally split between staff and non-staff tasks, PATCH requests were sent with a 500ms wait time. This was tested against a t2.large sandbox.
|
Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
...
Expand | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||
For every DELETE thread, we POST a Thread and then GET a thread from the thread pool. This was tested against a t2.large.sandbox.
|
/comments/
...
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 10 locust users with min/max time of 1000/2000ms, GET requests for sent for 1 of 10 threads with 100 responses in increasing increments of 100 responses, each with single comment. The page_size seemed to be the parameter that affected the response time. This was tested against a t2.large sandbox.
|
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 10 locust users with min/max time of 1000/2000ms, GET requests for sent for 1 of 10 threads where the chosen thread will contain a response of 50, 100, 150, 200... comments increasing in increments of 50. This was tested against a t2.large sandbox.
|
...
POST should be similar to POSTing threads.
/comments/comment_id
...
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
...
Comment | DELETE Comment* |
*GET Thread List can always return a response (so we delete a random response), but will not always return a comment so the comment created will be the one deleted.
Thread and Comment pool:
Various methods of select post data were considered.
- Selecting threads from a smaller pool or selecting the same thread. Rather than getting the entire list of thread_ids to send requests against, we would just store a random portion of the threads. A test was run to see if matters whether the retrieved thread was random or not, but the sandbox it was run against did not have the correct mongo indexes set up. Regardless, this strategy would not work when trying to DELETE threads as the pool of potential threads would be smaller. Additionally this relies on storing data that must be shared amongst the locust users which could lead to race conditions as a locust user could be trying to GET a thread that another locust user was in the middle of DELETEing. When dealing with much larger file IO operations, it could cause some limitations on the machine that spawns the locusts.
- Retrieving the list of thread ids when starting locust. This method was effective up until the number of threads in the data set started to increase. As the median number of posts in a course is ~2000, when trying to retrieve 20*(page size max of 100), it would take 20 queries. Additionally, as mentioned in the above strategy, storing data amongst the locust users is not a trivial task. Each locust user would try to generate it's own list of threads which is unacceptable. If a thread was POSTed or DELETEd, only that locust user would have that updated information. Attempts at using the lazy module did not work either as each list of threads was instantiated separately by each locust user. Again, even if the locust users were able to use the same global variables, there would be race conditions.
Calling GET thread_list per DELETE/PATCH/GET_comment. Since the ratio of GET thread_list is significantly higher than any of the other calls except for GET Thread, we can achieve the desired distribution of requests for the discussion API without having to store any of the thread_ids. The table below is a 7 day snapshot on NewRelic for the discussion forums. The only drawback is that in order to GET a single thread, we need to have a thread_id. This issue will be discussed in the next bullet.
Action Count Discussion API Call .forum.views:single_thread 675980 4760 GET Thread .forum.views:forum_form_discussion 234783 1653 GET Thread List .forum.views:inline_discussion 155176 1093 GET Thread List create_thread 31176 220 POST Thread create_comment 27438 193 POST comment create_sub_comment 14345 101 POST comment users 13820 97 - .forum.views:user_profile 12336 87 - .forum.views:followed_threads 7698 54 GET Thread List vote_for_comment 6731 47 PATCH Comment vote_for_thread 6242 44 PATCH Thread upload 4208 30 - update_comment 3403 24 PATCH Comment follow_thread 3870 27 PATCH Thread update_thread 2827 20 PATCH Thread delete_thread 2091 15 DELETE Thread endorse_comment 1232 9 PATCH Comment delete_comment 770 5 DELETE Comment flag_abuse_for_comment 373 3 PATCH Comment flag_abuse_for_thread 142 1 PATCH Thread - Using pre-stored thread_id data. Since GET Thread is called more than GET Thread List, we cannot use GET Thread List to get a thread_id. Instead, we can use a pre-defined set of thread_ids as mentioned in the first two bullets. This will allow us to be able to test GET Threads in isolation. Unfortunately the issue of trying to GET a DELETEd thread may still arise. Another option could be to have the locust user only call GET Thread List once and then run multiple GET Thread's. Again, the same issue still arises if one of those Threads happened to get DELETEd.
Production Spikes in response time:
When running some early tests, it was found that some of the requests that were believed to be slow on production, were not appearing that way on the loadtests.
Looking at the errors that show up on GET Thread, the response time is 20s, which is the time out limit. Other factors that are involved are courses that have many posts, may take longer to GET information from. These courses, although the exception, mixed in with normal courses, could explain the spikes in the data.
Staff vs. Normal User:
Using users with staff access was thrown into consideration as it would be make some of the permissions a bit more difficult for some discussion forums actions such as editing the body of a thread. Some tests were ran to see if there was a difference. No difference was found the tests that were designed to check for a difference.
Pagination:
There were some concerns that the pagination in the forums code are not working properly. A series of tests will be run against courses of different sizes and compared. The idea is that if the pagination is working correctly, all the courses should be returning threads with similar response times. If it is not working correctly, course with more posts will take longer to return threads than a smaller course.
Things that were left out:
Moderator actions
- Pin Thread - Not implemented
- Open/Close Thread -Not implemented
- Endorsed - Not Implemented
Course topics - This will be addressed at another time.
...
Endpoints:
Anchor | ||||
---|---|---|---|---|
|
- /courses/(course_id)/
- GET
- /course_topics/(course_id)
- GET
- /threads/
- /threads/(thread_id)
- /comments
- /comments/(comment_id)
Usage patterns to look out for:
- Default page size for the browser is 25 while the mobile device will be using 10. It is possible that more requests could be sent for the same amount of information.
- Push notifications
- There is a possibility for a different usage pattern to look out for. If there is a popular thread, bursts of requests can be expected.
- Increased forum usage as there is currently no notifications for the browser.
- The browser can display the Threads, Response, and Comments all at once. The mobile app treats all three of these as separate views. It is possible that more requests could be sent for the same amount of information.
- General Usage. Discussions on mobile could naturally increase discussion forums usage.
/threads/
GET: Anchor /threads/get /threads/get
/threads/get | |
/threads/get |
Will also be testing against different course sizes.
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 10 locust users with min/max time of 1000/2000ms, GET requests for sent for either a single thread or randomly from a selection of 10% of the threads in a course. This was tested against a sandbox.
Update: This conclusion is invalid as the sandbox does not have the proper indexes.
|
POST:
Anchor | ||||
---|---|---|---|---|
|
Expand | ||
---|---|---|
| ||
Unfortunately locust ran into a calculation error when running a post test so there is no table data. After 1,000,000 posts in 24 hours, the response time remain constant. This was tested against https://courses-loadtest.edx.org/ |
/threads/{thread_id}
GET:
Anchor | ||||
---|---|---|---|---|
|
Waiting on Loadtest env to get meaningful results. Refer to /threads/get
PATCH: Anchor /threads/thread_id/patch /threads/thread_id/patch
/threads/thread_id/patch | |
/threads/thread_id/patch |
Expand | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||
This was tested against a t2.large sandbox.
|
Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 2 locust user intentionally split between staff and non-staff tasks, PATCH requests were sent with a 500ms wait time. This was tested against a t2.large sandbox.
|
Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
DELETE:
Anchor | ||||
---|---|---|---|---|
|
Expand | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||
For every DELETE thread, we POST a Thread and then GET a thread from the thread pool. This was tested against a t2.large.sandbox.
|
/comments/
GET:
Anchor | ||||
---|---|---|---|---|
|
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 10 locust users with min/max time of 1000/2000ms, GET requests for sent for 1 of 10 threads with 100 responses in increasing increments of 100 responses, each with single comment. The page_size seemed to be the parameter that affected the response time. This was tested against a t2.large sandbox.
|
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Using 10 locust users with min/max time of 1000/2000ms, GET requests for sent for 1 of 10 threads where the chosen thread will contain a response of 50, 100, 150, 200... comments increasing in increments of 50. This was tested against a t2.large sandbox.
|
POST:
Anchor | ||||
---|---|---|---|---|
|
POST should be similar to POSTing threads.
/comments/comment_id
PATCH:
Anchor | ||||
---|---|---|---|---|
|
Expand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
DELETE:
Anchor | ||||
---|---|---|---|---|
|
DELETE is best tested with the other endpoints. For every comment delete, we POST a thread, GET a random thread, and then DELETE that random thread.
...
Jira Legacy | ||||||
---|---|---|---|---|---|---|
|
Anchor | ||||
---|---|---|---|---|
|
Course Structure Setup:
A tarfile with a very simple setup will be used for each load test. This course was created in studio and then exported. During the course creating when seeding data, this tarfile will be used as the skeleton.
Forums Data Analysis:
After some analysis of the forums database, there were some pieces of information that were found to be useful. The link to the google doc is here.
Some key points:
We’ve had 7 million forum posts (including both top-level and responses).
IDBx+IDB6x+2015_T2 has the most activity of any course, with over 122,000 posts.
Expand title Course DATA for number of posts cnt course_id cnt course_id 1 UTAustinX/UT.6.02x/1T2015 1759 MITProfessionalX/6.BDX/2T2014 1 course-v1:HarvardX+SPU27x+devops_test 1770 PekingX/20000001x/2015Q1 1 course-v1:TsinghuaX+30640014x+3T2015 1781 HarvardX/HUM2.1x/3T2014 1 arbi/cs205/1T2014 1785 HarvardX/PH525.4x/1T2015 1 TBRx/EngCompX/1T2015 1789 HarvardX/1368.2x/2T2015 1 course-v1:LouvainX+Louv3x+3T2015 1796 MITx/JPAL101_1x/3T2014 1 course-v1:UBCx+Marketing5501x+2015preview 1797 RiceX/PHYS102.2x/2015T1 1 course-v1:MandarinX+MX101x+3T2015 1800 BUx/ASTR105x/3T2014 1 course-v1:MITx+14.74x+3T2015 1809 MITx/7.QBW_1x/1T2015 1 course-v1:RiceX+AdvBIO.4x+2016T1 1809 course-v1:TenarisUniversityX+CNC.ETRRx_2+2T2015 1 CarrTest/Test101/2014_T1 1826 MITx/15.390.2x/3T2014 1 UTAustinX/UT.7.01x/3T2014 1839 course-v1:UC3Mx+CEH.1-ESx+2T2015 1 course-v1:GeorgetownX+PHLX101-02x+1T2015 1843 course-v1:IEEEx+CloudIntro.x+2015T2 1 course-v1:Microsoft+DAT203x+1T2016 1866 LouvainX/Louv1.1x/3T2014 1 course-v1:UBCx+Climate101x+3T2015 1867 DavidsonX/D.001x/3T2014 1 BerkeleyX/CS190.1x/1T2015 1890 course-v1:UQx+Denial101x+2T2015 1 TBRx/STATx/1T2015 1894 HKUSTx/ELEC1200.1x/3T2014 1 course-v1:HarvardX+HUM1.5x+3T2015 1902 course-v1:CaltechX+Ec1011x_2+T12015 1 course-v1:MITx+15.390.2x_1_TUR+2T2015 1911 course-v1:UTHealthSPHx+INOV101x+2T2015 1 course-v1:MITx+4.605x_3+3T2015 1929 course-v1:UPValenciaX+GP201x+3T2015 1 MITx/8.851x/3T2014 1973 SchoolYourself/AlgebraX/1T2015 1 BerkeleyX/CS169.1/2013_Spring_SPOC_Binghamton 1977 course-v1:MITx+7.28.1x_1+2T2015 1 course-v1:CurtinX+DBAEx+3T2015 1985 AdelaideX/HumBio101x/1T2015 1 UTAustinX/UT.6.01x/1T2014 1998 BerkeleyX/ColWri3.3x/1T2015 1 course-v1:Microsoft+DEV205x+3T2015 2004 DelftX/TW.3421x/1T2015 1 course-v1:MITx+7.28.2x+3T2015 2005 HarvardX/AT1x/2T2014 1 course-v1:UBCx+Phot1x+test 2006 BerkeleyX/CS169.2x/2012_Fall 1 course-v1:AKTEST+INTROSTEEL+8_2015 2038 MITx/21W.789x_2/1T2015 1 course-v1:RiceX+AdvPHY2.2x+2015T3 2047 course-v1:IMFx+MFx+2015T2 1 course-v1:UBCx+CW1.1x+1T2016 2050 BerkleeX/BMPR365x/2T2014 1 course-v1:AA+AA101+2015_T1 2053 RiceX/AdvBIO.1x/2014T3 1 course-v1:MITx+11.127x+1T2015 2057 course-v1:TeachersCollegeX+BDE1x+2T2015 2 course-v1:NYIF+MA1.3x+3T2015 2068 course-v1:UTAustinX+UT.5.03x+2T2015 2 course-v1:TenarisUniversityX+PIPE02x+3T2015 2092 MITx/6.341x/3T2014 2 course-v1:Microsoft+DAT204x+3T2015 2094 OECx/PH241x/3T2014 2 MITx/11.132x/3T2014 2108 course-v1:LouvainX+Louv11x+2T2015 2 course-v1:Microsoft+DEV202.3x+2015_T4 2136 course-v1:UC3Mx+CEH.1-ENx+2T2015 2 course-v1:Microsoft+DAT206x+2T2016 2155 BerkeleyX/ColWri3.2x/1T2015 2 course-v1:RiceX+BIOC300.2x+2T2015 2157 course-v1:HarvardX+HUM2x+2015T3 2 course-v1:ANUx+ANU-INDIA1x+4T2015 2172 course-v1:HKUSTx+COMP102.2x+4T2015 2 course-v1:HarvardX+HDS99.1x+1T2016 2177 BerkeleyX/Stat_2.1x/1T2014 2 course-v1:PurdueX+Aero101+2015_T3 2177 ETHx/AMRx/1T2014 2 course-v1:MITx+7.00x_3+2T2015 2200 MITx/14.73x_1/1T2015 2 course-v1:NotreDameX+TH120.2x+3T2015 2205 course-v1:BerkeleyX+EE40LX+2T2015 2 course-v1:TrinityX+T002x+3T2015 2207 course-v1:DelftX+EX101x+3T2015 3 course-v1:ACCA+Accounting101x+1T2015 2208 UPValenciaX/TE201x/2T2015 3 course-v1:ACCA+FMA-F2.x+3T2015 2210 PekingX/04332960X/3T2013 4 course-v1:MITx+6.002.Ax+3T2015 2215 RiceX/PHYS102.1x/2015T1 4 course-v1:AdelaideX+AddictionX+3T2015 2219 HarvardX/HLS3x/1T2015 4 BerkeleyX/CS188.1x-4/1T2015 2225 course-v1:HarvardX+BUS5.1x+3T2015 4 course-v1:MITx+6.002.Cx+3T2015 2241 TsinghuaX/80000901_1X/3T2013 4 course-v1:NYIF+YCA2015.1x+2015T3 2262 HarveyMuddX/CS001x/1T2015 4 course-v1:UBCx+Marketing5502x+3T2015 2268 NotreDameX/MAT150x/2T2015 5 MITx/15.390.2x_TUR/1T2015 2284 course-v1:GeorgetownX+MEDX202-01+2015_3T 5 course-v1:ANUx+ANU-ActuarialX+3T2015 2289 course-v1:BerkeleyX+ColWri.3.7x+3T2015 5 course-v1:TsinghuaX+60240013x+3T2015 2291 DelftX/CTB3300WCx/2T2014 5 course-v1:DelftX+NGIx+3T2015 2296 course-v1:UBCx+Phot1x+2T2015 5 course-v1:MITx+6.002.Bx+3T2015 2304 course-v1:MITx+15.390.1x_1+1T2015 5 course-v1:TsinghuaX+00690242.2x+3T2015 2308 BUx/PY1x/1T2015 5 course-v1:edX+LG101x+2015_testing 2314 UQx/TROPIC101x/1T2014 5 andya/AA101/2014_T1 2330 DelftX/CTB3365STx/2T2015 5 course-v1:HarvardX+1368.4x+2T2016 2341 HamiltonX/ENG142x/2015_T1 6 course-v1:Course_Re-runs+LG101x+2014_T1_re-run 2355 course-v1:DelftX+TPM1x+2T2015 6 course-v1:PrincetonX+CaseStudies101+3T2015 2365 UC3Mx/PCA.1x/1T2015 6 course-v1:HarvardX+1368.3x+2T2016 2377 course-v1:UCSDx+CSE167x+3T2015 6 course-v1:Microsoft+INF202x+3T2015 2383 CornellX/INFO2040x/1T2014 7 course-v1:PekingX+20000001x+2015T3 2392 IDBx/IDB2x/3T2014 7 course-v1:Microsoft+INF201.13x+1T2016 2403 UBCx/Water201x/3T2014 7 course-v1:UTennesseeX+BIRDS101.1x+3T2015 2412 UTArlingtonX/LINK5.10x/3T2014 7 CooperUnion/CS.2x/1T2015 2423 course-v1:UPValenciaX+BSP101x+3T2015 7 BerkeleyX/BJC.1x/3T2015 2423 course-v1:TUMx+QEMx+2T2015 7 course-v1:Microsoft+CLD203x+1T2016 2431 course-v1:MandarinX+MX101x+2T2015 8 course-v1:HarvardX+1368.2x+2T2016 2435 course-v1:MITx+uINOV8x+2T2015 8 course-v1:HarvardX+SPU30x+2T2016 2465 MITx/3.091x_3/3T2014 8 course-v1:Microsoft+CLD1003x+1T2016 2476 HarvardX/PH525.3x/1T2015 8 course-v1:MITx+15.390.2x_SPA+2T2015 2479 DavidsonX/D003x.1/1T2015 9 course-v1:HarvardX+1368.1x+2T2016 2482 course-v1:UQx+World101x+2T2015 9 course-v1:TsinghuaX+00690242.3x+3T2015 2491 course-v1:SMES+PSYCH101x+2T2015 11 course-v1:edX+JOB101x+2015 2501 HKUx/HKU01x/3T2014 12 course-v1:IITBombayX+EE210.2X+1T2016 2509 course-v1:Microsoft+DEV202x+2015_T2 13 RiceX/AdvPHY2.4x/2T2015 2526 HarvardX/PH525x/1T2014 15 course-v1:DartmouthX+DART.MUS.01X+2015_T3 2533 TenarisUniversityX/CNC.ETRRx/3T2014 15 BerkeleyX/CS100.1x/1T2015 2569 McGillX/ATOC185x_2/1T2015 16 course-v1:Microsoft+DEV202.2x+2015_T4 2596 DelftX/DDA691x/3T2014 17 course-v1:TsinghuaX+00690242.1x+3T2015 2624 MITx/3.086-2x/1T2015 17 HarvardX/HLS1.1x-2/1T2015 2680 DelftX/Calc001x/2T2015 18 course-v1:CaltechX+BEM1105x+3T2015 2694 SMES/COL101x/1T2015 18 course-v1:NYIF+MA1.2x+3T2015 2731 DelftX/CTB3365DWx/3T2014 19 course-v1:PekingX+02132750x+2015T3 2739 MITx/16.110x/1T2014 20 course-v1:DavidsonX+D004x+3T2015 2740 PekingX/01339180X/3T2013 21 course-v1:TenarisUniversityX+CNC.ETRRx_3+3T2015 2749 course-v1:LinuxFoundationX+LFS101x.2+1T2015 22 HarvardX/HKS-211.1x/3T2013 2775 MITx/3.091x_2/1T2014 22 course-v1:adam+adam+adam 2780 course-v1:TenarisUniversityX+STEEL101x+2T2015 23 PekingX/532001x/3T2014 2800 course-v1:MITx+10.03x+2T2015 23 course-v1:WestonHS+BIO101x+2T2015 2833 UC3Mx/CEH.1-ESx/1T2015 24 course-v1:TsinghuaX+30240184x+3T2015 2849 course-v1:SmithsonianX+USHIS1.1x+2015_T2 25 course-v1:PekingX+01233170x+2015T1 2853 course-v1:HKPolyUx+ANA101x+2T2015 25 course-v1:EPFLx+BrainX+3T2015 2862 course-v1:WellesleyX+ANTH207x_2+2T2015 31 course-v1:Microsoft+INF201x+2015_T4 2875 BerkeleyX/EECS149.1x/2T2014 34 course-v1:EPFLx+NMR101x+2015_T3 2878 course-v1:MITx+6.002x_6x+1T2015 39 course-v1:EPFLx+AlgebreX+4T2015 2881 course-v1:MITx+15.662x+1T2015 42 EdX/NAA101/2014 2936 MITx/2.01x/2T2014 43 course-v1:HarveyMuddX+PHYS024.3x+1T2015 2940 course-v1:IMFx+FPP.1x_2015+2015_T2 45 course-v1:TsinghuaX+40040152X+3T2015 2943 UBCx/China300x/3T2014 46 course-v1:RiceX+AdvPHY2.1x+2015T3 2943 course-v1:UQx+Crime101x+2T2015 49 course-v1:MITx+15.390.1x_1_TUR+1T2015 2948 course-v1:IIMBx+QM101.1x+1T2016 50 course-v1:HKPolyUx+EWA.1x+3T2015 2956 RiceX/RELI157x/1T2015 52 RiceX/AdvBIO.5x/2015T1 2957 IITBombayX/ME209x/2T2014 53 course-v1:Microsoft+CLD201x+2015_T4 2969 BerkeleyX/Stat2.3x/2013_SOND 58 MITx/6.00short/2013_IAP 2976 HarvardX/HKS211.1x/3T2013 61 RiceX/AdvENVSCI.4x/2015T1 2990 LouvainX/Louv3x/1T2015 61 course-v1:LouvainX+ConfX+2T2015 2998 MITx/2.03x/3T2013 61 course-v1:TsinghuaX+30700313x+3T2015 3056 MITx/9.01x/3T2014 62 EPFLx/EE-102B.1x/1T2015 3078 University_of_TorontoX/OEE101x/3T2013 65 UPValenciaX/IQ101.3x/3T2015 3079 BerkeleyX/CS188/fa12 65 MITx/3.091/MIT_2012_Fall 3117 course-v1:CornellX+HIST1514x+1T2015 66 HarvardX/MCB80.2x/3T2014 3161 UPValenciaX/AIP201x/2T2015 68 course-v1:edX+StudioX+2015 3164 course-v1:Microsoft+DAT204x+1T2016 70 course-v1:TsinghuaX+10610224x+3T2015 3231 RiceX/BIOC372.1x/1T2014 70 course-v1:ANUx+ANU-ASTRO1x+3T2015 3253 course-v1:HarvardX+MCB63X+3T2015 71 course-v1:WestonHS+CALC360x+2T2015 3286 HKUSTx/EBA102x/4Q2015 71 course-v1:KIx+KIUrologyx+2015_T3 3294 MITx/JPAL101x/1T2014 76 course-v1:DelftX+DDA691x+3T2015 3321 course-v1:HKUSTx+COMP102.1x+4T2015 76 course-v1:PekingX+00330280x+2015T1 3326 HarvardX/PH525.1x/1T2015 79 UPValenciaX/FFI101.2x/1T2015 3333 RiceX/BIOC372.1x-F14/2T2014 81 course-v1:EPFLx+TrigoExpX+1T2015 3345 BUx/Math226.1x/1T2015 83 EPFLx/EE-100Bx/3T2014 3380 course-v1:Microsoft+DEV203x+2015_T2 89 course-v1:TsinghuaX+70120073x+3T2015 3390 MITx/6.041x_1/1T2015 90 course-v1:UBCx+SPD1x+1T2016 3396 HarvardX/HKS211.2x/3T2015 90 course-v1:TsinghuaX+00612642x+3T2015 3430 course-v1:UTPermianBasin+SOCI101x+2T2015 92 course-v1:PekingX+18000201X+2015T2 3443 MITx/3.032x/3T2014 96 PekingX/04830260x/2015Q1 3465 MITx/6.832x/3T2014 96 PekingX/18001001x/2015Q1 3503 UTAustinX/UT.5.02x/1T2015 99 WestonHS/MechC101x/2T2015 3635 MITx/EECS.6.002x/3T2013 100 course-v1:WellesleyX+ANTH207x_3+3T-2015 3653 course-v1:WageningenX+NUTR101x+2T2015 106 course-v1:HarvardX+ER22.1x+2015T3 3657 MITx/MAS.S69x/1T2014 107 Ethicon/CSEC2014-1x/3T2014 3675 DelftX/TW3421x/1T2014 110 UPValenciaX/IQ101.1x/2T2015 3714 course-v1:UWashingtonX+ECFS302x+1T2015 111 course-v1:Microsoft+INF201.12x+1T2016 3748 course-v1:ColgateX+GW101x+3T2015 114 IMFx/FPP.1x/1T2014 3816 course-v1:DelftX+ET3034x+3T2015 121 course-v1:MITx+15.390.2x_1+2T2015 3830 DelftX/TPM1x/3T2014 121 course-v1:tennessee+FYS100+F2015 3887 course-v1:AdelaideX+Lang101x+2T2015 123 course-v1:NYIF+MA1.1x+3T2015 3904 HarvardX/AmPoX.1/2014_T3 123 course-v1:DavidsonNext+Cal_APccx+2T2015 3978 MITx/7.QBWx/2T2014 125 course-v1:Microsoft+CLD201x+2015_T2 3981 HarvardX/1368.1x/3T2014 127 PekingX/04830050.2x/2015Q3 4026 course-v1:IEEEx+MTX.1x+2015Q3 127 course-v1:RiceX+AdvBIO.1x+2015T3 4040 CornellX/HIST1514x_Fall2014/3T2014 131 course-v1:IITBombayX+ME209.1x+1T2016 4053 course-v1:AdelaideX+Wine101x+2T2015.2 133 CooperUnion/Chem.2x/1T2015 4089 HarvardX/SPU30x/2T2014 133 UPValenciaX/DC201x/2T2015 4106 MITx/7.28.1x/1T2015 136 course-v1:PekingX+04831750.2x+2015T2 4134 UWashingtonX/AA432x/3T2014 137 course-v1:LinuxFoundationX+LFS201x+2T2015 4147 BerkeleyX/CS.CS169.1x/3T2013 138 course-v1:SMES+ASLCx+2T2015 4149 course-v1:ASUx+MCO425x+2T2015 140 MITProfessionalX/6.BD_GEx/2T2014 4239 KIx/KIeHealthX/2T2015 141 course-v1:TokyoTechX+GeoS101x+2016_T1 4258 course-v1:TUMx+AUTONAVx+2T2015 142 course-v1:PekingX+03530370x+2015T1 4270 CaltechX/Ec1011x/1T2014 143 course-v1:HarvardX+BUS5.1x_Application_Only+3T2015 4271 course-v1:HKUSTx+COMP107x+2016_T1 146 PekingX/00330280x/2015Q1 4273 TsinghuaX/80512073x/1T2014 151 course-v1:W3Cx+HTML5.1x+4T2015 4316 RiceX/ELEC301x/T1_2014 152 course-v1:RiceX+AdvENSCI.1x+2015T3 4340 MITx/21W.789x/1T2014 152 course-v1:IMFx+TADATx+2015T2 4345 UPValenciaX/GM201x/2T2015 153 course-v1:RiceX+BIOC300.1x+3T2015 4350 course-v1:UWashingtonX+COMM220UWx_2+1T2015 154 OECx/Energy103/3T2014 4352 MITx/4.605x_2/3T2014 154 course-v1:HKUx+HKU01x+3T2015 4378 MITx/6.SFMx/1T2014 154 UPValenciaX/FFI101.1x/1T2015 4391 edX/GWPx/2014_T1 156 course-v1:DavidsonNext+Phy_APccx+2T2015 4430 LouvainX/Louv3.02x/3T2014 161 UPValenciaX/BMD101x/2T2015 4431 course-v1:DelftX+AE1110x+2T2015 164 MITx/6.002x-EE98/2012_Fall_SJSU 4433 KIx/KIexploRx/3T2014 170 course-v1:HarveyMuddX+PHYS024.2x+1T2015 4446 course-v1:IIMBx+OM101.1x+1T2016 172 course-v1:UPValenciaX+ISC101.1x+3T2015 4449 MITx/3.091X/2013_Fall 173 RiceX/AdvPHY2.3x/1T2015 4463 course-v1:Microsoft+DEV204x+2015_T4 175 course-v1:DavidsonNext+Mac_APccx+2T2015 4463 HarvardX/AmPoX.3/1T2015 176 PekingX/02030330x_1/3T2014 4495 BerkeleyX/CS169.1x/2013_Spring 178 course-v1:BerkleeX+MB110x+3T2015 4505 HarvardX/AI12.1x/2013_SOND 182 UPValenciaX/FCO201x/2T2015 4522 course-v1:HarvardX+HKS101A+2015T3 183 HarvardX/PH525.7x/1T2015 4536 course-v1:SmithsonianX+POPX1.2x+2015_T2 183 TsinghuaX/30240184_x/1T2015 4557 course-v1:UBCx+SPD1x+2T2015 184 TsinghuaX/00690242_2x/3T2014 4574 UAMx/Android301x/1T2015 187 UPValenciaX/IQ101.2x/2T2015 4580 CornellX/ENGRI1280x/1T2014 187 course-v1:EPFLx+TrigoExpX+2T2015 4613 HarvardX/AmPoX.2/2014_T3 187 course-v1:BUx+PY1x+3T2015 4618 MITx/6.004.1x/1T2015 197 TsinghuaX/00690242.x/1T2015 4630 University_of_TorontoX/BE101x_2/3T2014 201 TsinghuaX/20220332_2x/1T2014 4631 course-v1:HarvardX+AmPoX.5+2T2015 201 PekingX/02930106x/2015Q1 4696 UTAustinX/UT.2.02x/3T2014 203 course-v1:TsinghuaX+00612642x+1T2015 4747 SMES/ASLCx/1T2015 203 TsinghuaX/30240184.x/3T2014 4752 course-v1:BerkeleyX+ColWri2.1x+3T2015 205 MITx/7.012/MIT_2013_Spring 4766 MITx/12_340x/1T2014 209 RiceX/AdvENVSCI.3x/2015T1 4770 course-v1:ACCA+FA1-MA1.X+2T2015 214 course-v1:EPFLx+MF201x+1T2015 4812 ColumbiaX/HIST1.3x/1T2015 214 MITx/15.390.1x_TUR/1T2015 4819 GeorgetownX/INFX523-02x/3T2014 214 course-v1:GeorgetownX+GUIX-501-02x+2015_3T 4889 course-v1:MITx+8.MechCx_2+2T2015 214 HarvardX/HUM2.3X/3T2014 4917 MITx/6.00.2_2x/3T2014 216 BerkeleyX/BFV101x/T12015 4925 course-v1:ANUx+ANU-ASTRO1x+2T2015 218 course-v1:Microsoft+DEV201x+2015_T4 4938 IMFx/ESRx/2T2014 222 course-v1:ANUx+ANU-ASTRO2x+3T2015 5071 CornellX/ENGRI1210x/1T2015 222 GeorgetownX/HUMX423-01x/1T2015 5087 HarveyMuddX/CS005x/2T2015 222 Ethicon/MARS2014-1x/2014_1 5107 LouvainX/Louv8x/1T2015 231 course-v1:Microsoft+DEV208x+3T2015 5131 IITBombayX/CS101.1x/2T2014 236 course-v1:Microsoft+205x+1T2016 5141 BerkeleyX/CS184.1x/2013_Spring 239 BerkeleyX/CS188x_1/1T2013 5148 DavidsonX/D002/2014_T3 241 PekingX/01034040x/3T2014 5163 course-v1:MITx+6.00.2x_3+1T2015 243 RiceX/AdvBIO.4x/2015T1 5174 DavidsonX/001x/1T2014 243 BerkeleyX/CS169.2x/2013_Spring 5186 VJx/VJx/3T2014 244 course-v1:LouvainX+Louv10x+3T2015 5188 RiceX/PHYS201x/3T2014 246 IITBombayX/EE210.2X/3T2015 5204 course-v1:OECx+TESS101x+2T2015 247 course-v1:TsinghuaX+20220214x+2015_T3 5252 LouvainX/Louv2x/1T2015 268 TsinghuaX/80000901x/3T2014 5253 LouvainX/Louv1.01x/1T2014 273 course-v1:DavidsonNext+TwD_APccx+2T2015 5327 KyotoUx/001x/1T2014 274 UPValenciaX/BMA101x/2T2015 5331 University_of_TorontoX/LA101x_2/1T2015 280 EPFLx/EE-102Bx/1T2014 5359 MITx/14_73x/1T2014 283 RiceX/AdvBIO.3x/2015T1 5363 MITx/8.MechCx/1T2015 285 UPValenciaX/VF201x/2T2015 5401 BerkeleyX/Stat2.2x/2013_April 289 IEEEx/ISSCCx/3T2014 5426 BerkeleyX/CS-184.1x/2013_October 291 RiceX/AdvPHY2.2x/1T2015 5455 HarvardX/GSE3x/1T2015 292 IITBombayX/ME209.1x/2T2015 5588 course-v1:ASUx+AST111+3T2015 295 course-v1:Microsoft+DEV206.1x+3T2015 5605 BerkeleyX/ColWri3.5x/1T2015 297 UPValenciaX/BMN101x/1T2015 5625 BerkeleyX/EE40LX/1T2015 299 course-v1:MITProfessionalX+CSx+2015_T1 5668 HarvardX/EMC2x/1T2015 300 UPValenciaX/BMI101x/2T2015 5670 MITx/16.00x/1T2015 305 course-v1:CurtinX+TBOMx+2T2015 5673 UC3Mx/CEH.1-ENx/1T2015 316 course-v1:BerkleeX+BMPR365x+3T2015 5703 BUx/INTL301x/3T2014 317 course-v1:UBCx+SPD2x+2T2015 5728 course-v1:RiceX+MedDigX_+2015T2 328 EPFLx/BIO465.1x/4T2014 5812 HarvardX/PH210x/1T2014 329 MITx/8.MReVx_T/2T2014 5817 course-v1:MITx+24.118x+2T2015 330 course-v1:Microsoft+DAT201x+2015_T4 5916 DelftX/AE.1110x/3T2014 331 UTokyoX/UTokyo002x/3T2014 5952 MITx/16.101x/2013_SOND 332 course-v1:MITx+3.091x_5+3T2015 6003 BerkeleyX/ColWri3.1x/3T2014 340 TsinghuaX/60240013.x/1T2015 6026 MITx/6.002_4x/3T2014 345 SNUx/SNU034.005.1x/1T2014 6031 DelftX/Frame101x/1T2015 347 course-v1:BerkleeX+MB110x+2T2015 6056 course-v1:DartmouthX+DART.ENGS.01.X+2015_T2 354 BerkeleyX/CS169.1x/2013_March 6192 BerkeleyX/J4SC101/1T2015 358 course-v1:UTokyoX+UTokyo003x+2015T2 6222 HamiltonX/RELST005.5x/1T2015 370 course-v1:UQx+HYPERS301.x+1T2015 6231 UTAustinX/UT.8.02x/1T2015 371 HarvardX/PH525.8x/1T2015 6261 IMF/FPP.1x/2T2014 372 course-v1:Microsoft+INF201x+2015_T2 6301 BerkleeX/BCM-MB110x/1T2014 382 HarvardX/HUM2.4x/3T2014 6313 NotreDameX/SOC120x/2T2015 387 course-v1:edX+BlendedX+1T2015 6325 MITx/2.01x/2013_Spring 389 HarvardX/PH525.6x/1T2015 6356 ETHx/FC-01x/3T2014 399 RiceX/AdvENVSCI.2x/2015T1 6369 HKUSTx/EBA101x/3T2014 400 HarveyMuddX/PHYS024x/1T2015 6381 BerkeleyX/CS184.1x/2012_Fall 403 course-v1:MITx+3.032.1x+3T2015 6388 RiceX/PHYS102x/2013_Oct 407 TsinghuaX/70167012x/3T2014 6399 University_of_TorontoX/LA101x/1T2014 415 EPFLx/BrainX/1T2015 6473 course-v1:HKUSTx+COMP102.1x+2T2015 417 course-v1:UBCx+China300.1x+3T2015 6622 MITx/6.002x/2013_Spring 417 course-v1:NYIF+YCA2015.1.2x+2015_Q2 6643 ANUx/ANU-ASTRO3x/4T2014 420 course-v1:VJx+VJx+3T2015 6659 course-v1:ETHx+FC-01x+2T2015 427 CooperUnion/Chem.1x/1T2015 6659 MITx/3.091x/2013_Spring 428 HarvardX/HUM2.5x/3T2014 6672 TUMx/AUTONAVx/2T2014 430 course-v1:Microsoft+DEV202.1x+2015_T4 6746 IMFx/DSAx/3T2014 432 EPFLx/MF201x/1T2014 6762 GEMSx/GE001x/1T2015 438 course-v1:DelftX+TXT1x+3T2015 6899 course-v1:W3Cx+W3C-HTML5+2015T3 440 course-v1:BerkleeX+BMPR365x+2T2015 6942 McGillX/CHEM181x_2/3T2014 443 course-v1:IITBombayX+CS101.1x+4T2015 6948 BerkeleyX/CS-191x/2013_August 462 EPFLx/PHYS-209.1x/1T2015 6994 RiceX/PHYS_102x/1T2014 464 HarvardX/PH525.5x/1T2015 7042 course-v1:TsinghuaX+30640014x+2T2015 469 UPValenciaX/DMT201x/2T2015 7108 UTAustinX/UT.5.01x/1T2014 474 course-v1:PekingX+04831750.1x+2015T1 7145 CaltechX/CS_1156x/3T2014 475 GeorgetownX/PHYX152x/1T2015 7164 BUx/SABR101x/2T2014 476 course-v1:PekingX+02132750x+2015T1 7182 course-v1:ANUx+RSIT-01x+3T2015 488 course-v1:PurdueX+nano525x+2015_T3 7226 ANUx/ANU-ASTRO2x/2T2014 493 PekingX/04832430X/3T2013 7237 course-v1:BerkeleyX+ColWri.3.6x+3T2015 495 course-v1:WageningenX+GFFCx+2T2015 7343 ColumbiaX/HIST1.1x/3T2014 495 ETHx/CAMS.1x/1T2015 7363 DelftX/NGI101x/1T2014 510 edX/edX101/2014 7516 ANUx/ANU-ASTRO4x/1T2015 513 course-v1:RiceX+AdvPHY1.1x+3T2015 7526 CornellX/Astro2290x/1T2014 518 PekingX/01718330x/1T2014 7560 MITx/6.041x/1T2014 521 course-v1:IITBombayX+EE210.1X+1T2016 7582 BerkeleyX/CS191x/2013_Spring 530 course-v1:TenarisUniversityX+STEEL101x_1+3T2015 7622 LouvainX/Louv4x/1T2015 535 TsinghuaX/20220214.x/1T2015 7682 LouvainX/Louv3.01x/1T2014 538 BerkeleyX/CS.169.2x/3T2013 7687 McGillX/ATOC185x/2T2014 539 PurdueX/nano520/3T2015 7718 MITx/18.01.1x/2T2015 545 PekingX/04830050x/2T2014 7784 course-v1:ANUx+Igno101x+2T2015 546 Ethicon/MARS2014-2x/2014_2 7913 ColumbiaX/HIST1.2x/3T2014 551 TsinghuaX/30240184x/1T2014 8094 HarvardX/SW47.1x/2014_T3 553 BerkeleyX/Stat_2.2x/1T2014 8181 GeorgetownX/HUMX421-01x/3T2014 555 HarvardX/MCB80.1x/2013_SOND 8210 UQx/Crime101x/3T2014 556 TsinghuaX/80512073.x/3T2014 8221 DelftX/FP101x/3T2014 556 HarvardX/HUM2.2x/3T2014 8276 UTAustinX/UT.4.01x/2013_Sept 557 CooperUnion/CS.1x/1T2015 8305 SMES/PSYCH101x/1T2015 558 course-v1:PurdueX+PN-15.2+2015_3T 8352 UTAustinX/UT.3.02x/3T2014 561 course-v1:MITProfessionalX+6.BDx+4T2015 8416 course-v1:HarveyMuddX+CS002x+2T2015 584 SNUx/SNU446.345.2x/2T2014 8529 DelftX/ET.3034TU/3T2014 587 course-v1:UQx+Tropic101+2T2015 8635 course-v1:BerkeleyX+GG101x+3T2015 597 course-v1:Delftx+CTB3300WCx+2015_T3 8674 course-v1:HarvardX+SPU27x+2015_Q2 600 course-v1:Microsoft+CLD202x+1T2016 8735 course-v1:UWashingtonX+ECFS311x+2T2015 605 course-v1:MITx+6.004.1x_2+3T2015 9063 MITx/8.MReVx/2T2014 610 course-v1:OECx+B1156+1T2015 9072 course-v1:DartmouthX+DART.ENVS.02X+2015_T1 614 UQx/HYPERS301x/1T2014 9227 course-v1:HarvardX+USW30x+1T2016 620 course-v1:UC3Mx+HGA.1x+2T2015 9271 LinuxFoundationX/LFS101x/2T2014 621 course-v1:SMES+COL101x+2T2015 9343 MITx/7.00x_2/2T2014 624 GeorgetownX/HUMX422-01x/1T2015 9402 ANUx/ANU-INDIA1x/1T2014 625 course-v1:UQx+BIOIMG101x+1T2015 9418 HarvardX/PH201x/2013_SOND 634 RiceX/AdvBIO.2x/2014T3 9540 course-v1:MITx+CTL.SC1x_1+2T2015 637 RiceX/ELEC301.2x/2015Q3 9749 MITx/6.00.2x/1T2014 643 LouvainX/Louv1.2x/4T2014 9766 course-v1:University_of_TorontoX+INQ101x+2T2015 660 TsinghuaX/00690242_1x/1T2014 9810 NotreDameX/TH120.1x/2T2015 664 course-v1:edX+GFADemox+3T2015 9955 McGillX/Body101x/1T2015 664 HarvardX/HAA1x/1T2014 9963 BerkeleyX/CS188.1x/2013_Spring 665 course-v1:MITx+15.390.1x_SPA+1T1015 10050 course-v1:MITx+6.00.1x_7+3T2015 666 course-v1:McGillX+GROOCx+T3_2015 10070 CornellX/HIST1514x/1T2014 667 RiceX/AdvPHY2.1x/3T2014 10071 course-v1:MITx+15.071x_2a+2T2015 674 course-v1:IMF+Sp_FPP.1x+2015_T3 10273 MITx/15.390x/1T2014 675 PekingX/02132750x/2015Q1 10406 course-v1:AdelaideX+Code101x+2T2015 685 MITx/8.EFTx/3T2014 10421 LouvainX/Louv4.01x/1T2014 688 ETHx/CAMSx/3T2014 10465 CornellX/ENVSCI1500x/1T2015 702 MITx/3.072x/1T2015 10469 DelftX/EX101x/1T2015 705 UPValenciaX/BI101x/2T2015 10646 HarvardX/CB22.1x/2013_SOND 706 course-v1:Microsoft+DAT202.1x+1T2016 10695 course-v1:IDBx+IDB9x+2015_T2 731 PurdueX/pncom201501x/2015_T1 10870 ANUx/ANU-ASTRO1x/1T2014 732 course-v1:UBCx+UseGen.1x+3T2015 10878 MITx/15.390.1x/3T2014 733 UAMx/TxEtj201x/1T2015 10883 MITx/6.00.1-x/1T2014 746 OsakaX/BIO101x/1T2015 10959 MITx/8.05x/1T2015 757 TsinghuaX/80000901_2x/1T2014 11034 HarvardX/AmPoX.4/1T2015 764 course-v1:OECx+RADIO101x+2T2015 11229 WellesleyX/ANTH_207x/2013_SOND 811 course-v1:ETHx+AMRx+1T2015 11279 CaltechX/CS1156x/Fall2013 814 EPFLx/PHYS-209x/4T2014 11328 UQx/World101x/3T2014 819 TsinghuaX/20220214x/3T2014 11464 UTAustinX/UT.8.01x/1T2014 830 TsinghuaX/30700313x/1T2015 11501 MITx/6.00.1_4x/3T2014 832 BerkeleyX/Stat_2.3x/2T2014 11523 HarvardX/SW25x/1T2014 832 course-v1:Microsoft+DEV203x+2015_T4 11570 UWashingtonX/COMM220UWx/1T2014 836 CornellX/INFO2040x_Spring2015/1T2015 11595 course-v1:MITx+JPAL101SPAx+1T2015 844 course-v1:MITx+JPAL101x_3+1T2015 11742 course-v1:BUx+SABR101x+2T2015 855 IMFx/ESRx-June/2T2014 11747 KIx/KIBEHMEDx/3T2014 861 UAMx/Quijote501x/1T2015 12009 MITx/3.086x/2013_SOND 872 course-v1:KIx+KIexploRx+2015T3 12035 HarvardX/SW12.6x/2T2014 873 TsinghuaX/40050455x/1T2015 12037 course-v1:IDBx+IDB8x+2015_T3 874 DelftX/NGI102x/3T2014 12061 course-v1:CatalystX+ILX2+2015_2T 879 HarvardX/PH525.2x/1T2015 12194 BerkeleyX/CS169.1x/2012_Fall 883 UBCx/Forest222x/1T2015 12671 HarvardX/AI12.2x/2013_SOND 889 UTAustinX/UT.PreC.10.01x/3T2015 12719 GeorgetownX/MEDX202-01/2014_SOND 894 UChicagoX/PS280x/2015_T1 12728 course-v1:AdelaideX+Cyber101x+2T2015 900 BerkleeX/MB110_3x/3T2014 12839 MITx/ESD.SCM1x/3T2014 905 course-v1:PekingX+20000001x+2015T1 12926 CornellX/HOSP.101x/1T2015 905 course-v1:HKUSTx+ELEC1200.1x+3T2015 12994 MITx/15.071x/1T2014 911 course-v1:HKPolyUx+ISE101x+2T2015 13104 HarvardX/SW12.5x/2T2014 912 DelftX/TOPOCMx/1T2015 13292 HKUSTx/COMP102x/2T2014 918 SchoolYourself/GeometryX/1T2015 13325 WageningenX/NUTR101x/1T2014 931 OECx/BP111x/3T2014 13515 GeorgetownX/GUIX-501-01x/3T2014 952 course-v1:MITx+3.15x+1T2015 13729 UC3Mx/IT.1.1x/1T2015 956 HKUx/HKU04x/2T2015 13768 HarveyMuddX/CS002x/1T2015 973 course-v1:UC3Mx+PCA.1x+2T2015 14041 DelftX/AE1110x/1T2014 979 course-v1:ACCA+FA2-MA2.X+2T2015 14229 MITx/4.605x/2013_SOND 987 course-v1:UWashingtonX+JSIS123x+1T2015 14302 WellesleyX/SOC108x/2014_SOND 990 course-v1:BerkleeX+OENTR-391x+3T2015 14563 LouvainX/Louv2.01x/1T2014 996 IMFx/FPP.1x_2015/1T2015 14869 HarvardX/HSPH-HMS214x/2013_SOND 1000 PekingX/03131840x/3T2014 15070 MITx/6.00.1_3x/2T2014 1000 HarvardX/HKS211.2x_1/3T2015 15122 CornellX/PHIL2411x/2Q2015 1008 IMFx/OL14.01/2T2014 15514 UBCx/IndEdu200x/1T2015 1009 course-v1:BUx+Math226.3x+3T2015 15648 HarvardX/SW12.4x/1T2014 1014 PurdueX/nano515x/2015_T2 15828 MITx/15.071x_2/1T2015 1020 UTArlingtonX/ENGR1.0x/2T2015 16332 IDBx/IDB1x/2T2014 1029 course-v1:BerkleeX+OHARM-100x+3T2015 16376 DartmouthX/DART.ENVS.01.X/2015_T1 1031 course-v1:IIMBx+IS110x+1T2016 16514 MITx/8.02x/2013_Spring_REMOVED 1035 BerkeleyX/CS-169.2x/2013_Summer 16740 course-v1:Microsoft+DEV204x+2015_T2 1035 course-v1:TsinghuaX+THU00022X+3T2015 16836 DelftX/CTB3365x/2013_Fall 1041 University_of_TorontoX/D101x/1T2015 16911 HarvardX/HLS2x/1T2015 1041 TsinghuaX/80512073_x/1T2015 17556 course-v1:SmithsonianX+POPX1.1x+2015_T2 1042 CaltechX/Ay1001x/2T2014 18097 HarvardX/SW12.9x/3T2014 1054 BerkleeX/BMPR365_2x/3T2014 18134 MITx/8.MReV/2013_Summer 1066 DavidsonX/D003x.2/2T2015 18175 BerkeleyX/Stat2.1x/2013_Spring 1070 course-v1:BerkleeX+BMPR365_3x+1T2015 18775 UTAustinX/UT.2.01x/2013_Sept 1075 RiceX/BIOC300.1x/1T2015 18789 course-v1:MITx+6.00.1x_6+2T2015 1083 IMFx/FPPx/3T2013 18839 MITx/3.091x/2012_Fall 1094 IITBombayX/CS101.2x/3T2014 18948 MITx/7.00x/2013_SOND 1110 IMFx/FPP.1x_fr/3T2014 18980 BerkeleyX/CS188.1x/2012_Fall 1110 TsinghuaX/60240013x/3T2014 19975 HarvardX/GSE1.1x/3T2014 1135 course-v1:EPFLx+PlasmaX+2T2015 20176 HarvardX/SW12.8x/3T2014 1137 course-v1:Microsoft+DAT201x+2015_T2 20286 GeorgetownX/phlx101-01/1T2014 1137 WestonHS/PFLC1x/3T2015 20625 course-v1:UQx+Think101x+2T2015 1150 course-v1:TsinghuaX+00691153.x+1T2015 20938 MITx/24.00_1x/3T2014 1182 course-v1:AdelaideX+HumBio101x+2T2015 20951 UTAustinX/UT.1.01x/2013_Sept 1182 CaltechX/BEM1105x/1T2015 20970 MITx/14.73x/2013_Spring 1186 course-v1:IMFx+FPP.1x_fr+2015T2 21743 UTAustinX/UT.9.01x/1T2014 1195 UAMx/QuiOrg101x/1T2015 21761 HarvardX/SW12.7x/3T2014 1217 course-v1:ColgateX+PSYCRx+2015_T3 22127 HarvardX/PH278x/2013_Spring 1232 course-v1:TenarisUniversityX+PIPE01x+2T2015 22345 GeorgetownX/INFX523-01/2013_Fall 1241 RiceX/AdvENVSCI.1x/2014T3 22486 UQx/Denial101x/1T2015 1251 course-v1:ChalmersX+ChM002x+2T2015 22517 MITx/6.002x/2012_Fall 1253 BerkleeX/MB110x/3T2014 22654 University_of_TorontoX/BE101x/2013_SOND 1256 course-v1:Microsoft+DIS50.1x+1T2016 22715 HarvardX/SW12.2x/1T2014 1257 course-v1:MITx+3.091x_4+1T2015 22936 course-v1:UQx+Write101x+2T2015 1271 RiceX/ELEC301x_/2015Q3 22963 course-v1:AdelaideX+Wine101x+2T2015 1272 UTokyoX/UTokyo001x/3T2014 23239 MITx/6.00.1x_5/1T2015 1316 course-v1:UBCx+Marketing5501x+2T2015 23784 UWashingtonX/ECFS302x/2T2014 1325 HarvardX/1368.4x/2T2015 24234 DelftX/ET3034TUx/2013_Fall 1330 BerkeleyX/CS-169.1x/2013_Summer 24328 LouvainX/Louv5x/2T2015 1354 HarvardX/HLS1xC/Copyright 24424 BerkeleyX/ColWri_2.1x/3T2014 1359 HKUx/HKU02.1x/3T2014 24708 course-v1:IDBx+IDB7x+2015_T1 1367 course-v1:BUx+ASTR105x+2T2015 24802 BerkeleyX/ColWri2.3x_2/1T2015 1368 course-v1:MITProfessionalX+6.BDx+5T2015 24966 CatalystX/ILX1/2015_T1 1375 course-v1:KyotoUx+001x+2T2015 25530 edX/DemoX/Demo_Course 1382 UC3Mx/HGA.1x/1T2015 25538 IDBx/IDB_LSC101x/3T2014 1390 UPValenciaX/RA201x/1T2015 25755 HarvardX/SPU27x/2013_Oct 1410 RiceX/BIOC372.2x/2T2014 26005 HarvardX/PH555x/2014_T2 1411 course-v1:BerkleeX+MB110_4x+1T2015 26063 HarvardX/USW30x/2T2014 1415 DelftX/EconSec101x/1T2015 26975 HarvardX/GSE2x/2T2014 1430 SNUx/SNU216B.226.1x/1T2014 28203 edX/DemoX.1/2014 1436 BerkeleyX/CS_184.1x/3T2014 29907 UWashingtonX/ECFS311x/2T2014 1438 PekingX/18000123x/2015Q1 30045 McGillX/CHEM181x/1T2014 1438 course-v1:Microsoft+DEV201x+2015_T2 30299 MITx/8.01x/2013_SOND_REMOVED 1442 PekingX/02030330X/3T2013 30569 HarvardX/SW12x/2013_SOND 1448 SNUx/SNU446.345.1x/1T2014 30839 WellesleyX/ENG_112x/2014_SOND 1448 HarvardX/HLS1xB/Copyright 32112 HarvardX/SW12.3x/1T2014 1452 course-v1:BUx+Math226.2x+2T2015 33096 BUx/ARPO222x/3T2014 1459 LouvainX/Louv9x/1T2015 33115 UQx/Write101x/3T2014 1461 course-v1:IMFx+DSAx+2015_SPOC 33565 MITx/6.00.1x/3T2013 1474 UC3Mx/MMC.1x/1T2015 34145 HarvardX/CB22x/2013_Spring 1478 KIx/KIPractihx/3T2014 34734 course-v1:IDBx+IDB1x+2015_3T 1480 HarvardX/HLS1xA/Copyright 35697 WellesleyX/HIST229x/2013_SOND 1484 ChalmersX/ChM001x/1T2015 35988 BerkeleyX/ColWri.2.2x/1T2015 1487 course-v1:OECx+2T2015+2T2015 42663 HarvardX/SW12.10x/1T2015 1505 UChicagoX/Ed179x/1T2015 47226 course-v1:BerkeleyX+GG101x-2+1T2015 1540 MITProfessionalX/6.BD_2X/3T2015 55003 BerkeleyX/ColWri2.3x/1T2014 1553 course-v1:LouvainX+Louv5x+3T2015 56102 MITx/7.00x/2013_Spring 1560 HarvardX/1368.3x/2T2015 59761 HarvardX/HDS1544.1x/2013_SOND 1571 course-v1:UWashingtonX+ANTH378x+2T2015 60490 HarvardX/ER22.1x/1T2014 1602 IITBombayX/EE210.1X/3T2015 63492 HarvardX/PH207x/2012_Fall 1620 DelftX/TBP01x/3T2014 67227 MITx/24.00x/2013_SOND 1633 NotreDameX/EG240x/2T2015 68637 MITx/6.00x/2013_Spring 1667 UPValenciaX/EX101x/2T2015 70250 HarvardX/GSE1x/2014_JFMA 1676 UQx/BIOIMG101x/1T2014 71870 UTAustinX/UT.3.01x/2013_Sept 1698 HKUx/HKU03x/1T2015 76630 HarvardX/ER22x/2013_Spring 1707 TsinghuaX/20220332X/3T2013 78277 BerkeleyX/ColWri2.2x/1T2014 1709 HarvardX/HLS1xD/Copyright 78903 BerkeleyX/ColWri2.1x/3T2013 1718 WageningenX/GFFCx/1T2015 89639 MITx/6.00x/2012_Fall 1724 course-v1:MITx+0.111x+2T2015 100492 BerkeleyX/GG101x/1T2014 1726 course-v1:UBCx+Water201x_2+2T2015 112029 UQx/Think101x/1T2014 1732 EPFLx/BIO465x/2013_OND 122739 course-v1:IDBx+IDB6x+2015_T2 1740 DelftX/RI101x/3T2014 2198128 NULL* *Threads are supposed to have course_id's but for some reason, there are some that show up as null. To make sure that the table was not off the mark, queries were made against BerkeleyX/ColWri2.2x/1T2014 to check the integrity of the data.
Code Block db.contents.count({course_id:"BerkeleyX/ColWri2.2x/1T2014"}) 78277
Using the script that collects the list of threads, 32665 threads have been found.
Update: The null value may have been caused by a bug back in Sept 2013, these entries are not threads.
Jira Legacy server JIRA (openedx.atlassian.net) serverId 13fd1930-5608-3aac-a5dd-21b934d3a4b4 key OPS-1062 For comparison, the median course has just 1759 posts.
The 95% percentile is 24252
The largest forum post is nearly a megabyte. The average is 250 characters long. The median is just 110 characters.
According to a 7 day NewRelic table (below), about 20,000 threads, 20,000 responses, and 10,000 comments, are created and about 900 threads/comments are deleted per week.
Average comment_count is 1.49194 (when eyeballing, median looks like 1)
Largest comment_count is 5907
...
Anchor | ||||
---|---|---|---|---|
|
Since the request distribution is very disproportional, the individual endpoint tests are categorized base on how often these requests are hit.
Important individual endpoint tests:
- Each thread has a ~250character body
- Of the 1000 threads created
- 200 have no comments
- 300 have some sort of flag (abused/voted/following)
- 100 has a response and a comment
- 500 have a response
- 200 will be of the type "question"
- Of the response heavy threads
- n threads will be created with a response that has n*20 comments (This could change)
In addition to this test, different course sizes will be created as well and tested against as we expect the course size to affect the performance.
GET Comment (Response is depth=1, comment is depth=2) - This test will be for the expected edge cases of a thread. It is important to note that the although the largest comment_count is ~5000, the ratio of responses to comments is unknown.
- Each response/comment has a ~250character body
- Each response will have 20*n comments (could change)
Less important:
POST Thread/Comments - Expected to be constant, this test will just be POSTing threads.
PATCH Comments/Threads - Will use the same setup as GET thread. This test will modify fields such as "abuse_flagged", "following", "voted", "body"
Insignificant:
DELETE Comment/Thread - These endpoints are hit significantly less than the other endpoints. If running these individually, Threads/Comments will be created to delete. Refer to "Testing Strategy" for more information.