Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Decrease minCapacity of instances to 27 #9369

Merged
merged 2 commits into from
Nov 1, 2023
Merged

Conversation

ioannakok
Copy link
Contributor

@ioannakok ioannakok commented Oct 31, 2023

What does this change?

Reduces DCR minCapacity to 27.

Why?

minCapacity was bumped from 15 to 30 in

After the fronts migration was completed, it seemed that 15 instances weren't holding up with the new traffic. Bumping instances to 30 was a hotfix and there is upcoming work to split our stacks. Until we reach this point we would like to see whether we could handle the traffic with 27 instances. This change is a first step of the research we're doing to how to optimise DCR scaling in terms of:

See WIP document on our research and findings so far.

Metrics to keep an eye on

After the fronts migration and with DCR having a minCapacity of 15 @guardian/devx-reliability team had to lower the SLO target for facia app in https://github.com/guardian/slo-alerts/pull/37 after ongoing issues with DCR latency. After increasing minCapacity to 30 they were able to restore SLO to the initial target. We can monitor the impact of reducing minCapacity to 25 by checking the following dashboards:

@github-actions
Copy link

github-actions bot commented Oct 31, 2023

Size Change: 0 B

Total Size: 697 kB

ℹ️ View Unchanged
Filename Size
dotcom-rendering/dist/1076.web.********************.js 3.08 kB
dotcom-rendering/dist/1149.web.********************.js 2.92 kB
dotcom-rendering/dist/1226.web.********************.js 3.66 kB
dotcom-rendering/dist/1244.web.********************.js 865 B
dotcom-rendering/dist/1294.web.********************.js 5.36 kB
dotcom-rendering/dist/1406.web.********************.js 5.09 kB
dotcom-rendering/dist/1418.web.********************.js 10.2 kB
dotcom-rendering/dist/1465.web.********************.js 3.32 kB
dotcom-rendering/dist/1486.web.********************.js 744 B
dotcom-rendering/dist/1521.web.********************.js 5.48 kB
dotcom-rendering/dist/1659.web.********************.js 518 B
dotcom-rendering/dist/1848.web.********************.js 644 B
dotcom-rendering/dist/1959.web.********************.js 29.5 kB
dotcom-rendering/dist/1987.web.********************.js 3.12 kB
dotcom-rendering/dist/1997.web.********************.js 744 B
dotcom-rendering/dist/2071.web.********************.js 745 B
dotcom-rendering/dist/21.web.********************.js 758 B
dotcom-rendering/dist/2126.web.********************.js 884 B
dotcom-rendering/dist/2133.web.********************.js 4.46 kB
dotcom-rendering/dist/2201.web.********************.js 778 B
dotcom-rendering/dist/2228.web.********************.js 899 B
dotcom-rendering/dist/2339.web.********************.js 778 B
dotcom-rendering/dist/2351.web.********************.js 3.34 kB
dotcom-rendering/dist/2394.web.********************.js 1.75 kB
dotcom-rendering/dist/2467.web.********************.js 2.08 kB
dotcom-rendering/dist/2494.web.********************.js 774 B
dotcom-rendering/dist/2546.web.********************.js 3.72 kB
dotcom-rendering/dist/275.web.********************.js 697 B
dotcom-rendering/dist/3024.web.********************.js 621 B
dotcom-rendering/dist/3146.web.********************.js 6.53 kB
dotcom-rendering/dist/3358.web.********************.js 637 B
dotcom-rendering/dist/356.web.********************.js 826 B
dotcom-rendering/dist/3653.web.********************.js 12.8 kB
dotcom-rendering/dist/3960.web.********************.js 619 B
dotcom-rendering/dist/3968.web.********************.js 3.79 kB
dotcom-rendering/dist/4113.web.********************.js 757 B
dotcom-rendering/dist/4265.web.********************.js 2.79 kB
dotcom-rendering/dist/4306.web.********************.js 6.46 kB
dotcom-rendering/dist/4591.web.********************.js 404 B
dotcom-rendering/dist/4593.web.********************.js 1.74 kB
dotcom-rendering/dist/4734.web.********************.js 759 B
dotcom-rendering/dist/480.web.********************.js 524 B
dotcom-rendering/dist/4896.web.********************.js 2.17 kB
dotcom-rendering/dist/5021.web.********************.js 963 B
dotcom-rendering/dist/5071.web.********************.js 941 B
dotcom-rendering/dist/5211.web.********************.js 2.92 kB
dotcom-rendering/dist/5225.web.********************.js 6.67 kB
dotcom-rendering/dist/5474.web.********************.js 620 B
dotcom-rendering/dist/5688.web.********************.js 3.79 kB
dotcom-rendering/dist/5974.web.********************.js 742 B
dotcom-rendering/dist/6118.web.********************.js 682 B
dotcom-rendering/dist/6126.web.********************.js 2.23 kB
dotcom-rendering/dist/640.web.********************.js 711 B
dotcom-rendering/dist/6437.web.********************.js 867 B
dotcom-rendering/dist/6534.web.********************.js 575 B
dotcom-rendering/dist/6541.web.********************.js 811 B
dotcom-rendering/dist/657.web.********************.js 2.46 kB
dotcom-rendering/dist/6623.web.********************.js 3.65 kB
dotcom-rendering/dist/7133.web.********************.js 699 B
dotcom-rendering/dist/7305.web.********************.js 886 B
dotcom-rendering/dist/7401.web.********************.js 689 B
dotcom-rendering/dist/7569.web.********************.js 4.91 kB
dotcom-rendering/dist/7650.web.********************.js 23 kB
dotcom-rendering/dist/7688.web.********************.js 814 B
dotcom-rendering/dist/786.web.********************.js 477 B
dotcom-rendering/dist/8085.web.********************.js 2.59 kB
dotcom-rendering/dist/8112.web.********************.js 3.37 kB
dotcom-rendering/dist/8165.web.********************.js 926 B
dotcom-rendering/dist/8170.web.********************.js 490 B
dotcom-rendering/dist/8172.web.********************.js 2.53 kB
dotcom-rendering/dist/818.web.********************.js 2.85 kB
dotcom-rendering/dist/8268.web.********************.js 5.65 kB
dotcom-rendering/dist/8439.web.********************.js 4.97 kB
dotcom-rendering/dist/8447.web.********************.js 963 B
dotcom-rendering/dist/8505.web.********************.js 556 B
dotcom-rendering/dist/8555.web.********************.js 690 B
dotcom-rendering/dist/8622.web.********************.js 858 B
dotcom-rendering/dist/8638.web.********************.js 831 B
dotcom-rendering/dist/9422.web.********************.js 614 B
dotcom-rendering/dist/9490.web.********************.js 825 B
dotcom-rendering/dist/9568.web.********************.js 5.37 kB
dotcom-rendering/dist/9597.web.********************.js 3.25 kB
dotcom-rendering/dist/9724.web.********************.js 5.02 kB
dotcom-rendering/dist/AdPortals-importable.web.********************.js 4.08 kB
dotcom-rendering/dist/AlreadyVisited-importable.web.********************.js 412 B
dotcom-rendering/dist/AppEmailSignUp-importable.web.********************.js 7.21 kB
dotcom-rendering/dist/AppsEpic-importable.web.********************.js 3.96 kB
dotcom-rendering/dist/AppsFooter-importable.web.********************.js 3.37 kB
dotcom-rendering/dist/AppsLightboxImage-importable.web.********************.js 2.82 kB
dotcom-rendering/dist/AudioAtomWrapper-importable.web.********************.js 3.27 kB
dotcom-rendering/dist/AustralianTerritorySwitcher-importable.web.********************.js 4.86 kB
dotcom-rendering/dist/Branding-importable.web.********************.js 2.2 kB
dotcom-rendering/dist/braze-web-sdk-core.web.********************.js 36.9 kB
dotcom-rendering/dist/BrazeMessaging-importable.web.********************.js 5.55 kB
dotcom-rendering/dist/CalloutBlockComponent-importable.web.********************.js 6.47 kB
dotcom-rendering/dist/CalloutEmbedBlockComponent-importable.web.********************.js 5.82 kB
dotcom-rendering/dist/CardCommentCount-importable.web.********************.js 2.69 kB
dotcom-rendering/dist/Carousel-importable.web.********************.js 7.75 kB
dotcom-rendering/dist/CarouselForNewsletters-importable.web.********************.js 5.6 kB
dotcom-rendering/dist/ChartAtom-importable.web.********************.js 500 B
dotcom-rendering/dist/CommentCount-importable.web.********************.js 2.85 kB
dotcom-rendering/dist/DiscussionContainer-importable.web.********************.js 23.9 kB
dotcom-rendering/dist/DiscussionMeta-importable.web.********************.js 3.75 kB
dotcom-rendering/dist/DocumentBlockComponent-importable.web.********************.js 3.3 kB
dotcom-rendering/dist/EmbedBlockComponent-importable.web.********************.js 3.84 kB
dotcom-rendering/dist/EnhancePinnedPost-importable.web.********************.js 1.95 kB
dotcom-rendering/dist/FetchOnwardsData-importable.web.********************.js 2.5 kB
dotcom-rendering/dist/FilterKeyEventsToggle-importable.web.********************.js 3.31 kB
dotcom-rendering/dist/FocusStyles-importable.web.********************.js 607 B
dotcom-rendering/dist/FollowWrapper-importable.web.********************.js 3.83 kB
dotcom-rendering/dist/FooterLabel-importable.web.********************.js 336 B
dotcom-rendering/dist/frameworks.web.********************.js 20.8 kB
dotcom-rendering/dist/GetCricketScoreboard-importable.web.********************.js 3.26 kB
dotcom-rendering/dist/GetMatchNav-importable.web.********************.js 12.6 kB
dotcom-rendering/dist/GetMatchStats-importable.web.********************.js 355 B
dotcom-rendering/dist/GetMatchTabs-importable.web.********************.js 2.31 kB
dotcom-rendering/dist/guardian-braze-components-banner.web.********************.js 13.4 kB
dotcom-rendering/dist/guardian-braze-components-end-of-article.web.********************.js 9 kB
dotcom-rendering/dist/GuideAtomWrapper-importable.web.********************.js 790 B
dotcom-rendering/dist/HeaderTopBar-importable.web.********************.js 11 kB
dotcom-rendering/dist/index.web.********************.js 37.8 kB
dotcom-rendering/dist/InstagramBlockComponent-importable.web.********************.js 3.38 kB
dotcom-rendering/dist/InteractiveBlockComponent-importable.web.********************.js 5.82 kB
dotcom-rendering/dist/InteractiveContentsBlockComponent-importable.web.********************.js 3.79 kB
dotcom-rendering/dist/InteractiveSupportButton-importable.web.********************.js 4.12 kB
dotcom-rendering/dist/KeyEventsCarousel-importable.web.********************.js 2.78 kB
dotcom-rendering/dist/KnowledgeQuizAtom-importable.web.********************.js 3.51 kB
dotcom-rendering/dist/LatestLinks-importable.web.********************.js 968 B
dotcom-rendering/dist/LightboxHash-importable.web.********************.js 430 B
dotcom-rendering/dist/LightboxJavascript-importable.web.********************.js 4.42 kB
dotcom-rendering/dist/LiveBlogEpic-importable.web.********************.js 3.04 kB
dotcom-rendering/dist/Liveness-importable.web.********************.js 3.34 kB
dotcom-rendering/dist/ManyNewsletterSignUp-importable.web.********************.js 4.98 kB
dotcom-rendering/dist/MapEmbedBlockComponent-importable.web.********************.js 5.39 kB
dotcom-rendering/dist/Metrics-importable.web.********************.js 2.56 kB
dotcom-rendering/dist/MostViewedFooter-importable.web.********************.js 5.38 kB
dotcom-rendering/dist/MostViewedFooterData-importable.web.********************.js 7.7 kB
dotcom-rendering/dist/MostViewedRightWrapper-importable.web.********************.js 3.9 kB
dotcom-rendering/dist/OnwardsUpper-importable.web.********************.js 4.17 kB
dotcom-rendering/dist/PersonalityQuizAtom-importable.web.********************.js 3.65 kB
dotcom-rendering/dist/ProfileAtom-importable.web.********************.js 547 B
dotcom-rendering/dist/ProfileAtomWrapper-importable.web.********************.js 810 B
dotcom-rendering/dist/PulsingDot-importable.web.********************.js 744 B
dotcom-rendering/dist/QandaAtom-importable.web.********************.js 542 B
dotcom-rendering/dist/ReaderRevenueDev-importable.web.********************.js 485 B
dotcom-rendering/dist/readerRevenueDevUtils.web.********************.js 2.98 kB
dotcom-rendering/dist/ReaderRevenueLinks-importable.web.********************.js 4.98 kB
dotcom-rendering/dist/RecipeMultiplier-importable.web.********************.js 3.17 kB
dotcom-rendering/dist/RelativeTime-importable.web.********************.js 1.92 kB
dotcom-rendering/dist/RichLinkComponent-importable.web.********************.js 6.34 kB
dotcom-rendering/dist/SecureSignupIframe-importable.web.********************.js 4.93 kB
dotcom-rendering/dist/SendAMessage-importable.web.********************.js 4.38 kB
dotcom-rendering/dist/SendTargetingParams-importable.web.********************.js 2.08 kB
dotcom-rendering/dist/sentry.web.********************.js 773 B
dotcom-rendering/dist/SetABTests-importable.web.********************.js 4.53 kB
dotcom-rendering/dist/SetAdTargeting-importable.web.********************.js 514 B
dotcom-rendering/dist/shimport.web.********************.js 2.78 kB
dotcom-rendering/dist/ShowHideContainers-importable.web.********************.js 642 B
dotcom-rendering/dist/ShowMore-importable.web.********************.js 5.59 kB
dotcom-rendering/dist/SignInGateMain.web.********************.js 3.86 kB
dotcom-rendering/dist/SignInGateMainCheckoutComplete.web.********************.js 4.93 kB
dotcom-rendering/dist/SignInGateSelector-importable.web.********************.js 3.57 kB
dotcom-rendering/dist/SlotBodyEnd-importable.web.********************.js 8.78 kB
dotcom-rendering/dist/Snow-importable.web.********************.js 3.02 kB
dotcom-rendering/dist/SpotifyBlockComponent-importable.web.********************.js 5.24 kB
dotcom-rendering/dist/StickyBottomBanner-importable.web.********************.js 5.92 kB
dotcom-rendering/dist/SubNav-importable.web.********************.js 2.36 kB
dotcom-rendering/dist/SupportTheG-importable.web.********************.js 5.09 kB
dotcom-rendering/dist/TableOfContents-importable.web.********************.js 2.96 kB
dotcom-rendering/dist/TimelineAtom-importable.web.********************.js 1.22 kB
dotcom-rendering/dist/TweetBlockComponent-importable.web.********************.js 1.01 kB
dotcom-rendering/dist/UnsafeEmbedBlockComponent-importable.web.********************.js 3.38 kB
dotcom-rendering/dist/VideoFacebookBlockComponent-importable.web.********************.js 5.41 kB
dotcom-rendering/dist/VineBlockComponent-importable.web.********************.js 3.23 kB
dotcom-rendering/dist/WeatherWrapper-importable.web.********************.js 5.42 kB
dotcom-rendering/dist/YoutubeBlockComponent-importable.web.********************.js 3.67 kB

compressed-size-action

@ioannakok ioannakok force-pushed the mob/reduce-min-instances branch from 1367910 to 648d1cd Compare October 31, 2023 12:32
@ioannakok ioannakok marked this pull request as ready for review October 31, 2023 12:32
@ioannakok ioannakok requested a review from a team as a code owner October 31, 2023 12:32
@ioannakok
Copy link
Contributor Author

Any thoughts from @guardian/devx-reliability on this?

Copy link
Contributor

@mxdvl mxdvl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎛️

@alinaboghiu alinaboghiu added the run_chromatic Runs chromatic when label is applied label Oct 31, 2023
@jacobwinch
Copy link
Contributor

jacobwinch commented Oct 31, 2023

Any thoughts from @guardian/devx-reliability on this?

I agree that it makes sense to experiment with the minimum capacity here 👍

IIUC we are unsure exactly how low we can set the minimum without impacting users? However, we know that the cost of deploying this type of change is very low, so I would be tempted to drop the capacity in groups of 31 and monitor at each stage using the metrics that you've suggested (stopping somewhere before we get to 15 where there are known problems!).

I think it'd also be worth documenting the cost saving per month that we achieve for each capacity reduction to help to prioritise how far we want to push this experimentation.

Footnotes

  1. I would normally modify ASG capacity in multiples of 3 (so that AWS can evenly distribute across Availability Zones), but I don't know if it's strictly necessary to have an identical number of instances in each AZ.

ioannakok added a commit that referenced this pull request Nov 1, 2023
@jacobwinch made a good point in the review about dropping the capacity in groups of 3 and monitoring at each stage. It's good to modify ASG capacity in groups of 3 so that AWS can evenly distribute across Availability Zones (https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#arch-AutoScalingMultiAZ).

#9369 (comment)

Co-authored-by: Jacob Winch <[email protected]>
ioannakok and others added 2 commits November 1, 2023 09:43
`minCapacity` was bumped from 15 to 30 in #8724. After the fronts migration was completed, it seemed that 15 instances weren't holding up with the new traffic we were sending. That was a hotfix and there is upcoming work to split our stacks (#8351) but until we reach this point we would like to see whether we could handle the traffic with 25 instances. This change is part of the research we're doing to optimise how we scale: #9322.

Co-authored-by: George B <[email protected]>
Co-authored-by: Ravi <[email protected]>
@jacobwinch made a good point in the review about dropping the capacity in groups of 3 and monitoring at each stage. It's good to modify ASG capacity in groups of 3 so that AWS can evenly distribute across Availability Zones (https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#arch-AutoScalingMultiAZ).

#9369 (comment)

Co-authored-by: Jacob Winch <[email protected]>
@ioannakok ioannakok force-pushed the mob/reduce-min-instances branch from 7c20146 to 5eb07b1 Compare November 1, 2023 09:43
@ioannakok ioannakok changed the title Decrease minCapacity of instances to 25 Decrease minCapacity of instances to 27 Nov 1, 2023
@ioannakok
Copy link
Contributor Author

Any thoughts from @guardian/devx-reliability on this?

I agree that it makes sense to experiment with the minimum capacity here 👍

IIUC we are unsure exactly how low we can set the minimum without impacting users? However, we know that the cost of deploying this type of change is very low, so I would be tempted to drop the capacity in groups of 31 and monitor at each stage using the metrics that you've suggested (stopping somewhere before we get to 15 where there are known problems!).

I think it'd also be worth documenting the cost saving per month that we achieve for each capacity reduction to help to prioritise how far we want to push this experimentation.

Footnotes

  1. I would normally modify ASG capacity in multiples of 3 (so that AWS can evenly distribute across Availability Zones), but I don't know if it's strictly necessary to have an identical number of instances in each AZ.

Thanks for the review @jacobwinch! That all makes perfect sense 👍 I have set minCapacity to 27.

@ioannakok ioannakok merged commit ac284b7 into main Nov 1, 2023
22 checks passed
@ioannakok ioannakok deleted the mob/reduce-min-instances branch November 1, 2023 12:01
@ioannakok
Copy link
Contributor Author

ioannakok commented Nov 1, 2023

Deployed at 12:41. ASG has reduced desired and minimum.

image

@ioannakok ioannakok mentioned this pull request Nov 1, 2023
@ioannakok
Copy link
Contributor Author

ioannakok commented Nov 6, 2023

After this change we've noticed:

  • An increase in CPU utilisation

image

  • No significant changes in Latency and 5xx errors

image

We will check again at the end of the month and compare with October to have a better view of the impact.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dotcom-rendering run_chromatic Runs chromatic when label is applied
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants