28
The PerfOps Revolution Shutterfly’s Journey To FAST Fred Beringer – VP, Digital Customer Experience

The PerfOps revolution - Shutterfly's journey to faster performance

Embed Size (px)

Citation preview

ThePerfOpsRevolution

Shutterfly’sJourneyToFAST

FredBeringer– VP,DigitalCustomerExperience

2

WHO IS FRED?

3

4

WHY?

Source: Forrester Research

CUSTOMER SATISFACTION

Source: Forrester Research

Rebuilding Pinterest pages for performance resulted in a 40% decrease in wait time, a 15% increase in SEO traffic and a 15% increase in conversion rate to signup.

Source: Forrester Research

BBC has seen that they lose an additional 10% of users for every additional second it takes for their site to load

Source: Forrester Research

Staples reduced median homepage load time by 1 second and reduced load time for the 98th percentile by 6 seconds. As a result, they saw a 10% increase in their conversion rate.

Source: Forrester Research

MORE STATS https://wpostats.com/

10

PerfOps Program

11

Synthetic Monitoring

Real User Monitoring

NFRs

Back-End Optimization

Performance Budget

Automated Load Test

Automated WebPageTestBack-End Monitoring

Front-End Optimization

Production Load Test

Non-Functional RequirementsBringEngineering,OperationsandProducttogether

class ProjectServicePatchSimulation extends Simulation {val users = Configuration.getNumUsers(100)val ramp = Configuration.getRampDuration(60 seconds)val simulationDuration = Configuration.getDuration(StandardDurations.EXTRA_LONG)val httpConf = newProjectServicesConfig(Configuration.ssapiProjectService.httpsUrl)val numRepeats = 500;val projectPatchScenario = scenario(this.getClass.getSimpleName)

.during(simulationDuration) {exitBlockOnFail {

exec(clearCookies).exec{session=>println("Simualtion duration: " + simulationDuration)session

}.exec(NonVisualAuthenticationService.signInUniqueUser).exec(ProjectService.createProject("photobook")).repeat(numRepeats) {

exec(ProjectService.patchProject("photobook", "${userid}", "${photobook_project_guid}"))

}.exec(ProjectService.createProject("calendar")).repeat(numRepeats) {

exec(ProjectService.patchProject("calendar", "${userid}", "${calendar_project_guid}"))}.exec(signOut)

}}

setUp(projectPatchScenario.inject(rampUsers(users) over (ramp))).protocols(httpConf).assertions(simulationAssertions)

private def simulationAssertions: List[Assertion] = {val baseAsserts = List(

details(ProjectService.REQUEST_PATCH_PROJECT + "-calendar").failedRequests.percent.lessThan(1),

details(ProjectService.REQUEST_PATCH_PROJECT + "-photobook").failedRequests.percent.lessThan(1),

details(ProjectService.REQUEST_PATCH_PROJECT + "-calendar").responseTime.percentile3.lessThan(12000),

details(ProjectService.REQUEST_PATCH_PROJECT + "-photobook").responseTime.percentile3.lessThan(1411),

details(ProjectService.REQUEST_PATCH_PROJECT + "-calendar").requestsPerSec.greaterThan(10),

details(ProjectService.REQUEST_PATCH_PROJECT + "-photobook").requestsPerSec.greaterThan(30)

)baseAsserts

}}

AUTOMATED LOAD AND PERFORMANCE

WEB PERFORMANCE BEST PRACTICES

15

AUTOMATED WEBPAGE TESTContinuousMonitoringofPerformanceImprovements

PERFORMANCE BUDGET

BACK-END OPTIMIZATIONAPPDYNAMICS

BACK-END OPTIMIZATIONCPUHOTSPOTSWITHYOURKIT

BACK-END OPTIMIZATIONMEMORYHOTSPOTSWITHYOURKIT

BACK-END OPTIMIZATION

Duringnon-peak1. P80- Backendtimeforthispageisaround1.5Secs(frommpulse)2. Around30slowtransactionsevery10mins(fromappD)3. Around4veryslowtransactions(>900ms)every10mins

SAMPLE:ONESFLYCRITICALPAGES

BACK-END OPTIMIZATION

JDBCConnectionObjectsarecreatedratherthanobtainingfrompool.Databaseconnectionsareoftenexpensivetocreatebecauseoftheoverheadofestablishinganetworkconnectionandinitializingadatabaseconnectionsessioninthebackenddatabase.

Recommendation:UseConnectionpool

SAMPLE:DBCONNECTION

22

SYNTHETIC MONITORINGNEUSTAR

23

REAL-USER MONITORINGMPULSE

PRODUCTION LOAD AND PERFORMANCESOASTACLOUDTEST

PRODUCTION LOAD AND PERFORMANCESOASTACLOUDTEST

Q4 - GAME ON!

Q4 - GAME ON!

28

Get in [email protected]/fredberinger

linkedin.com/in/fredberinger