32
8th Sakai Conference 4-7 December 2007 Newport Beach Collaborative Performance Collaborative Performance Testing Testing Healthy Medicine for Robust Sakai Healthy Medicine for Robust Sakai Code Code

Load Testing Collaboration

Embed Size (px)

DESCRIPTION

dshgfjhf

Citation preview

Page 1: Load Testing Collaboration

8th Sakai Conference

4-7 December 2007Newport Beach

Collaborative Performance TestingCollaborative Performance TestingHealthy Medicine for Robust Sakai CodeHealthy Medicine for Robust Sakai Code

Page 2: Load Testing Collaboration

Collaborative Performance Collaborative Performance TestingTesting

• Using the example of Samigo, how performance testing can help developers find and fix performance defects before production.

Page 3: Load Testing Collaboration

OverviewOverview

• Introductions• Some terms• Michigan performance test setup• Perspectives:

– Tester– DBA– Systems Administrator– Developer

• Questions and Comments

Page 4: Load Testing Collaboration

Who are we?Who are we?

• Lydia Li – Sakai Developer, Stanford University

• Chris Franz – Senior System Administrator, Unicon

• Drew Zhu – Oracle DBA, University of Michigan

• Chris Kretler – Performance Tester, University of Michigan

Page 5: Load Testing Collaboration

What does performance testing What does performance testing mean to me?mean to me?

• Replication of middleware calls

• Tests have different goals:– “Load”– “Stress”– “Benchmark”– “Capacity Planning”

Page 6: Load Testing Collaboration

What does it mean, part IIWhat does it mean, part II

• High data requirements– 500 x 60 x 5 = 150,000 rows

• Response times

• Infrastructure metrics– CPU– Memory

• Concurrent “virtual” users

Page 7: Load Testing Collaboration

What it does not mean:What it does not mean:

• A Simulation– Actual traffic is generated– System cannot tell the difference.

• GUI test

• High-volume functional test– Scope is narrower

Page 8: Load Testing Collaboration

When do we test?When do we test?

• All major releases– New tools– “Significant” builds

• Hardware Evaluations

• Configuration Changes

• Sakai performance testing– Expand our scope

Page 9: Load Testing Collaboration

Michigan Test EnvironmentMichigan Test Environment

• Dedicated testing environment:– Load Balancers (Netscaler RS9000s)– 8 application servers (Dell 2650s running RedHat)– 1 Database server (Sun T2000 running 10g)

• System Administrators (Jeff, Adi, Rick, Ken, Jenny)

• Database Administrator (Drew)• LoadRunner software

Page 10: Load Testing Collaboration

Samigo Setup ProcessSamigo Setup Process

• Working Sakai build w/Samigo

• Determined requirements and focus

• Courses and students were created

• Sample tests imported

• Script creation– Lydia’s help was invaluable here.

Page 11: Load Testing Collaboration

Sample Script PortionSample Script PortionUnderstanding expected result is crucial to script creation.

Page 12: Load Testing Collaboration

Load Test ResultsLoad Test Results

Page 13: Load Testing Collaboration

DBA Tasks in Load Tests DBA Tasks in Load Tests

• Monitoring Database and DB Server

• Produce AWR reports

• Analyze AWR Reports and Identify Issues

• Communicate with Developers, Testers, and Sysadmins

• Query Details and Analyzing Execution Plans

• Provide suggestions

Page 14: Load Testing Collaboration

Oracle OEM Screenshot -1Oracle OEM Screenshot -1

Page 15: Load Testing Collaboration

Oracle OEM Screenshot -2Oracle OEM Screenshot -2

Page 16: Load Testing Collaboration

Oracle OEM Screenshot -3Oracle OEM Screenshot -3

Page 17: Load Testing Collaboration

Samigo Load Test AWRSamigo Load Test AWR• CPU Elapsed CPU per % Total• Time (s) Time (s) Executions Exec (s) DB Time SQL Id• ---------- ---------- ------------ ----------- ------- -------------• 3,184 3,296 68,972 0.05 43.8 38xh90r4gx5cz• select itemgradin0_.ITEMGRADINGID as ITEMGRAD1_139_, itemgradin0_.ASSESSMENTGRAD• INGID as ASSESSME2_139_, itemgradin0_.PUBLISHEDITEMID as PUBLISHE3_139_, itemgra• din0_.PUBLISHEDITEMTEXTID as PUBLISHE4_139_, itemgradin0_.AGENTID as AGENTID139_• , itemgradin0_.SUBMITTEDDATE as SUBMITTE6_139_, itemgradin0_.PUBLISHEDANSWERID a

• 858 858 254,115 0.00 11.4 0byxm85k79suc• select answerfeed0_.ANSWERID as ANSWERID1_, answerfeed0_.ANSWERFEEDBACKID as ANS• WERFE1_1_, answerfeed0_.ANSWERFEEDBACKID as ANSWERFE1_137_0_, answerfeed0_.ANSWE• RID as ANSWERID137_0_, answerfeed0_.TYPEID as TYPEID137_0_, answerfeed0_.TEXT as• TEXT137_0_ from SAM_PUBLISHEDANSWERFEEDBACK_T answerfeed0_ where answerfeed0_.A

• 834 980 79,456 0.01 13.0 3px7qs284b3xk• select answerset0_.ITEMTEXTID as ITEMTEXTID7_, answerset0_.ANSWERID as ANSWERID7• _, answerset0_.ANSWERID as ANSWERID136_6_, answerset0_.ITEMTEXTID as ITEMTEXTID1• 36_6_, answerset0_.ITEMID as ITEMID136_6_, answerset0_.TEXT as TEXT136_6_, answe• rset0_.SEQUENCE as SEQUENCE136_6_, answerset0_.LABEL as LABEL136_6_, answerset0_

• 203 203 43,210 0.00 2.7 9xmw3p1px195k• select count(1) from SAKAI_REALM_RL_FN where REALM_KEY in (select REALM_KEY from• SAKAI_REALM where SAKAI_REALM.REALM_ID IN (:1,:2,:3,:4,:5)) and FUNCTION_KEY i• n (select FUNCTION_KEY from SAKAI_REALM_FUNCTION where FUNCTION_NAME = :6) and (• ROLE_KEY in (select ROLE_KEY from SAKAI_REALM_RL_GR where ACTIVE = '1' and USER_

• 142 142 55,652 0.00 1.9 5n3rvywwp9y7u• select itemmetada0_.ITEMID as ITEMID1_, itemmetada0_.ITEMMETADATAID as ITEMMETA1• _1_, itemmetada0_.ITEMMETADATAID as ITEMMETA1_134_0_, itemmetada0_.ITEMID as ITE• MID134_0_, itemmetada0_.LABEL as LABEL134_0_, itemmetada0_.ENTRY as ENTRY134_0_• from SAM_PUBLISHEDITEMMETADATA_T itemmetada0_ where itemmetada0_.ITEMID=:1

Page 18: Load Testing Collaboration

Samigo Load Test AWRSamigo Load Test AWR• CPU Elapsed CPU per % Total• Time (s) Time (s) Executions Exec (s) DB Time SQL Id• ---------- ---------- ------------ ----------- ------- -------------• 10,105 10,659 2,125,189 0.00 15.2 0byxm85k79suc• select answerfeed0_.ANSWERID as ANSWERID1_, answerfeed0_.ANSWERFEEDBACKID as ANS• WERFE1_1_, answerfeed0_.ANSWERFEEDBACKID as ANSWERFE1_137_0_, answerfeed0_.ANSWE• RID as ANSWERID137_0_, answerfeed0_.TYPEID as TYPEID137_0_, answerfeed0_.TEXT as• TEXT137_0_ from SAM_PUBLISHEDANSWERFEEDBACK_T answerfeed0_ where answerfeed0_.A

• 8,184 8,459 99,794 0.08 12.1 8wcadnu8rwd5b• select count(assessment0_.ASSESSMENTGRADINGID) as col_0_0_ from SAM_ASSESSMENTGR• ADING_T assessment0_ where assessment0_.FORGRADE=1 and assessment0_.AGENTID=:1 a• nd assessment0_.PUBLISHEDASSESSMENTID=:2

• 7,290 8,974 665,235 0.01 12.8 3px7qs284b3xk• select answerset0_.ITEMTEXTID as ITEMTEXTID7_, answerset0_.ANSWERID as ANSWERID7• _, answerset0_.ANSWERID as ANSWERID136_6_, answerset0_.ITEMTEXTID as ITEMTEXTID1• 36_6_, answerset0_.ITEMID as ITEMID136_6_, answerset0_.TEXT as TEXT136_6_, answe• rset0_.SEQUENCE as SEQUENCE136_6_, answerset0_.LABEL as LABEL136_6_, answerset0_

• 5,979 6,189 77,580 0.08 8.8 3cswn2dndzcm0• select assessment0_.ASSESSMENTGRADINGID as ASSESSME1_140_, assessment0_.PUBLISHE• DASSESSMENTID as PUBLISHE2_140_, assessment0_.AGENTID as AGENTID140_, assessment• 0_.SUBMITTEDDATE as SUBMITTE4_140_, assessment0_.ISLATE as ISLATE140_, assessmen• t0_.FORGRADE as FORGRADE140_, assessment0_.TOTALAUTOSCORE as TOTALAUT7_140_, ass

• 2,174 2,232 317,661 0.01 3.2 9xmw3p1px195k• select count(1) from SAKAI_REALM_RL_FN where REALM_KEY in (select REALM_KEY from• SAKAI_REALM where SAKAI_REALM.REALM_ID IN (:1,:2,:3,:4,:5)) and FUNCTION_KEY i• n (select FUNCTION_KEY from SAKAI_REALM_FUNCTION where FUNCTION_NAME = :6) and (• ROLE_KEY in (select ROLE_KEY from SAKAI_REALM_RL_GR where ACTIVE = '1' and USER_

• 1,950 2,026 22,183 0.09 2.9 8su2pcsy7fbq5• select assessment0_.ASSESSMENTGRADINGID as col_0_0_, publisheda1_.ID as col_1_0_• , publisheda1_.TITLE as col_2_0_, assessment0_.AGENTID as col_3_0_, assessment0_• .SUBMITTEDDATE as col_4_0_, assessment0_.ISLATE as col_5_0_, assessment0_.FORGRA• DE as col_6_0_, assessment0_.TOTALAUTOSCORE as col_7_0_, assessment0_.TOTALOVERR

Page 19: Load Testing Collaboration

New Indexes for SamigoNew Indexes for Samigo• create index idx_ASSGRAD_AID_PUBASSEID on

SAM_ASSESSMENTGRADING_T(AGENTID,PUBLISHEDASSESSMENTID) tablespace ctools_indexes; create index IDX_ITEMGRADING_A_GRADINGID on SAM_ITEMGRADING_T(ASSESSMENTGRADINGID) tablespace ctools_indexes; create index IDX_PUBANS_ITEMTEXTID on SAM_PUBLISHEDANSWER_T(ITEMTEXTID) tablespace ctools_indexes; create index IDX_PUBMETDATA_ASSESSMENTID on SAM_PUBLISHEDMETADATA_T(ASSESSMENTID) tablespace ctools_indexes;

Page 20: Load Testing Collaboration

Samigo Load Test AWRSamigo Load Test AWR• CPU Elapsed CPU per % Total• Time (s) Time (s) Executions Exec (s) DB Time SQL Id• ---------- ---------- ------------ ----------- ------- -------------• 4,840 5,046 1,007,039 0.00 21.0 0byxm85k79suc• select answerfeed0_.ANSWERID as ANSWERID1_, answerfeed0_.ANSWERFEEDBACKID as ANS• WERFE1_1_, answerfeed0_.ANSWERFEEDBACKID as ANSWERFE1_137_0_, answerfeed0_.ANSWE• RID as ANSWERID137_0_, answerfeed0_.TYPEID as TYPEID137_0_, answerfeed0_.TEXT as• TEXT137_0_ from SAM_PUBLISHEDANSWERFEEDBACK_T answerfeed0_ where answerfeed0_.A

• 3,489 4,245 315,353 0.01 17.7 3px7qs284b3xk• select answerset0_.ITEMTEXTID as ITEMTEXTID7_, answerset0_.ANSWERID as ANSWERID7• _, answerset0_.ANSWERID as ANSWERID136_6_, answerset0_.ITEMTEXTID as ITEMTEXTID1• 36_6_, answerset0_.ITEMID as ITEMID136_6_, answerset0_.TEXT as TEXT136_6_, answe• rset0_.SEQUENCE as SEQUENCE136_6_, answerset0_.LABEL as LABEL136_6_, answerset0_

• 1,072 1,096 152,652 0.01 4.6 9xmw3p1px195k• select count(1) from SAKAI_REALM_RL_FN where REALM_KEY in (select REALM_KEY from• SAKAI_REALM where SAKAI_REALM.REALM_ID IN (:1,:2,:3,:4,:5)) and FUNCTION_KEY i• n (select FUNCTION_KEY from SAKAI_REALM_FUNCTION where FUNCTION_NAME = :6) and (• ROLE_KEY in (select ROLE_KEY from SAKAI_REALM_RL_GR where ACTIVE = '1' and USER_

• 817 839 220,813 0.00 3.5 5n3rvywwp9y7u• select itemmetada0_.ITEMID as ITEMID1_, itemmetada0_.ITEMMETADATAID as ITEMMETA1• _1_, itemmetada0_.ITEMMETADATAID as ITEMMETA1_134_0_, itemmetada0_.ITEMID as ITE• MID134_0_, itemmetada0_.LABEL as LABEL134_0_, itemmetada0_.ENTRY as ENTRY134_0_• from SAM_PUBLISHEDITEMMETADATA_T itemmetada0_ where itemmetada0_.ITEMID=:1

• 623 643 15,350 0.04 2.7 c55kf9dj75jy4• select count(1) from SAKAI_REALM_RL_FN MAINTABLE LEFT JOIN SAKAI_REALM_RL• _GR GRANTED_ROLES ON (MAINTABLE.REALM_KEY = GRANTED_ROLES.REALM_KEY AND• MAINTABLE.ROLE_KEY = GRANTED_ROLES.ROLE_KEY), SAKAI_REALM REALMS, SAKAI_REAL• M_ROLE ROLES, SAKAI_REALM_FUNCTION FUNCTIONS where ( ROLES.ROLE_NAME in(

Page 21: Load Testing Collaboration

Server Side MonitoringServer Side Monitoring• Ran Perl script to capture CPU utilization on

one of eight app servers as well as the DB server

• The amount of free space in the JVM on one of the application servers was also captured

• Ran ‘tail –f *.log’ on the app servers looking for stack traces, 404 errors, etc.

• When necessary, send a ‘kill –QUIT <jvm pid>’ to get a thread dump of what’s going on inside

Page 22: Load Testing Collaboration

JAVA_OPTSJAVA_OPTSJAVA_OPTS="-server -Xms1500m -Xmx1500m"

JAVA_OPTS="$JAVA_OPTS -XX:NewSize=400m XX:MaxNewSize=400m"

JAVA_OPTS="$JAVA_OPTS -XX:PermSize=192m -XX:MaxPermSize=192m"

JAVA_OPTS="$JAVA_OPTS -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails"

JAVA_OPTS="$JAVA_OPTS -Dsakai.home=/usr/local/sakai/home -Dsakai.components.root=/usr/local/sakai/components"

JAVA_OPTS="$JAVA_OPTS -Dsakai.security=/usr/local/sakai/home"

JAVA_OPTS="$JAVA_OPTS -Dnetworkaddress.cache.ttl=0 -Dnetworkaddress.cache.negative.ttl=0"

JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=0 -Dsun.net.inetaddr.negative.ttl=0"

JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"

Page 23: Load Testing Collaboration

CPU UtilizationCPU Utilization

• Both application server and database server utilization was spiky

• Application server was in the 20-60% range

• Database server was in the 60-100% range

Page 24: Load Testing Collaboration

CPU Utilization GraphsCPU Utilization Graphs

Page 25: Load Testing Collaboration

App Server Heap UsageApp Server Heap Usage

Page 26: Load Testing Collaboration

Application ProfilingApplication Profiling

• If bottleneck was determined to be on application server side, we were prepared to use JProfiler to capture internal JVM statistics

• Due to its overhead, a profiler can generally

only capture statistics under lighter loads

Page 27: Load Testing Collaboration

Purpose for the tripPurpose for the trip• Identify bottlenecks under load.

– no local performance test environment and expertise

• Establish a baseline for future regression testing.

• Gain confidence in our local deployment.– Samigo is an important tool for our users.

• Publish performance test report to the Sakai community.

Page 28: Load Testing Collaboration

Prepare for Performance TestPrepare for Performance Test• What test case scenarios are we testing?

– Focus on Samigo’s delivery feature.

• What is the expected usage pattern– Our user support team provided the expected # of

concurrent users at Stanford– Emailed and collected other schools’ usage information

• Prepare for the test– Created sample assessments with question types. – Send Chris XMLs to be pre-loaded to the test

environment. – Assisted Chris with load test scripts.

Page 29: Load Testing Collaboration

During the testDuring the test

• Monitored Oracle DB

• Monitored Application Servers,

• Monitored LoadRunner’s test results/graphs.

• Iterative performance tuning based on test results.

Page 30: Load Testing Collaboration

What we learnedWhat we learned

• Database:– Added indexes upon Drew’s recommendation.

• Application:– Optimized application code to reduce excessive

DB calls (SAK-10153)

• No memory leaks found.

Page 31: Load Testing Collaboration

Things we didn’t test in deliveryThings we didn’t test in delivery

• Focused on Samigo’s Delivery only– Did not test Audio and File Upload questions due

to limited time– Audio/File upload questions are heavily used at

Stanford. Please let us know if you have questions.

Page 32: Load Testing Collaboration

SummarySummary

• Performance test helps to identify bottlenecks under load.

• Establishes a baseline for future testing. – Identify performance improvement/degradation in future

releases.

• Load test should be an integral part of release.

• Performance test report can be found at http://bugs.sakaiproject.org/confluence/display/SAM/Home