{"id":1656,"date":"2010-11-01T14:37:04","date_gmt":"2010-11-01T18:37:04","guid":{"rendered":"http:\/\/www.webperformanceinc.com\/load_testing\/blog\/?p=1656"},"modified":"2011-10-06T18:13:55","modified_gmt":"2011-10-06T22:13:55","slug":"aicache-and-drupal-a-case-study","status":"publish","type":"post","link":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/2010\/11\/aicache-and-drupal-a-case-study\/","title":{"rendered":"aiCache and Drupal: A Case Study"},"content":{"rendered":"<p><strong>Note<\/strong>: This is Part 3 of an ongoing series on Drupal performance and load testing.  If you haven&#8217;t already, read the <a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/2010\/09\/optimizing-drupal-introduction\/\">introduction<\/a>.<\/p>\n<h3><!--more--><\/h3>\n<h3>Summary<\/h3>\n<p>We added to our existing research by configuring a dual-server reverse-proxy system using Drupal and a commercially available product called <a href=\"http:\/\/aicache.com\/\">aiCache<\/a>.<\/p>\n<p>Compared to a single-server installation, aiCache:<\/p>\n<ul>\n<li>Improved the number of simultaneous users the site could support by 400%.<\/li>\n<li>Greatly improved page durations of cacheable content.<\/li>\n<li>Eliminated all errors for users browsing cacheable content (such as anonymous users).<\/li>\n<\/ul>\n<h3>Procedure<\/h3>\n<p>We invited engineers from aiCache and a team of Drupal experts from <a href=\"http:\/\/www.achieveinternet.com\/\">Achieve Internet<\/a>, who configured a slightly customized Drupal that could inter-operate with aiCache.  AiCache, running on a separate Amazon instance, cached all static content and content intended for anonymous users.  Dynamic content for users with individual log-in accounts passed through aiCache and were generated by Drupal itself.<\/p>\n<div id=\"attachment_1684\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/11\/explody_internet.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1684\" class=\"size-medium wp-image-1684\" title=\"aiCache Configuration Diagram\" src=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/11\/explody_internet-300x143.png\" alt=\"aiCache configuration overview.\" width=\"300\" height=\"143\" srcset=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/11\/explody_internet-300x143.png 300w, https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/11\/explody_internet-500x239.png 500w, https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/11\/explody_internet.png 1266w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1684\" class=\"wp-caption-text\">aiCache configuration overview.<\/p><\/div>\n<p>Our load test included validators to verify correct operation of the site, for example, that users actually saw their user IDs after logging in.<\/p>\n<p>Our modified Drupal instance was built on Pressflow, had all of the basic optimizations turned on (APC, caching, etc) and a custom module that allowed Drupal to inter-operate with aiCache.\u00a0 This Drupal instance required only a few hours to implement and didn&#8217;t impair the user experience.<\/p>\n<p>The test profile was identical to our previous tests against <a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/2010\/09\/optimizing-drupal-from-baseline-drupal-to-the-pantheon-drupal-platform\/\">stock Drupal and the Pantheon Drupal Platform<\/a>, except that the test was configured to ramp up to 6,000 users over two hours.\u00a0 To get an apples-to-apples benchmark of aiCache&#8217;s performance, we tested both Drupal via aiCache and the Drupal backend without aiCache.<\/p>\n<h3>Simultaneous Users<\/h3>\n<p>In our previous case studies, we set two performance goals for all test platforms: error rates must be less than 0.1%, and average durations for all pages must be less than four seconds.<\/p>\n<p>According to this standard, raw Drupal, on the hardware provided, served up to <strong>800<\/strong> simultaneous users, but Drupal sitting behind aiCache served up to <strong>3,200<\/strong> simultaneous users.<\/p>\n<h3>Errors<\/h3>\n<p>But, there&#8217;s more to this story than simultaneous user level, because aiCache has the ability to continue serving content even when Drupal does not.\u00a0 When raw Drupal failed, the entire site became unusable.\u00a0 But when Drupal with aiCache failed, aiCache faithfully continued serving content.\u00a0 Anonymous users browsing the site with aiCache enabled <strong>never encountered a single error<\/strong>.<\/p>\n<p>Raw Drupal printed its first error <strong>9 minutes<\/strong> into the test, but Drupal with aiCache didn&#8217;t print an error until <strong>1 hour<\/strong> into the test.<\/p>\n<h3>Page Durations<\/h3>\n<p>With cacheable content we see a relatively clean graph with a few spikes (by the way, the yellow line is the most interesting from a load-testing perspective.  The red and pink lines represent upper and lower outliers.):<\/p>\n<div id=\"attachment_1660\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-6.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1660\" class=\"size-medium wp-image-1660\" title=\"duration-6\" src=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-6-300x164.png\" alt=\"Drupal+aiCache with Caching\" width=\"300\" height=\"164\" srcset=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-6-300x164.png 300w, https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-6-500x273.png 500w, https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-6.png 730w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1660\" class=\"wp-caption-text\">Page durations: Drupal+aiCache with cacheable content.<\/p><\/div>\n<p>For a task that was mostly dynamic, that is, that required a lot of work from Drupal because it involved updating data tables or incorporating user-specific elements, performance was significantly impaired:<\/p>\n<div id=\"attachment_1661\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-4.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1661\" class=\"size-medium wp-image-1661\" title=\"duration-4\" src=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-4-300x164.png\" alt=\"Drupal+aiCache Uncached\" width=\"300\" height=\"164\" srcset=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-4-300x164.png 300w, https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-4-500x273.png 500w, https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-content\/uploads\/2010\/10\/duration-4.png 730w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1661\" class=\"wp-caption-text\">Page durations: Drupal+aiCache with non-cacheable content<\/p><\/div>\n<h3>Conclusion<\/h3>\n<p>Our test scenario was quite harsh considering the architecture of reverse-proxy caching systems, because three of the four test cases depended heavily on application logic that only Drupal can perform.\u00a0 We also allowed the engineers at aiCache and Achieve Internet only a few hours to optimize the installation.\u00a0 Yet, we were still able to quadruple the capacity of our system while only doubling the hardware.<\/p>\n<p>We were also able to break down different functions of the web site using Web Performance Load Tester &#8212; demonstrating clearly which site functions were being optimized by aiCache and which functions were not.\u00a0 I can state confidently that the system we deployed was limited by the number of users contributing dynamic content, but could scale to support many thousands of casual anonymous visitors.<\/p>\n<p>&#8212; Lane, engineer at Web Performance<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Note: This is Part 3 of an ongoing series on Drupal performance and load testing.  If you haven&#8217;t already, read the <a href=\"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/2010\/09\/optimizing-drupal-introduction\/\">introduction<\/a>.<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,131],"tags":[91],"class_list":["post-1656","post","type-post","status-publish","format-standard","hentry","category-case-studies","category-drupal-2","tag-drupal"],"_links":{"self":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts\/1656","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/comments?post=1656"}],"version-history":[{"count":38,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts\/1656\/revisions"}],"predecessor-version":[{"id":2709,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/posts\/1656\/revisions\/2709"}],"wp:attachment":[{"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/media?parent=1656"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/categories?post=1656"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webperformance.com\/load-testing-tools\/blog\/wp-json\/wp\/v2\/tags?post=1656"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}