CINXE.COM

<!doctype html><html lang="en"><head><title data-rh="true">Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue | by Mengying Li | Coursera Engineering | Medium</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2023-03-22T18:15:55.193Z"/><meta data-rh="true" name="title" content="Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue | by Mengying Li | Coursera Engineering | Medium"/><meta data-rh="true" property="og:title" content="Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue"/><meta data-rh="true" property="al:android:url" content="medium://p/9cd6e8ac8b5c"/><meta data-rh="true" property="al:ios:url" content="medium://p/9cd6e8ac8b5c"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="We all know feel the pain when trying to choose the right instance size for AWS RDS (Amazon Relational Database Service) instance. There are so many instance types optimized to fit different use…"/><meta data-rh="true" property="og:description" content="We all know feel the pain when trying to choose the right instance size for AWS RDS (Amazon Relational Database Service) instance. There…"/><meta data-rh="true" property="og:url" content="https://medium.com/coursera-engineering/two-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c"/><meta data-rh="true" property="al:web:url" content="https://medium.com/coursera-engineering/two-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/resize:fit:1200/1*V5jIIMbkBZtKUDdI_URQwg.png"/><meta data-rh="true" property="article:author" content="https://mengying-li.medium.com"/><meta data-rh="true" name="author" content="Mengying Li"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue"/><meta data-rh="true" name="twitter:site" content="@CourseraEng"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/9cd6e8ac8b5c"/><meta data-rh="true" property="twitter:description" content="We all know feel the pain when trying to choose the right instance size for AWS RDS (Amazon Relational Database Service) instance. There…"/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/resize:fit:1200/1*V5jIIMbkBZtKUDdI_URQwg.png"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="11 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" rel="preconnect" href="https://glyph.medium.com" crossOrigin=""/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://mengying-li.medium.com"/><link data-rh="true" rel="canonical" href="https://medium.com/coursera-engineering/two-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/9cd6e8ac8b5c"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1200\u002F1*V5jIIMbkBZtKUDdI_URQwg.png"],"url":"https:\u002F\u002Fmedium.com\u002Fcoursera-engineering\u002Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c","dateCreated":"2023-01-03T02:41:16.343Z","datePublished":"2023-01-03T02:41:16.343Z","dateModified":"2024-07-23T00:02:19.524Z","headline":"Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue","name":"Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue","description":"We all know feel the pain when trying to choose the right instance size for AWS RDS (Amazon Relational Database Service) instance. There are so many instance types optimized to fit different use…","identifier":"9cd6e8ac8b5c","author":{"@type":"Person","name":"Mengying Li","url":"https:\u002F\u002Fmengying-li.medium.com"},"creator":["Mengying Li"],"publisher":{"@type":"Organization","name":"Coursera Engineering","url":"https:\u002F\u002Fmedium.com\u002Fcoursera-engineering","logo":{"@type":"ImageObject","width":422,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:844\u002F1*zXjOKA4JKHH04Ipi2NI0jA.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002Fcoursera-engineering\u002Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c"}</script><style type="text/css" data-fela-rehydration="565" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="565" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(99, 136, 191, 1)}.es{border-color:rgba(99, 136, 191, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(99, 136, 191, 1)}.ez:disabled:hover{border-color:rgba(99, 136, 191, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.ia{align-items:baseline}.ib{width:48px}.ic{height:48px}.id{border:2px solid rgba(255, 255, 255, 1)}.ie{z-index:0}.if{box-shadow:none}.ig{border:1px solid rgba(0, 0, 0, 0.05)}.ih{margin-left:-12px}.ii{width:28px}.ij{height:28px}.ik{z-index:1}.il{width:24px}.im{margin-bottom:2px}.in{flex-wrap:nowrap}.io{font-size:16px}.ip{line-height:24px}.ir{margin:0 8px}.is{display:inline}.it{color:rgba(99, 136, 191, 1)}.iu{fill:rgba(99, 136, 191, 1)}.ix{flex:0 0 auto}.ja{flex-wrap:wrap}.jb{white-space:pre-wrap}.jc{margin-right:4px}.jd{overflow:hidden}.je{max-height:20px}.jf{text-overflow:ellipsis}.jg{display:-webkit-box}.jh{-webkit-line-clamp:1}.ji{-webkit-box-orient:vertical}.jj{word-break:break-all}.jl{padding-left:8px}.jm{padding-right:8px}.kn> *{flex-shrink:0}.ko{overflow-x:scroll}.kp::-webkit-scrollbar{display:none}.kq{scrollbar-width:none}.kr{-ms-overflow-style:none}.ks{width:74px}.kt{flex-direction:row}.ku{z-index:2}.kx{-webkit-user-select:none}.ky{border:0}.kz{fill:rgba(117, 117, 117, 1)}.lc{outline:0}.ld{user-select:none}.le> svg{pointer-events:none}.ln{cursor:progress}.lo{margin-left:4px}.lp{margin-top:0px}.lq{opacity:1}.lr{padding:4px 0}.lu{width:16px}.lw{display:inline-flex}.mc{max-width:100%}.md{padding:8px 2px}.me svg{color:#6B6B6B}.mv{margin-left:auto}.mw{margin-right:auto}.mx{max-width:1200px}.nd{clear:both}.nf{cursor:zoom-in}.ng{z-index:auto}.ni{height:auto}.nj{line-height:1.58}.nk{letter-spacing:-0.004em}.nl{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.og{margin-bottom:-0.46em}.oh{text-decoration:underline}.oi{box-shadow:inset 3px 0 0 0 #242424}.oj{padding-left:23px}.ok{margin-left:-20px}.ol{font-style:italic}.om{line-height:1.18}.on{letter-spacing:-0.022em}.oo{font-weight:600}.pe{margin-bottom:-0.31em}.pk{list-style-type:disc}.pl{margin-left:30px}.pm{padding-left:0px}.ps{line-height:1.12}.ql{margin-bottom:-0.28em}.qm{max-width:908px}.qs{margin-top:10px}.qt{max-width:728px}.qw{list-style-type:decimal}.qx{max-width:1388px}.qy{max-width:1034px}.qz{max-width:3024px}.ra{border-top:none}.rb{margin-bottom:50px}.rc{height:52px}.rd{max-height:52px}.re{box-sizing:content-box}.rf{position:static}.rh{max-width:155px}.rn{margin-right:20px}.ro{margin-bottom:64px}.rp{margin-bottom:48px}.sd{border-radius:2px}.sf{height:64px}.sg{width:64px}.sh{align-self:flex-end}.si{flex:1 1 auto}.so{padding-right:4px}.sp{font-weight:500}.sw{margin-top:8px}.sx{margin-top:16px}.sy{color:rgba(255, 255, 255, 1)}.sz{padding:8px 16px}.ta{fill:rgba(255, 255, 255, 1)}.tb{background:rgba(25, 25, 25, 1)}.tc{border-color:rgba(25, 25, 25, 1)}.tf:disabled{opacity:0.1}.tg:disabled:hover{background:rgba(25, 25, 25, 1)}.th:disabled:hover{border-color:rgba(25, 25, 25, 1)}.tn{height:0px}.to{gap:18px}.tp{fill:rgba(61, 61, 61, 1)}.tr{padding-bottom:6px}.ts{border-bottom:1px solid #F2F2F2}.ty{margin-top:32px}.tz{fill:#242424}.ua{background:0}.ub{border-color:#242424}.uc:disabled:hover{color:#242424}.ud:disabled:hover{fill:#242424}.ue:disabled:hover{border-color:#242424}.up{border-bottom:solid 1px #E5E5E5}.uq{margin-top:72px}.ur{padding:24px 0}.us{margin-bottom:0px}.ut{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:rgba(87, 117, 161, 1)}.eu:hover{border-color:rgba(87, 117, 161, 1)}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.iq:hover{text-decoration:underline}.iv:hover:not(:disabled){color:rgba(87, 117, 161, 1)}.iw:hover:not(:disabled){fill:rgba(87, 117, 161, 1)}.lb:hover{fill:rgba(8, 8, 8, 1)}.ls:hover{fill:#000000}.lt:hover p{color:#000000}.lv:hover{color:#000000}.mf:hover svg{color:#000000}.se:hover{background-color:none}.td:hover{background:#000000}.te:hover{border-color:#242424}.tq:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.la:focus{fill:rgba(8, 8, 8, 1)}.mg:focus svg{color:#000000}.nh:focus{transform:scale(1.01)}.lf:active{border-style:none}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:50px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1.19em}.hs{margin-bottom:32px}.ht{line-height:52px}.hu{letter-spacing:-0.011em}.hz{align-items:center}.jz{border-top:solid 1px #F2F2F2}.ka{border-bottom:solid 1px #F2F2F2}.kb{margin:32px 0 0}.kc{padding:3px 8px}.kl> *{margin-right:24px}.km> :last-child{margin-right:0}.lm{margin-top:0px}.mb{margin:0}.nc{margin-top:40px}.oc{font-size:20px}.od{margin-top:2.14em}.oe{line-height:32px}.of{letter-spacing:-0.003em}.pb{margin-top:1.72em}.pc{line-height:24px}.pd{letter-spacing:0}.pj{margin-top:0.94em}.pr{margin-top:1.14em}.qh{font-size:24px}.qi{margin-top:1.95em}.qj{line-height:30px}.qk{letter-spacing:-0.016em}.qr{margin-top:56px}.rm{display:inline-block}.rq{flex-direction:row}.rt{margin-bottom:0}.ru{margin-right:20px}.sj{max-width:500px}.tm{margin-bottom:88px}.tx{margin:40px 0 16px}.uj{width:min-width}.uo{padding-top:72px}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.ll{margin-top:0px}.qu{margin-left:auto}.qv{text-align:center}.rl{display:inline-block}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.lk{margin-top:0px}.rk{display:inline-block}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.li{margin-top:0px}.lj{margin-right:0px}.rj{display:inline-block}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:2px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{margin-bottom:24px}.gz{line-height:38px}.ha{letter-spacing:-0.014em}.hv{align-items:flex-start}.iy{flex-direction:column}.jn{margin:24px -24px 0}.jo{padding:0}.kd> *{margin-right:8px}.ke> :last-child{margin-right:24px}.kv{margin-left:0px}.lg{margin-top:0px}.lh{margin-right:0px}.lx{margin:0}.mh{border:1px solid #F2F2F2}.mi{border-radius:99em}.mj{padding:0px 16px 0px 12px}.mk{height:38px}.ml{align-items:center}.mn svg{margin-right:8px}.my{margin-top:32px}.nm{font-size:18px}.nn{margin-top:1.56em}.no{line-height:28px}.np{letter-spacing:-0.003em}.op{font-size:16px}.oq{margin-top:1.23em}.or{letter-spacing:0}.pf{margin-top:0.67em}.pn{margin-top:1.34em}.pt{font-size:20px}.pu{margin-top:1.2em}.pv{line-height:24px}.qn{margin-top:40px}.ri{display:inline-block}.sb{margin-bottom:20px}.sc{margin-right:0}.sn{max-width:100%}.sq{font-size:24px}.sr{line-height:30px}.ss{letter-spacing:-0.016em}.ti{margin-bottom:64px}.tt{margin:32px 0 16px}.uf{width:100%}.uk{padding-top:48px}.mm:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:50px}.gb{max-width:680px}.hl{font-size:42px}.hm{margin-top:1.19em}.hn{margin-bottom:32px}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.hy{align-items:center}.jv{border-top:solid 1px #F2F2F2}.jw{border-bottom:solid 1px #F2F2F2}.jx{margin:32px 0 0}.jy{padding:3px 8px}.kj> *{margin-right:24px}.kk> :last-child{margin-right:0}.ma{margin:0}.nb{margin-top:40px}.ny{font-size:20px}.nz{margin-top:2.14em}.oa{line-height:32px}.ob{letter-spacing:-0.003em}.oy{margin-top:1.72em}.oz{line-height:24px}.pa{letter-spacing:0}.pi{margin-top:0.94em}.pq{margin-top:1.14em}.qd{font-size:24px}.qe{margin-top:1.95em}.qf{line-height:30px}.qg{letter-spacing:-0.016em}.qq{margin-top:56px}.rr{flex-direction:row}.rv{margin-bottom:0}.rw{margin-right:20px}.sk{max-width:500px}.tl{margin-bottom:88px}.tw{margin:40px 0 16px}.ui{width:min-width}.un{padding-top:72px}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:50px}.ga{max-width:680px}.hg{font-size:42px}.hh{margin-top:1.19em}.hi{margin-bottom:32px}.hj{line-height:52px}.hk{letter-spacing:-0.011em}.hx{align-items:center}.jr{border-top:solid 1px #F2F2F2}.js{border-bottom:solid 1px #F2F2F2}.jt{margin:32px 0 0}.ju{padding:3px 8px}.kh> *{margin-right:24px}.ki> :last-child{margin-right:0}.lz{margin:0}.na{margin-top:40px}.nu{font-size:20px}.nv{margin-top:2.14em}.nw{line-height:32px}.nx{letter-spacing:-0.003em}.ov{margin-top:1.72em}.ow{line-height:24px}.ox{letter-spacing:0}.ph{margin-top:0.94em}.pp{margin-top:1.14em}.pz{font-size:24px}.qa{margin-top:1.95em}.qb{line-height:30px}.qc{letter-spacing:-0.016em}.qp{margin-top:56px}.rs{flex-direction:row}.rx{margin-bottom:0}.ry{margin-right:20px}.sl{max-width:500px}.tk{margin-bottom:88px}.tv{margin:40px 0 16px}.uh{width:min-width}.um{padding-top:72px}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:2px}.hb{font-size:32px}.hc{margin-top:1.01em}.hd{margin-bottom:24px}.he{line-height:38px}.hf{letter-spacing:-0.014em}.hw{align-items:flex-start}.iz{flex-direction:column}.jp{margin:24px 0 0}.jq{padding:0}.kf> *{margin-right:8px}.kg> :last-child{margin-right:8px}.kw{margin-left:0px}.ly{margin:0}.mo{border:1px solid #F2F2F2}.mp{border-radius:99em}.mq{padding:0px 16px 0px 12px}.mr{height:38px}.ms{align-items:center}.mu svg{margin-right:8px}.mz{margin-top:32px}.nq{font-size:18px}.nr{margin-top:1.56em}.ns{line-height:28px}.nt{letter-spacing:-0.003em}.os{font-size:16px}.ot{margin-top:1.23em}.ou{letter-spacing:0}.pg{margin-top:0.67em}.po{margin-top:1.34em}.pw{font-size:20px}.px{margin-top:1.2em}.py{line-height:24px}.qo{margin-top:40px}.rz{margin-bottom:20px}.sa{margin-right:0}.sm{max-width:100%}.st{font-size:24px}.su{line-height:30px}.sv{letter-spacing:-0.016em}.tj{margin-bottom:64px}.tu{margin:32px 0 16px}.ug{width:100%}.ul{padding-top:48px}.mt:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="print">.rg{display:none}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jk{max-height:none}</style><style type="text/css" data-fela-rehydration="565" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.ne{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F9cd6e8ac8b5c&amp;%7Efeature=LoOpenInAppButton&amp;%7Echannel=ShowPostUnderCollection&amp;source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" rel="noopener follow" href="/?source=---top_nav_layout_nav-----------------------------------------"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" rel="noopener follow" href="/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnew-story&amp;source=---top_nav_layout_nav-----------------------new_post_topnav------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" rel="noopener follow" href="/search?source=---top_nav_layout_nav-----------------------------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="b800" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu bk" data-testid="storyTitle">Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue</h1><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="hv hw hx hy hz ab"><div><div class="ab ia"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@mengying-li?source=post_page---byline--9cd6e8ac8b5c---------------------------------------"><div class="l ib ic by id ie"><div class="l fj"><img alt="Mengying Li" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/1*OSkgz1_TZgSIGVJwXI7dQg.jpeg" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="if by l dd de fs n ig ft"></div></div></div></a></div></div><div class="ih ab fj"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/coursera-engineering?source=post_page---byline--9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><div class="l ii ij by id ik"><div class="l fj"><img alt="Coursera Engineering" class="l fd by br il cx" src="https://miro.medium.com/v2/resize:fill:48:48/1*j2vLJO9qZg435iRYfd2Mfg.png" width="24" height="24" loading="lazy" data-testid="publicationPhoto"/><div class="if by l br il fs n ig ft"></div></div></div></a></div></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="im ab q"><div class="ab q in"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b io ip bk"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" data-testid="authorName" rel="noopener follow" href="/@mengying-li?source=post_page---byline--9cd6e8ac8b5c---------------------------------------">Mengying Li</a></p></div></div></div><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b io ip du"><span><a class="it iu ah ai aj ak al am an ao ap aq ar ex iv iw" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Fdbd909ab7ead&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;user=Mengying+Li&amp;userId=dbd909ab7ead&amp;source=post_page-dbd909ab7ead--byline--9cd6e8ac8b5c---------------------post_header------------------">Follow</a></span></p></div></div></span></div></div><div class="l ix"><span class="bf b bg z du"><div class="ab cn iy iz ja"><div class="fu fv ab"><div class="bf b bg z du ab jb"><span class="jc l ix">Published in</span><div><div class="l" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar iq ab q" data-testid="publicationName" href="https://medium.com/coursera-engineering?source=post_page---byline--9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><p class="bf b bg z jd je jf jg jh ji jj jk bk">Coursera Engineering</p></a></div></div></div><div class="h k"><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span></div></div><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">11 min read</span><div class="jl jm l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">Jan 3, 2023</span></div></span></div></span></div></div></div><div class="ab cp jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc"><div class="h k w fg fh q"><div class="ks l"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fcoursera-engineering%2F9cd6e8ac8b5c&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;user=Mengying+Li&amp;userId=dbd909ab7ead&amp;source=---header_actions--9cd6e8ac8b5c---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao ky lq lr ab q fk ls lt" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lp"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b dv z du"><span class="pw-responses-count lo lp">6</span></p></button></div></div></div><div class="ab q kd ke kf kg kh ki kj kk kl km kn ko kp kq kr"><div class="lu k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F9cd6e8ac8b5c&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;source=---header_actions--9cd6e8ac8b5c---------------------bookmark_footer------------------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lv" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd lw cn"><div class="l ae"><div class="ab cb"><div class="lx ly lz ma mb mc ci bh"><div class="ab"><div class="bm" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al md an ao ap ex me mf lt mg mh mi mj mk s ml mm mn mo mp mq mr u ms mt mu"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al md an ao ap ex me mf lt mg mh mi mj mk s ml mm mn mo mp mq mr u ms mt mu"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><figure class="my mz na nb nc nd mv mw paragraph-image"><div role="button" tabindex="0" class="ne nf fj ng bh nh"><div class="mv mw mx"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*V5jIIMbkBZtKUDdI_URQwg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*V5jIIMbkBZtKUDdI_URQwg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*V5jIIMbkBZtKUDdI_URQwg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*V5jIIMbkBZtKUDdI_URQwg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*V5jIIMbkBZtKUDdI_URQwg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*V5jIIMbkBZtKUDdI_URQwg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*V5jIIMbkBZtKUDdI_URQwg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*V5jIIMbkBZtKUDdI_URQwg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*V5jIIMbkBZtKUDdI_URQwg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*V5jIIMbkBZtKUDdI_URQwg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*V5jIIMbkBZtKUDdI_URQwg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*V5jIIMbkBZtKUDdI_URQwg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*V5jIIMbkBZtKUDdI_URQwg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*V5jIIMbkBZtKUDdI_URQwg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mc ni c" width="700" height="277" loading="eager" role="presentation"/></picture></div></div></figure><p id="7084" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">We all know feel the pain when trying to choose the right instance size for AWS RDS (Amazon Relational Database Service) instance. There are so many <a class="af oh" href="https://aws.amazon.com/rds/instance-types/" rel="noopener ugc nofollow" target="_blank">instance types</a> optimized to fit different use case. And within each type, there are wide variety of sizes to choose from like large, xlarge, 2xlarge, 4xlarge etc. You definitely don’t want to over provision and waste tons of money. At the same time, if you choose a database instance size that is too small, your bottleneck limitations can cause many outages or performance regressions that heavily impact your availability and latency.</p><blockquote class="oi oj ok"><p id="3a5b" class="nj nk ol nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">Choosing the right size for your AWS RDS instances is an art.</p></blockquote><h2 id="394a" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">Some metrics you should keep an eye…</h2><p id="028e" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">Here I’m going to combine my own experience with AWS official recommendation for <a class="af oh" href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html" rel="noopener ugc nofollow" target="_blank">best practice for Amazon RDS</a> to give some key point matrix for you to better understand your database performance and help you identify if you are hitting any sort of limitations. For each database of different size, there are different limitations for everything. Hitting any limit could become your bottleneck and affect your performance.</p><ul class=""><li id="f13d" class="nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og pk pl pm bk"><strong class="nl gv">CPU Utilization</strong> —<em class="ol"> Percentage of computer processing capacity used.</em></li></ul><p id="87e0" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">If at any point of time, your max CPU utilization on any database instance exceed 75%, this is definitely a sign that you should scale up to more instance (horizontal scaling). If this is a one writer, multiple readers architecture and your writer instance’s CPU utilization is sometimes above 75%, this is a sign calling for larger instance size (vertical scaling) .</p><ul class=""><li id="05c9" class="nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og pk pl pm bk"><strong class="nl gv">Average Active Sessions (AAS) — </strong><em class="ol">An active session is a database connection that has submitted a request to the database but has not yet received the response.</em></li></ul><p id="0d55" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">Measuring the average number of active concurrent sessions over time provides a clear picture of the load on the database. If AAS number exceed the number of virtual CPU of this instance, then it indicates your database instance is overloaded. More detailed information regarding understanding AAS can be found <a class="af oh" href="https://aws.amazon.com/blogs/database/analyzing-amazon-rds-database-workload-with-performance-insights/" rel="noopener ugc nofollow" target="_blank">here</a>.</p><ul class=""><li id="5597" class="nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og pk pl pm bk"><strong class="nl gv">Freeable Memory</strong> — <em class="ol">How much RAM is available on the DB instance, in megabytes.</em></li></ul><p id="972b" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">The red line in the Monitoring tab metrics is marked at 75% for CPU, Memory and Storage Metrics. If instance memory consumption frequently crosses that line, then this indicates that you should check your workload or upgrade your instance.</p><ul class=""><li id="9cc3" class="nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og pk pl pm bk"><strong class="nl gv">Read Throughput, Write Throughput</strong> — <em class="ol">The average number of megabytes read from or written to disk per second.</em></li><li id="aed6" class="nj nk gu nl b nm pn no np nq po ns nt nu pp nw nx ny pq oa ob oc pr oe of og pk pl pm bk"><strong class="nl gv">Network Receive Throughput, Network Transmit Throughput</strong> —<em class="ol"> The rate of network traffic to and from the DB instance in bytes per second.</em></li><li id="2d49" class="nj nk gu nl b nm pn no np nq po ns nt nu pp nw nx ny pq oa ob oc pr oe of og pk pl pm bk"><strong class="nl gv">DB Connections </strong>—<em class="ol"> The number of client sessions that are connected to the DB instance.</em></li></ul><p id="da00" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">Though, if you are asking me, you can read all the documentations in the world, yet you can’t confidently choose what is the correct size for your current database load without actually trying it out. This part is especially true when you are downsizing from an under utilized large database instance. How can you say with confidence that the downsizing will not give you any performance regression? Similarly, how can you say with confidence that upsizing will bring you a much better performance? More importantly, which instance is the right target instance for your downsizing or upsizing?</p><p id="fafd" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">To answer these hard questions, I’m going to break down these question and give you some practical solution to help you load test properly so that you can confidently draw your own conclusion for your case.</p><h1 id="3f75" class="ps on gu bf oo pt pu pv or pw px py ou pz qa qb qc qd qe qf qg qh qi qj qk ql bk">How to load test reading traffic on different instance size</h1><p id="8d12" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">Traditionally, database take both reading and writing traffic. If your database has a separation of reader and writer instances (e.g. Amazon Aurora Database), and currently has multiple reader instances with <a class="af oh" href="https://docs.aws.amazon.com/whitepapers/latest/amazon-aurora-mysql-db-admin-handbook/load-balancing-with-the-reader-endpoint.html" rel="noopener ugc nofollow" target="_blank">round robin load balancing traffic to each reader instance</a>, you can easily test out the current load’s performance on a different instance size by spinning up an extra reader instance with target size and terminate an old reader instance.</p><p id="e7b4" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">With the AWS build in metrics, you can easily check if the load for the current traffic is too little or too much for the new instance size. Though you need to execute with precaution using this method. Since this is load test on a production traffic, this is less ideal compared to some other methods (you can imagine many reason not to do so ahah). Take AWS Aurora database as an example, you need to make sure not to leave mixed instance size for too long. This is<a class="af oh" href="https://stackoverflow.com/questions/66926328/do-aws-rds-cluster-instances-need-to-be-the-same-size" rel="noopener ugc nofollow" target="_blank"> not recommended</a> by AWS due to the automatic writer failover mechanism of Aurora database. Also you need to make sure to set the failover priority to lower so that it won’t be selected as the new writer instance if anything bad happened to the writer.</p><h1 id="191d" class="ps on gu bf oo pt pu pv or pw px py ou pz qa qb qc qd qe qf qg qh qi qj qk ql bk">How to load test writing traffic on different instance size</h1><p id="7efb" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">Load test writing traffic on a difference instance size is where most people is mainly stressed about when talking about database rightsizing. One obvious way to do load test is to write some load test and set up the infrastructure to see the performance difference on two database with different instance size — one the same size with production and another one with target instance where you would like to upsizing or downsizing too. While this is all great, writing load test and setting up the load testing infrastructure is no easy work for an engineer. It requires in depth knowledge for use case of the database to set up proper sql statements that you are testing on to generate similar load from production and it requires many infra knowledge to set up the load test environment properly.</p><p id="eba3" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">Here, I would like to talk about two methods that can help you to do a shallow load test by mirroring production traffic with a lot less work to set up compare to writing your own load test. I recently used both method for load test for two different databases and I would love to share my experience as an inspiration for how you can easily load test your database and find the right size for your database.</p><h1 id="f11f" class="ps on gu bf oo pt pu pv or pw px py ou pz qa qb qc qd qe qf qg qh qi qj qk ql bk">Method 1: Use envoy to do request mirroring</h1><p id="6104" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">Here’s some background information for folks who might be new to envoy or envoy request mirroring.</p><h2 id="679e" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">What is Envoy?</h2><blockquote class="oi oj ok"><p id="b989" class="nj nk ol nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">E<a class="af oh" href="https://www.envoyproxy.io/" rel="noopener ugc nofollow" target="_blank">nvoy</a> is an open source edge and service proxy, designed for cloud-native applications.</p></blockquote><h2 id="2673" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">What is request mirroring?</h2><p id="0954" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">Request mirroring (also called shadowing, shadow mirroring) is when production traffic is mirrored to destination cluster of a developer’s choosing. Shadowing production traffic allow us to test the production traffic on a test instance (in our case a test database) to get accurate comparison and understand how the test instance behave under the same load without affecting end clients in any way. This can help us to make risky changes with higher confidence and validate the test instance before pushing it to production.</p><h2 id="5811" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">Is this the right choice for you?</h2><p id="d518" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">If you use envoy as a proxy in your current infrastructure and all your database request comes from your client side request, using envoy to do request mirroring is the perfect method for you. Allow me to elaborate with a picture.</p><figure class="qn qo qp qq qr nd mv mw paragraph-image"><div role="button" tabindex="0" class="ne nf fj ng bh nh"><div class="mv mw qm"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*FqzCqtd6GDMHqCBpg8Bp0A.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*FqzCqtd6GDMHqCBpg8Bp0A.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*FqzCqtd6GDMHqCBpg8Bp0A.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*FqzCqtd6GDMHqCBpg8Bp0A.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*FqzCqtd6GDMHqCBpg8Bp0A.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*FqzCqtd6GDMHqCBpg8Bp0A.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*FqzCqtd6GDMHqCBpg8Bp0A.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*FqzCqtd6GDMHqCBpg8Bp0A.png 640w, https://miro.medium.com/v2/resize:fit:720/1*FqzCqtd6GDMHqCBpg8Bp0A.png 720w, https://miro.medium.com/v2/resize:fit:750/1*FqzCqtd6GDMHqCBpg8Bp0A.png 750w, https://miro.medium.com/v2/resize:fit:786/1*FqzCqtd6GDMHqCBpg8Bp0A.png 786w, https://miro.medium.com/v2/resize:fit:828/1*FqzCqtd6GDMHqCBpg8Bp0A.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*FqzCqtd6GDMHqCBpg8Bp0A.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*FqzCqtd6GDMHqCBpg8Bp0A.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mc ni c" width="700" height="534" loading="lazy" role="presentation"/></picture></div></div><figcaption class="qs ff qt mv mw qu qv bf b bg z du">Note: Clone Database is set to the target size we want to upsize or downsize to verify how the traffic load behaves on this database instance size</figcaption></figure><p id="57be" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">As you can see from the <a class="af oh" href="http://envoyproxy.io/docs/envoy/latest/start/sandboxes/route-mirror.html?highlight=request+mirroring" rel="noopener ugc nofollow" target="_blank">envoy documentation</a>, envoy provides you powerful features like request mirroring to easily load test your database. All you need to do is do change your envoy configuration file and have it also do mirrored request to your clone application. After you set up the clone application and prod load test clone database, make sure your clone application point to the DNS of your prod load test clone database, then you are ready to go. Just leverage envoy request mirroring feature and change the envoy configuration, and voila, your envoy will make sure to send a copy of the same http request to your clone application automatically. You can wait and observe how the same load performs on your load test database, if there is any unexpected longer latency or any triggered warning. If everything looks good, you have successfully choose the right target instance size. If not, you can always repeat by changing your load test database size and repeat the same process until you are happy with the result.</p><h2 id="a4f8" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">Advantages:</h2><p id="e953" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">This practice is very safe using the mechanism of fire and forget traffic from envoy. Particularly there’s a clone service that is in charge of sending the database traffic towards the load test clone database, you will not affect the production service by giving it extra load like firing a request mirroring traffic from the production service. This clear separation between the load test service and load test database provides an isolated safe environment for you to perform request mirroring without affecting the production traffic.</p><h2 id="0905" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">Some precautions:</h2><ol class=""><li id="93f3" class="nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og qw pl pm bk">Make sure the clone application have the same set up as production application. Otherwise you introduced more variables to the load test and it will be harder to draw conclusion from two tests performed with different set up.</li><li id="11ee" class="nj nk gu nl b nm pn no np nq po ns nt nu pp nw nx ny pq oa ob oc pr oe of og qw pl pm bk">Make sure the clone application is linked to the clone load test database endpoint. You never want to mess up with your production database (<a class="af oh" href="https://thorben-janssen.com/dual-writes/" rel="noopener ugc nofollow" target="_blank">danger of double write</a>). If your application writes to more than one database (include some database you don’t want to perform rightsizing), then redirect the other database endpoint to some invalid ones is one way to avoid double write to those databases. However, if there’s retry for failed database read or write, this will affect the latency looking from the clone service side as well so keep it in mind when interpreting the load test result.</li><li id="3f2a" class="nj nk gu nl b nm pn no np nq po ns nt nu pp nw nx ny pq oa ob oc pr oe of og qw pl pm bk">I would also like to point out with the current micro-service architecture, your service might have some downstream service that it is calling. That downstream service might write to other database. So be careful with that, or you might introduce double write to other database of your downstream service. You can identify downstream service and write some code in the clone service to not send traffic to the downstream service. For a monolith, there’s no worries on this aspect. So envoy request mirroring can be ideal for load test on a monolith service or a service with no downstream services.</li></ol><h1 id="de40" class="ps on gu bf oo pt pu pv or pw px py ou pz qa qb qc qd qe qf qg qh qi qj qk ql bk">Method 2: Use ProxySQL to do request mirroring for SQL traffic</h1><p id="296d" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">If your current infrastructure doesn’t support you to use envoy request mirroring, here’s a second option that might give you more possibility to do request mirroring for your database — use ProxySQL to do request mirroring for sql traffic.</p><p id="9e25" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">As usual, here’s some background information for folks who might be new to ProxySQL or ProxySQL request mirroring.</p><h2 id="913a" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">What is ProxySQL?</h2><blockquote class="oi oj ok"><p id="d6b7" class="nj nk ol nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk"><a class="af oh" href="https://proxysql.com/" rel="noopener ugc nofollow" target="_blank">ProxySQL</a> is an open source high performance, high availability, database protocol aware proxy for MySQL. ProxySQL build complex <strong class="nl gv">ProxySQL Query Rules</strong> to route writes to primaries, distribute reads across replicas and rewrite queries on the fly with highly granular criteria.</p></blockquote><h2 id="a913" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">What is ProxySQL request mirroring?</h2><p id="d0e8" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">Summarizing in my own words, when mirroring feature is enabled through ProxySQL Query Rules, ProxySQL forward the SQL statement to prod database as usual and will also send a copy of the production traffic’s SQL statements to the clone database. ProxySQL request mirroring does not guarantee the order of execution and does not guarantee data consistency. But it is very useful when comparing performance of two database with slight different (for example different MySQL version, or in our case different DB instance size) by sending same read and write SQL statement to two different databases.</p><h2 id="774f" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">Is this the right choice for you?</h2><p id="cf60" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">Different from requests mirroring by envoy, we are leveraging the ProxySQL’s built-in requests mirroring function to send a mirroring sql statement to the load test clone database every time we send a sql statement to production database. This is perfect for when you have multiple micro-services communicating to one database or requests other than http that issue reads and writes to the database (e.g. using kafka to issue sql write statements). You can do requests mirroring through adding a ProxySQL layer in the middle. Just replace the database hostname inside the application configuration to the newly set up ProxySQL hostname, then we can leverage ProxySQL to do requests mirroring. Allow me to elaborate using a picture:</p><figure class="qn qo qp qq qr nd mv mw paragraph-image"><div role="button" tabindex="0" class="ne nf fj ng bh nh"><div class="mv mw qx"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*NVj72Yb-A9kIwxgGu4h-uQ.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*NVj72Yb-A9kIwxgGu4h-uQ.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*NVj72Yb-A9kIwxgGu4h-uQ.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*NVj72Yb-A9kIwxgGu4h-uQ.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*NVj72Yb-A9kIwxgGu4h-uQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVj72Yb-A9kIwxgGu4h-uQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*NVj72Yb-A9kIwxgGu4h-uQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*NVj72Yb-A9kIwxgGu4h-uQ.png 640w, https://miro.medium.com/v2/resize:fit:720/1*NVj72Yb-A9kIwxgGu4h-uQ.png 720w, https://miro.medium.com/v2/resize:fit:750/1*NVj72Yb-A9kIwxgGu4h-uQ.png 750w, https://miro.medium.com/v2/resize:fit:786/1*NVj72Yb-A9kIwxgGu4h-uQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*NVj72Yb-A9kIwxgGu4h-uQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*NVj72Yb-A9kIwxgGu4h-uQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*NVj72Yb-A9kIwxgGu4h-uQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mc ni c" width="700" height="393" loading="lazy" role="presentation"/></picture></div></div></figure><figure class="qn qo qp qq qr nd mv mw paragraph-image"><div role="button" tabindex="0" class="ne nf fj ng bh nh"><div class="mv mw qy"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*4zqK9uUpypnO_O7gZypsTA.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*4zqK9uUpypnO_O7gZypsTA.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*4zqK9uUpypnO_O7gZypsTA.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*4zqK9uUpypnO_O7gZypsTA.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*4zqK9uUpypnO_O7gZypsTA.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*4zqK9uUpypnO_O7gZypsTA.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*4zqK9uUpypnO_O7gZypsTA.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*4zqK9uUpypnO_O7gZypsTA.png 640w, https://miro.medium.com/v2/resize:fit:720/1*4zqK9uUpypnO_O7gZypsTA.png 720w, https://miro.medium.com/v2/resize:fit:750/1*4zqK9uUpypnO_O7gZypsTA.png 750w, https://miro.medium.com/v2/resize:fit:786/1*4zqK9uUpypnO_O7gZypsTA.png 786w, https://miro.medium.com/v2/resize:fit:828/1*4zqK9uUpypnO_O7gZypsTA.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*4zqK9uUpypnO_O7gZypsTA.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*4zqK9uUpypnO_O7gZypsTA.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mc ni c" width="700" height="569" loading="lazy" role="presentation"/></picture></div></div></figure><p id="d68e" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">As shown in the picture, instead of mirroring the http requests to achieve simulating production traffic load, here we are focused on directly mirroring SQL statements by introducing a new proxy layer provided by open source project ProxySQL.</p><h2 id="3588" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">Advantages:</h2><p id="cc51" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">This practice doesn’t have the double write danger as we mentioned in the envoy requests mirroring method since only sql requests are mirrored. Also since all SQL statement going through can be mirrored by ProxySQL, we can cover scenarios where one database’s SQL statement is issued by multiple services or sources (kafka for instance). This is personally my second and only remaining choice when the envoy requests mirroring would not be sufficient.</p><h2 id="b378" class="om on gu bf oo op oq dy or os ot ea ou nu ov ow ox ny oy oz pa oc pb pc pd pe bk">Some precautions:</h2><ol class=""><li id="b667" class="nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og qw pl pm bk">Make sure the set up is done properly when using ProxySQL for request mirroring. As shown in picture, you will need to set up some EC2 machines to run ProxySQL service and then set up the DNS for it before you can shift traffic to this new hostname. Since we are directly shifting production SQL traffic to go through ProxySQL service, it is critical to make sure the set up is correctly. Otherwise, it will cause some down time.</li><li id="4995" class="nj nk gu nl b nm pn no np nq po ns nt nu pp nw nx ny pq oa ob oc pr oe of og qw pl pm bk">Have a mechanism to shift traffic to ProxySQL service gradually. Like I mentioned before, we are adding an extra layer of ProxySQL service between your production service and production database. If we have mechanism to shift traffic smoothly and roll back when things turns wrong, it would be very nice in case things go south.</li><li id="4e47" class="nj nk gu nl b nm pn no np nq po ns nt nu pp nw nx ny pq oa ob oc pr oe of og qw pl pm bk">ProxySQL is a less established open source project compare to envoy. I personally ran into some errors like <a class="af oh" href="https://github.com/sysown/proxysql/issues/3389" rel="noopener ugc nofollow" target="_blank">this one</a> during my own request mirroring process. This blocked me from sending one of the top SQL statement to the load test clone cluster and in result leading to an inaccurate load test result. Great news is that it didn’t block forwarding the traffic to the production database, it just threw warnings when trying to send the mirroring request to the load test clone cluster. So if you are expert on ProxySQL definitely go for it, otherwise there’s some risk running into unsolvable bugs. But like I said, ProxySQL does tackle a more generalized use case where envoy request mirroring couldn’t handle.</li><li id="9512" class="nj nk gu nl b nm pn no np nq po ns nt nu pp nw nx ny pq oa ob oc pr oe of og qw pl pm bk">The extra network hops of ProxySQL might introduce some latency when looking from the service side metrics. If you are only looking at database side metrics this would not add any latency at the database layer. However if you are also evaluating the latency metrics measured from the application side, you might be seeing more latency from introducing one extra ProxySQL service in the networking path. You can always rely on some tracing tool to factor out the time on ProxySQL service. But this requires more patience and precaution when looking at the data.</li></ol><h1 id="66a9" class="ps on gu bf oo pt pu pv or pw px py ou pz qa qb qc qd qe qf qg qh qi qj qk ql bk">Conclusion</h1><p id="0694" class="pw-post-body-paragraph nj nk gu nl b nm pf no np nq pg ns nt nu ph nw nx ny pi oa ob oc pj oe of og gn bk">I’ve stumbled and struggled during my first journey to do load test for rightsizing database instance. I hope that my article will give you some inspirations if you facing similar challenge.</p><p id="21a7" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">Thank you for reading. Please reach out to me in the discussion or on <a class="af oh" href="https://www.linkedin.com/in/mengying-li-madeline/" rel="noopener ugc nofollow" target="_blank">linkedin</a> if you have any thoughts or comments.</p><p id="6493" class="pw-post-body-paragraph nj nk gu nl b nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og gn bk">Happy new year everyone :)</p><figure class="qn qo qp qq qr nd mv mw paragraph-image"><div role="button" tabindex="0" class="ne nf fj ng bh nh"><div class="mv mw qz"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1400/1*iYQIwwHYM2GFgNoAntKiUw.jpeg 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mc ni c" width="700" height="934" loading="lazy" role="presentation"/></picture></div></div><figcaption class="qs ff qt mv mw qu qv bf b bg z du">The new year eve’s firework photo I took</figcaption></figure></div></div></div></div></section></div></div></article></div><div class="l"></div><footer class="ra rb rc rd re ab q rf ik c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp rg"><div class="ab q kt"><div class="rh l"><span class="l ri rj rk e d"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fcoursera-engineering%2F9cd6e8ac8b5c&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;user=Mengying+Li&amp;userId=dbd909ab7ead&amp;source=---footer_actions--9cd6e8ac8b5c---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></span><span class="l h g f rl rm"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fcoursera-engineering%2F9cd6e8ac8b5c&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;user=Mengying+Li&amp;userId=dbd909ab7ead&amp;source=---footer_actions--9cd6e8ac8b5c---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao ky lq lr ab q fk ls lt" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lp"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b bg z du"><span class="pw-responses-count lo lp">6</span></p></button></div></div></div></div><div class="ab q"><div class="rn l ix"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F9cd6e8ac8b5c&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fcoursera-engineering%2Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c&amp;source=---footer_actions--9cd6e8ac8b5c---------------------bookmark_footer------------------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lv" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="rn l ix"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al md an ao ap ex me mf lt mg"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="ro l"><div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="rp l"><div class="ab rq rr rs iz iy"><div class="rt ru rv rw rx ry rz sa sb sc ab cp"><div class="h k"><a href="https://medium.com/coursera-engineering?source=post_page---post_publication_info--9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Coursera Engineering" class="sd ib ic cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*j2vLJO9qZg435iRYfd2Mfg.png" width="48" height="48" loading="lazy"/><div class="sd l ic ib fs n fr se"></div></div></a></div><div class="j i d"><a href="https://medium.com/coursera-engineering?source=post_page---post_publication_info--9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Coursera Engineering" class="sd sg sf cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*j2vLJO9qZg435iRYfd2Mfg.png" width="64" height="64" loading="lazy"/><div class="sd l sf sg fs n fr se"></div></div></a></div><div class="j i d sh ix"><div class="ab"></div></div></div><div class="ab co si"><div class="sj sk sl sm sn l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://medium.com/coursera-engineering?source=post_page---post_publication_info--9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><h2 class="pw-author-name bf sp sq sr ss st su sv nu ow ox ny oz pa oc pc pd bk"><span class="gn so">Published in <!-- -->Coursera Engineering</span></h2></a><div class="sw ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/coursera-engineering/followers?source=post_page---post_publication_info--9cd6e8ac8b5c---------------------------------------">3.8K Followers</a></span></div><div class="bf b bg z du ab jb"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/coursera-engineering/two-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c?source=post_page---post_publication_info--9cd6e8ac8b5c---------------------------------------">Last published <span>Jan 3, 2023</span></a></div></div><div class="sx l"><p class="bf b bg z bk"><span class="gn">We&#x27;re changing the way the world learns! Posts from Coursera engineers and data scientists.</span></p></div></div></div><div class="h k"><div class="ab"></div></div></div></div><div class="ab rq rr rs iz iy"><div class="rt ru rv rw rx ry rz sa sb sc ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@mengying-li?source=post_page---post_author_info--9cd6e8ac8b5c---------------------------------------"><div class="l fj"><img alt="Mengying Li" class="l fd by ic ib cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*OSkgz1_TZgSIGVJwXI7dQg.jpeg" width="48" height="48" loading="lazy"/><div class="fr by l ic ib fs n ay se"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@mengying-li?source=post_page---post_author_info--9cd6e8ac8b5c---------------------------------------"><div class="l fj"><img alt="Mengying Li" class="l fd by sf sg cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*OSkgz1_TZgSIGVJwXI7dQg.jpeg" width="64" height="64" loading="lazy"/><div class="fr by l sf sg fs n ay se"></div></div></a></div><div class="j i d sh ix"><div class="ab"><span><button class="bf b bg z sy sz ta tb tc td te ev ew tf tg th fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co si"><div class="sj sk sl sm sn l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/@mengying-li?source=post_page---post_author_info--9cd6e8ac8b5c---------------------------------------"><h2 class="pw-author-name bf sp sq sr ss st su sv nu ow ox ny oz pa oc pc pd bk"><span class="gn so">Written by <!-- -->Mengying Li</span></h2></a><div class="sw ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/@mengying-li/followers?source=post_page---post_author_info--9cd6e8ac8b5c---------------------------------------">95 Followers</a></span></div><div class="bf b bg z du ab jb"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/@mengying-li/following?source=post_page---post_author_info--9cd6e8ac8b5c---------------------------------------">9 Following</a></div></div><div class="sx l"><p class="bf b bg z bk"><span class="gn">Software Engineer working on Kubernetes and Istio. Contributor or open source project Admiral (Istio)</span></p></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z sy sz ta tb tc td te ev ew tf tg th fa fb fc fd bm fe ff">Follow</button></span></div></div></div></div></div></div></div><div class="ti tj tk tl tm l"><div class="tn bh r ro"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf sp pt pv or pw py ou pz qb qc qd qf qg qh qj qk bk">Responses (<!-- -->6<!-- -->)</h2><div class="ab to"><div><div class="bm" aria-hidden="false"><a class="tp tq" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--9cd6e8ac8b5c---------------------------------------" rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><path fill-rule="evenodd" d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z" clip-rule="evenodd"></path></svg></a></div></div></div></div><div class="tr ts tt tu tv tw tx l"></div><div class="ty l"><button class="bf b bg z bk sz tz ua ub lv ls te ev ew ex uc ud ue fa uf ug uh ui uj fb fc fd bm fe ff">See all responses</button></div></div></div></div><div class="uk ul um un uo l bx"><div class="h k j"><div class="tn bh up uq"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ur ab kt ja"><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/about?autoplay=1&amp;source=post_page-----9cd6e8ac8b5c---------------------------------------"><p class="bf b dv z du">About</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----9cd6e8ac8b5c---------------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="mailto:pressinquiries@medium.com" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="us ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----9cd6e8ac8b5c---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="us l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/business?source=post_page-----9cd6e8ac8b5c---------------------------------------"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20250214-225023-b6ac233ec4"</script><script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"","group":"enabled","tags":["group-edgeCachePosts","post-9cd6e8ac8b5c","user-dbd909ab7ead","collection-532b19e4043c"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"pubFeaturingPostPageLabelEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"DEFAULT","explicit":false},"viewerIsBot":false},"debug":{"requestId":"98fe898d-d078-4151-8e6a-a85730dc7d16","requestTag":"","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-2ab302c3556d5da22d4cde6d1e11857f-6cdd326ad9aeab1f-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002Fcoursera-engineering\u002Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c","host":"medium.com","hostname":"medium.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"","currentHash":""},"config":{"nodeEnv":"production","version":"main-20250214-225023-b6ac233ec4","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20250214-225023-b6ac233ec4","commit":"b6ac233ec4e33c48e304b373b7df8c338a410ef2"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"collectionByDomainOrSlug({\"domainOrSlug\":\"coursera-engineering\"})":{"__ref":"Collection:532b19e4043c"},"postResult({\"id\":\"9cd6e8ac8b5c\"})":{"__ref":"Post:9cd6e8ac8b5c"}},"ImageMetadata:":{"__typename":"ImageMetadata","id":""},"Collection:532b19e4043c":{"__typename":"Collection","id":"532b19e4043c","favicon":{"__ref":"ImageMetadata:"},"customStyleSheet":null,"colorPalette":{"__typename":"ColorPalette","highlightSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FFECF3FF","point":0},{"__typename":"ColorPoint","color":"#FFE8F2FF","point":0.1},{"__typename":"ColorPoint","color":"#FFE5F0FF","point":0.2},{"__typename":"ColorPoint","color":"#FFE1EFFF","point":0.3},{"__typename":"ColorPoint","color":"#FFDDEDFF","point":0.4},{"__typename":"ColorPoint","color":"#FFD9EBFF","point":0.5},{"__typename":"ColorPoint","color":"#FFD6EAFF","point":0.6},{"__typename":"ColorPoint","color":"#FFD2E8FF","point":0.7},{"__typename":"ColorPoint","color":"#FFCEE6FF","point":0.8},{"__typename":"ColorPoint","color":"#FFCAE5FF","point":0.9},{"__typename":"ColorPoint","color":"#FFC6E3FF","point":1}]},"defaultBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FF6388BF","point":0},{"__typename":"ColorPoint","color":"#FF5D7EB0","point":0.1},{"__typename":"ColorPoint","color":"#FF5775A1","point":0.2},{"__typename":"ColorPoint","color":"#FF516B91","point":0.3},{"__typename":"ColorPoint","color":"#FF4A6182","point":0.4},{"__typename":"ColorPoint","color":"#FF435673","point":0.5},{"__typename":"ColorPoint","color":"#FF3C4B63","point":0.6},{"__typename":"ColorPoint","color":"#FF334054","point":0.7},{"__typename":"ColorPoint","color":"#FF2A3444","point":0.8},{"__typename":"ColorPoint","color":"#FF202833","point":0.9},{"__typename":"ColorPoint","color":"#FF151B23","point":1}]},"tintBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FF82A8E1","colorPoints":[{"__typename":"ColorPoint","color":"#FF82A8E1","point":0},{"__typename":"ColorPoint","color":"#FF8FB1E6","point":0.1},{"__typename":"ColorPoint","color":"#FF9CBBEA","point":0.2},{"__typename":"ColorPoint","color":"#FFA8C4EF","point":0.3},{"__typename":"ColorPoint","color":"#FFB4CDF3","point":0.4},{"__typename":"ColorPoint","color":"#FFC0D6F7","point":0.5},{"__typename":"ColorPoint","color":"#FFCCDEFB","point":0.6},{"__typename":"ColorPoint","color":"#FFD8E7FF","point":0.7},{"__typename":"ColorPoint","color":"#FFE3EFFF","point":0.8},{"__typename":"ColorPoint","color":"#FFEFF7FF","point":0.9},{"__typename":"ColorPoint","color":"#FFFAFFFF","point":1}]}},"domain":null,"slug":"coursera-engineering","googleAnalyticsId":null,"name":"Coursera Engineering","avatar":{"__ref":"ImageMetadata:1*j2vLJO9qZg435iRYfd2Mfg.png"},"description":"We're changing the way the world learns! Posts from Coursera engineers and data scientists.","subscriberCount":3814,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:9cd6e8ac8b5c"}]},"isAuroraVisible":false,"tintColor":"#FF82A8E1","newsletterV3":null,"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:532b19e4043c-viewerId:lo_fa61c6ef3ab4"},"twitterUsername":"CourseraEng","facebookPageId":null,"logo":{"__ref":"ImageMetadata:1*zXjOKA4JKHH04Ipi2NI0jA.png"}},"ImageMetadata:1*j2vLJO9qZg435iRYfd2Mfg.png":{"__typename":"ImageMetadata","id":"1*j2vLJO9qZg435iRYfd2Mfg.png"},"User:dbd909ab7ead":{"__typename":"User","id":"dbd909ab7ead","customDomainState":{"__typename":"CustomDomainState","live":{"__typename":"CustomDomain","domain":"mengying-li.medium.com"}},"hasSubdomain":true,"username":"mengying-li","linkedAccounts":{"__ref":"LinkedAccounts:dbd909ab7ead"},"isSuspended":false,"name":"Mengying Li","imageId":"1*OSkgz1_TZgSIGVJwXI7dQg.jpeg","verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":95,"followingCount":8,"collectionFollowingCount":1},"bio":"Software Engineer working on Kubernetes and Istio. Contributor or open source project Admiral (Istio)","membership":null,"allowNotes":true,"viewerEdge":{"__ref":"UserViewerEdge:userId:dbd909ab7ead-viewerId:lo_fa61c6ef3ab4"},"twitterScreenName":""},"Post:9cd6e8ac8b5c":{"__typename":"Post","id":"9cd6e8ac8b5c","firstPublishedAt":1672713676343,"creator":{"__ref":"User:dbd909ab7ead"},"collection":{"__ref":"Collection:532b19e4043c"},"isSeries":false,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fcoursera-engineering\u002Ftwo-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c","sequence":null,"uniqueSlug":"two-easy-ways-to-determine-right-size-for-aws-rds-instance-through-request-mirroring-load-test-9cd6e8ac8b5c","content({\"postMeteringOptions\":{\"referrer\":\"\"}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"b869","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:e4991645d83_0"},{"__ref":"Paragraph:e4991645d83_1"},{"__ref":"Paragraph:e4991645d83_2"},{"__ref":"Paragraph:e4991645d83_3"},{"__ref":"Paragraph:e4991645d83_4"},{"__ref":"Paragraph:e4991645d83_5"},{"__ref":"Paragraph:e4991645d83_6"},{"__ref":"Paragraph:e4991645d83_7"},{"__ref":"Paragraph:e4991645d83_8"},{"__ref":"Paragraph:e4991645d83_9"},{"__ref":"Paragraph:e4991645d83_10"},{"__ref":"Paragraph:e4991645d83_11"},{"__ref":"Paragraph:e4991645d83_12"},{"__ref":"Paragraph:e4991645d83_13"},{"__ref":"Paragraph:e4991645d83_14"},{"__ref":"Paragraph:e4991645d83_15"},{"__ref":"Paragraph:e4991645d83_16"},{"__ref":"Paragraph:e4991645d83_17"},{"__ref":"Paragraph:e4991645d83_18"},{"__ref":"Paragraph:e4991645d83_19"},{"__ref":"Paragraph:e4991645d83_20"},{"__ref":"Paragraph:e4991645d83_21"},{"__ref":"Paragraph:e4991645d83_22"},{"__ref":"Paragraph:e4991645d83_23"},{"__ref":"Paragraph:e4991645d83_24"},{"__ref":"Paragraph:e4991645d83_25"},{"__ref":"Paragraph:e4991645d83_26"},{"__ref":"Paragraph:e4991645d83_27"},{"__ref":"Paragraph:e4991645d83_28"},{"__ref":"Paragraph:e4991645d83_29"},{"__ref":"Paragraph:e4991645d83_30"},{"__ref":"Paragraph:e4991645d83_31"},{"__ref":"Paragraph:e4991645d83_32"},{"__ref":"Paragraph:e4991645d83_33"},{"__ref":"Paragraph:e4991645d83_34"},{"__ref":"Paragraph:e4991645d83_35"},{"__ref":"Paragraph:e4991645d83_36"},{"__ref":"Paragraph:e4991645d83_37"},{"__ref":"Paragraph:e4991645d83_38"},{"__ref":"Paragraph:e4991645d83_39"},{"__ref":"Paragraph:e4991645d83_40"},{"__ref":"Paragraph:e4991645d83_41"},{"__ref":"Paragraph:e4991645d83_42"},{"__ref":"Paragraph:e4991645d83_43"},{"__ref":"Paragraph:e4991645d83_44"},{"__ref":"Paragraph:e4991645d83_45"},{"__ref":"Paragraph:e4991645d83_46"},{"__ref":"Paragraph:e4991645d83_47"},{"__ref":"Paragraph:e4991645d83_48"},{"__ref":"Paragraph:e4991645d83_49"},{"__ref":"Paragraph:e4991645d83_50"},{"__ref":"Paragraph:e4991645d83_51"},{"__ref":"Paragraph:e4991645d83_52"},{"__ref":"Paragraph:e4991645d83_53"},{"__ref":"Paragraph:e4991645d83_54"},{"__ref":"Paragraph:e4991645d83_55"},{"__ref":"Paragraph:e4991645d83_56"},{"__ref":"Paragraph:e4991645d83_57"},{"__ref":"Paragraph:e4991645d83_58"},{"__ref":"Paragraph:e4991645d83_59"},{"__ref":"Paragraph:e4991645d83_60"},{"__ref":"Paragraph:e4991645d83_61"},{"__ref":"Paragraph:e4991645d83_62"}]},"validatedShareKey":"","shareKeyCreator":null},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","primaryTopic":{"__ref":"Topic:decb52b64abf"},"topics":[{"__typename":"Topic","slug":"programming"}],"isLimitedState":false,"isPublished":true,"allowResponses":true,"latestPublishedVersion":"e4991645d83","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":6},"responseDistribution":"NOT_DISTRIBUTED","clapCount":371,"title":"Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1679508955193,"readingTime":10.486163522012578,"previewContent":{"__typename":"PreviewContent","subtitle":"We all know feel the pain when trying to choose the right instance size for AWS RDS (Amazon Relational Database Service) instance. There…"},"previewImage":{"__ref":"ImageMetadata:1*V5jIIMbkBZtKUDdI_URQwg.png"},"isShortform":false,"seoTitle":"","updatedAt":1721692939524,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:9cd6e8ac8b5c-viewerId:lo_fa61c6ef3ab4"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[],"isFeaturedInPublishedPublication":false,"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":2558,"layerCake":3,"responsesLocked":false},"LinkedAccounts:dbd909ab7ead":{"__typename":"LinkedAccounts","mastodon":null,"id":"dbd909ab7ead"},"Topic:decb52b64abf":{"__typename":"Topic","slug":"programming","id":"decb52b64abf","name":"Programming"},"Paragraph:e4991645d83_0":{"__typename":"Paragraph","id":"e4991645d83_0","name":"b800","type":"H3","href":null,"layout":null,"metadata":null,"text":"Right-Sizing AWS RDS? Request Mirroring Load Test Come To Rescue","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*V5jIIMbkBZtKUDdI_URQwg.png":{"__typename":"ImageMetadata","id":"1*V5jIIMbkBZtKUDdI_URQwg.png","originalHeight":474,"originalWidth":1200,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:e4991645d83_1":{"__typename":"Paragraph","id":"e4991645d83_1","name":"dbd4","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*V5jIIMbkBZtKUDdI_URQwg.png"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_2":{"__typename":"Paragraph","id":"e4991645d83_2","name":"7084","type":"P","href":null,"layout":null,"metadata":null,"text":"We all know feel the pain when trying to choose the right instance size for AWS RDS (Amazon Relational Database Service) instance. There are so many instance types optimized to fit different use case. And within each type, there are wide variety of sizes to choose from like large, xlarge, 2xlarge, 4xlarge etc. You definitely don’t want to over provision and waste tons of money. At the same time, if you choose a database instance size that is too small, your bottleneck limitations can cause many outages or performance regressions that heavily impact your availability and latency.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":149,"end":163,"href":"https:\u002F\u002Faws.amazon.com\u002Frds\u002Finstance-types\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_3":{"__typename":"Paragraph","id":"e4991645d83_3","name":"3a5b","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Choosing the right size for your AWS RDS instances is an art.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_4":{"__typename":"Paragraph","id":"e4991645d83_4","name":"394a","type":"H4","href":null,"layout":null,"metadata":null,"text":"Some metrics you should keep an eye…","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_5":{"__typename":"Paragraph","id":"e4991645d83_5","name":"028e","type":"P","href":null,"layout":null,"metadata":null,"text":"Here I’m going to combine my own experience with AWS official recommendation for best practice for Amazon RDS to give some key point matrix for you to better understand your database performance and help you identify if you are hitting any sort of limitations. For each database of different size, there are different limitations for everything. Hitting any limit could become your bottleneck and affect your performance.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":81,"end":109,"href":"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonRDS\u002Flatest\u002FUserGuide\u002FCHAP_BestPractices.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_6":{"__typename":"Paragraph","id":"e4991645d83_6","name":"f13d","type":"ULI","href":null,"layout":null,"metadata":null,"text":"CPU Utilization — Percentage of computer processing capacity used.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":15,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":17,"end":66,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_7":{"__typename":"Paragraph","id":"e4991645d83_7","name":"87e0","type":"P","href":null,"layout":null,"metadata":null,"text":"If at any point of time, your max CPU utilization on any database instance exceed 75%, this is definitely a sign that you should scale up to more instance (horizontal scaling). If this is a one writer, multiple readers architecture and your writer instance’s CPU utilization is sometimes above 75%, this is a sign calling for larger instance size (vertical scaling) .","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_8":{"__typename":"Paragraph","id":"e4991645d83_8","name":"05c9","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Average Active Sessions (AAS) — An active session is a database connection that has submitted a request to the database but has not yet received the response.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":32,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":32,"end":158,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_9":{"__typename":"Paragraph","id":"e4991645d83_9","name":"0d55","type":"P","href":null,"layout":null,"metadata":null,"text":"Measuring the average number of active concurrent sessions over time provides a clear picture of the load on the database. If AAS number exceed the number of virtual CPU of this instance, then it indicates your database instance is overloaded. More detailed information regarding understanding AAS can be found here.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":311,"end":315,"href":"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdatabase\u002Fanalyzing-amazon-rds-database-workload-with-performance-insights\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_10":{"__typename":"Paragraph","id":"e4991645d83_10","name":"5597","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Freeable Memory — How much RAM is available on the DB instance, in megabytes.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":15,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":18,"end":77,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_11":{"__typename":"Paragraph","id":"e4991645d83_11","name":"972b","type":"P","href":null,"layout":null,"metadata":null,"text":"The red line in the Monitoring tab metrics is marked at 75% for CPU, Memory and Storage Metrics. If instance memory consumption frequently crosses that line, then this indicates that you should check your workload or upgrade your instance.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_12":{"__typename":"Paragraph","id":"e4991645d83_12","name":"9cc3","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Read Throughput, Write Throughput — The average number of megabytes read from or written to disk per second.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":33,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":36,"end":108,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_13":{"__typename":"Paragraph","id":"e4991645d83_13","name":"aed6","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Network Receive Throughput, Network Transmit Throughput — The rate of network traffic to and from the DB instance in bytes per second.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":55,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":57,"end":134,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_14":{"__typename":"Paragraph","id":"e4991645d83_14","name":"2d49","type":"ULI","href":null,"layout":null,"metadata":null,"text":"DB Connections — The number of client sessions that are connected to the DB instance.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":15,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":16,"end":85,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_15":{"__typename":"Paragraph","id":"e4991645d83_15","name":"da00","type":"P","href":null,"layout":null,"metadata":null,"text":"Though, if you are asking me, you can read all the documentations in the world, yet you can’t confidently choose what is the correct size for your current database load without actually trying it out. This part is especially true when you are downsizing from an under utilized large database instance. How can you say with confidence that the downsizing will not give you any performance regression? Similarly, how can you say with confidence that upsizing will bring you a much better performance? More importantly, which instance is the right target instance for your downsizing or upsizing?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_16":{"__typename":"Paragraph","id":"e4991645d83_16","name":"fafd","type":"P","href":null,"layout":null,"metadata":null,"text":"To answer these hard questions, I’m going to break down these question and give you some practical solution to help you load test properly so that you can confidently draw your own conclusion for your case.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_17":{"__typename":"Paragraph","id":"e4991645d83_17","name":"3f75","type":"H3","href":null,"layout":null,"metadata":null,"text":"How to load test reading traffic on different instance size","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_18":{"__typename":"Paragraph","id":"e4991645d83_18","name":"8d12","type":"P","href":null,"layout":null,"metadata":null,"text":"Traditionally, database take both reading and writing traffic. If your database has a separation of reader and writer instances (e.g. Amazon Aurora Database), and currently has multiple reader instances with round robin load balancing traffic to each reader instance, you can easily test out the current load’s performance on a different instance size by spinning up an extra reader instance with target size and terminate an old reader instance.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":208,"end":266,"href":"https:\u002F\u002Fdocs.aws.amazon.com\u002Fwhitepapers\u002Flatest\u002Famazon-aurora-mysql-db-admin-handbook\u002Fload-balancing-with-the-reader-endpoint.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_19":{"__typename":"Paragraph","id":"e4991645d83_19","name":"e7b4","type":"P","href":null,"layout":null,"metadata":null,"text":"With the AWS build in metrics, you can easily check if the load for the current traffic is too little or too much for the new instance size. Though you need to execute with precaution using this method. Since this is load test on a production traffic, this is less ideal compared to some other methods (you can imagine many reason not to do so ahah). Take AWS Aurora database as an example, you need to make sure not to leave mixed instance size for too long. This is not recommended by AWS due to the automatic writer failover mechanism of Aurora database. Also you need to make sure to set the failover priority to lower so that it won’t be selected as the new writer instance if anything bad happened to the writer.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":467,"end":483,"href":"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F66926328\u002Fdo-aws-rds-cluster-instances-need-to-be-the-same-size","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_20":{"__typename":"Paragraph","id":"e4991645d83_20","name":"191d","type":"H3","href":null,"layout":null,"metadata":null,"text":"How to load test writing traffic on different instance size","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_21":{"__typename":"Paragraph","id":"e4991645d83_21","name":"7efb","type":"P","href":null,"layout":null,"metadata":null,"text":"Load test writing traffic on a difference instance size is where most people is mainly stressed about when talking about database rightsizing. One obvious way to do load test is to write some load test and set up the infrastructure to see the performance difference on two database with different instance size — one the same size with production and another one with target instance where you would like to upsizing or downsizing too. While this is all great, writing load test and setting up the load testing infrastructure is no easy work for an engineer. It requires in depth knowledge for use case of the database to set up proper sql statements that you are testing on to generate similar load from production and it requires many infra knowledge to set up the load test environment properly.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_22":{"__typename":"Paragraph","id":"e4991645d83_22","name":"eba3","type":"P","href":null,"layout":null,"metadata":null,"text":"Here, I would like to talk about two methods that can help you to do a shallow load test by mirroring production traffic with a lot less work to set up compare to writing your own load test. I recently used both method for load test for two different databases and I would love to share my experience as an inspiration for how you can easily load test your database and find the right size for your database.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_23":{"__typename":"Paragraph","id":"e4991645d83_23","name":"f11f","type":"H3","href":null,"layout":null,"metadata":null,"text":"Method 1: Use envoy to do request mirroring","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_24":{"__typename":"Paragraph","id":"e4991645d83_24","name":"6104","type":"P","href":null,"layout":null,"metadata":null,"text":"Here’s some background information for folks who might be new to envoy or envoy request mirroring.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_25":{"__typename":"Paragraph","id":"e4991645d83_25","name":"679e","type":"H4","href":null,"layout":null,"metadata":null,"text":"What is Envoy?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_26":{"__typename":"Paragraph","id":"e4991645d83_26","name":"b989","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Envoy is an open source edge and service proxy, designed for cloud-native applications.","hasDropCap":true,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":5,"href":"https:\u002F\u002Fwww.envoyproxy.io\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_27":{"__typename":"Paragraph","id":"e4991645d83_27","name":"2673","type":"H4","href":null,"layout":null,"metadata":null,"text":"What is request mirroring?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_28":{"__typename":"Paragraph","id":"e4991645d83_28","name":"0954","type":"P","href":null,"layout":null,"metadata":null,"text":"Request mirroring (also called shadowing, shadow mirroring) is when production traffic is mirrored to destination cluster of a developer’s choosing. Shadowing production traffic allow us to test the production traffic on a test instance (in our case a test database) to get accurate comparison and understand how the test instance behave under the same load without affecting end clients in any way. This can help us to make risky changes with higher confidence and validate the test instance before pushing it to production.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_29":{"__typename":"Paragraph","id":"e4991645d83_29","name":"5811","type":"H4","href":null,"layout":null,"metadata":null,"text":"Is this the right choice for you?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_30":{"__typename":"Paragraph","id":"e4991645d83_30","name":"d518","type":"P","href":null,"layout":null,"metadata":null,"text":"If you use envoy as a proxy in your current infrastructure and all your database request comes from your client side request, using envoy to do request mirroring is the perfect method for you. Allow me to elaborate with a picture.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*FqzCqtd6GDMHqCBpg8Bp0A.png":{"__typename":"ImageMetadata","id":"1*FqzCqtd6GDMHqCBpg8Bp0A.png","originalHeight":692,"originalWidth":908,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:e4991645d83_31":{"__typename":"Paragraph","id":"e4991645d83_31","name":"b7e6","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*FqzCqtd6GDMHqCBpg8Bp0A.png"},"text":"Note: Clone Database is set to the target size we want to upsize or downsize to verify how the traffic load behaves on this database instance size","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_32":{"__typename":"Paragraph","id":"e4991645d83_32","name":"57be","type":"P","href":null,"layout":null,"metadata":null,"text":"As you can see from the envoy documentation, envoy provides you powerful features like request mirroring to easily load test your database. All you need to do is do change your envoy configuration file and have it also do mirrored request to your clone application. After you set up the clone application and prod load test clone database, make sure your clone application point to the DNS of your prod load test clone database, then you are ready to go. Just leverage envoy request mirroring feature and change the envoy configuration, and voila, your envoy will make sure to send a copy of the same http request to your clone application automatically. You can wait and observe how the same load performs on your load test database, if there is any unexpected longer latency or any triggered warning. If everything looks good, you have successfully choose the right target instance size. If not, you can always repeat by changing your load test database size and repeat the same process until you are happy with the result.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":24,"end":43,"href":"http:\u002F\u002Fenvoyproxy.io\u002Fdocs\u002Fenvoy\u002Flatest\u002Fstart\u002Fsandboxes\u002Froute-mirror.html?highlight=request%20mirroring","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_33":{"__typename":"Paragraph","id":"e4991645d83_33","name":"a4f8","type":"H4","href":null,"layout":null,"metadata":null,"text":"Advantages:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_34":{"__typename":"Paragraph","id":"e4991645d83_34","name":"e953","type":"P","href":null,"layout":null,"metadata":null,"text":"This practice is very safe using the mechanism of fire and forget traffic from envoy. Particularly there’s a clone service that is in charge of sending the database traffic towards the load test clone database, you will not affect the production service by giving it extra load like firing a request mirroring traffic from the production service. This clear separation between the load test service and load test database provides an isolated safe environment for you to perform request mirroring without affecting the production traffic.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_35":{"__typename":"Paragraph","id":"e4991645d83_35","name":"0905","type":"H4","href":null,"layout":null,"metadata":null,"text":"Some precautions:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_36":{"__typename":"Paragraph","id":"e4991645d83_36","name":"93f3","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Make sure the clone application have the same set up as production application. Otherwise you introduced more variables to the load test and it will be harder to draw conclusion from two tests performed with different set up.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_37":{"__typename":"Paragraph","id":"e4991645d83_37","name":"11ee","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Make sure the clone application is linked to the clone load test database endpoint. You never want to mess up with your production database (danger of double write). If your application writes to more than one database (include some database you don’t want to perform rightsizing), then redirect the other database endpoint to some invalid ones is one way to avoid double write to those databases. However, if there’s retry for failed database read or write, this will affect the latency looking from the clone service side as well so keep it in mind when interpreting the load test result.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":141,"end":163,"href":"https:\u002F\u002Fthorben-janssen.com\u002Fdual-writes\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_38":{"__typename":"Paragraph","id":"e4991645d83_38","name":"3f2a","type":"OLI","href":null,"layout":null,"metadata":null,"text":"I would also like to point out with the current micro-service architecture, your service might have some downstream service that it is calling. That downstream service might write to other database. So be careful with that, or you might introduce double write to other database of your downstream service. You can identify downstream service and write some code in the clone service to not send traffic to the downstream service. For a monolith, there’s no worries on this aspect. So envoy request mirroring can be ideal for load test on a monolith service or a service with no downstream services.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_39":{"__typename":"Paragraph","id":"e4991645d83_39","name":"de40","type":"H3","href":null,"layout":null,"metadata":null,"text":"Method 2: Use ProxySQL to do request mirroring for SQL traffic","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_40":{"__typename":"Paragraph","id":"e4991645d83_40","name":"296d","type":"P","href":null,"layout":null,"metadata":null,"text":"If your current infrastructure doesn’t support you to use envoy request mirroring, here’s a second option that might give you more possibility to do request mirroring for your database — use ProxySQL to do request mirroring for sql traffic.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_41":{"__typename":"Paragraph","id":"e4991645d83_41","name":"9e25","type":"P","href":null,"layout":null,"metadata":null,"text":"As usual, here’s some background information for folks who might be new to ProxySQL or ProxySQL request mirroring.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_42":{"__typename":"Paragraph","id":"e4991645d83_42","name":"913a","type":"H4","href":null,"layout":null,"metadata":null,"text":"What is ProxySQL?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_43":{"__typename":"Paragraph","id":"e4991645d83_43","name":"d6b7","type":"BQ","href":null,"layout":null,"metadata":null,"text":"ProxySQL is an open source high performance, high availability, database protocol aware proxy for MySQL. ProxySQL build complex ProxySQL Query Rules to route writes to primaries, distribute reads across replicas and rewrite queries on the fly with highly granular criteria.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":8,"href":"https:\u002F\u002Fproxysql.com\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":128,"end":148,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_44":{"__typename":"Paragraph","id":"e4991645d83_44","name":"a913","type":"H4","href":null,"layout":null,"metadata":null,"text":"What is ProxySQL request mirroring?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_45":{"__typename":"Paragraph","id":"e4991645d83_45","name":"d0e8","type":"P","href":null,"layout":null,"metadata":null,"text":"Summarizing in my own words, when mirroring feature is enabled through ProxySQL Query Rules, ProxySQL forward the SQL statement to prod database as usual and will also send a copy of the production traffic’s SQL statements to the clone database. ProxySQL request mirroring does not guarantee the order of execution and does not guarantee data consistency. But it is very useful when comparing performance of two database with slight different (for example different MySQL version, or in our case different DB instance size) by sending same read and write SQL statement to two different databases.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_46":{"__typename":"Paragraph","id":"e4991645d83_46","name":"774f","type":"H4","href":null,"layout":null,"metadata":null,"text":"Is this the right choice for you?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_47":{"__typename":"Paragraph","id":"e4991645d83_47","name":"cf60","type":"P","href":null,"layout":null,"metadata":null,"text":"Different from requests mirroring by envoy, we are leveraging the ProxySQL’s built-in requests mirroring function to send a mirroring sql statement to the load test clone database every time we send a sql statement to production database. This is perfect for when you have multiple micro-services communicating to one database or requests other than http that issue reads and writes to the database (e.g. using kafka to issue sql write statements). You can do requests mirroring through adding a ProxySQL layer in the middle. Just replace the database hostname inside the application configuration to the newly set up ProxySQL hostname, then we can leverage ProxySQL to do requests mirroring. Allow me to elaborate using a picture:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*NVj72Yb-A9kIwxgGu4h-uQ.png":{"__typename":"ImageMetadata","id":"1*NVj72Yb-A9kIwxgGu4h-uQ.png","originalHeight":778,"originalWidth":1388,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:e4991645d83_48":{"__typename":"Paragraph","id":"e4991645d83_48","name":"fd0e","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*NVj72Yb-A9kIwxgGu4h-uQ.png"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*4zqK9uUpypnO_O7gZypsTA.png":{"__typename":"ImageMetadata","id":"1*4zqK9uUpypnO_O7gZypsTA.png","originalHeight":840,"originalWidth":1034,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:e4991645d83_49":{"__typename":"Paragraph","id":"e4991645d83_49","name":"eadf","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*4zqK9uUpypnO_O7gZypsTA.png"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_50":{"__typename":"Paragraph","id":"e4991645d83_50","name":"d68e","type":"P","href":null,"layout":null,"metadata":null,"text":"As shown in the picture, instead of mirroring the http requests to achieve simulating production traffic load, here we are focused on directly mirroring SQL statements by introducing a new proxy layer provided by open source project ProxySQL.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_51":{"__typename":"Paragraph","id":"e4991645d83_51","name":"3588","type":"H4","href":null,"layout":null,"metadata":null,"text":"Advantages:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_52":{"__typename":"Paragraph","id":"e4991645d83_52","name":"cc51","type":"P","href":null,"layout":null,"metadata":null,"text":"This practice doesn’t have the double write danger as we mentioned in the envoy requests mirroring method since only sql requests are mirrored. Also since all SQL statement going through can be mirrored by ProxySQL, we can cover scenarios where one database’s SQL statement is issued by multiple services or sources (kafka for instance). This is personally my second and only remaining choice when the envoy requests mirroring would not be sufficient.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_53":{"__typename":"Paragraph","id":"e4991645d83_53","name":"b378","type":"H4","href":null,"layout":null,"metadata":null,"text":"Some precautions:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_54":{"__typename":"Paragraph","id":"e4991645d83_54","name":"b667","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Make sure the set up is done properly when using ProxySQL for request mirroring. As shown in picture, you will need to set up some EC2 machines to run ProxySQL service and then set up the DNS for it before you can shift traffic to this new hostname. Since we are directly shifting production SQL traffic to go through ProxySQL service, it is critical to make sure the set up is correctly. Otherwise, it will cause some down time.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_55":{"__typename":"Paragraph","id":"e4991645d83_55","name":"4995","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Have a mechanism to shift traffic to ProxySQL service gradually. Like I mentioned before, we are adding an extra layer of ProxySQL service between your production service and production database. If we have mechanism to shift traffic smoothly and roll back when things turns wrong, it would be very nice in case things go south.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_56":{"__typename":"Paragraph","id":"e4991645d83_56","name":"4e47","type":"OLI","href":null,"layout":null,"metadata":null,"text":"ProxySQL is a less established open source project compare to envoy. I personally ran into some errors like this one during my own request mirroring process. This blocked me from sending one of the top SQL statement to the load test clone cluster and in result leading to an inaccurate load test result. Great news is that it didn’t block forwarding the traffic to the production database, it just threw warnings when trying to send the mirroring request to the load test clone cluster. So if you are expert on ProxySQL definitely go for it, otherwise there’s some risk running into unsolvable bugs. But like I said, ProxySQL does tackle a more generalized use case where envoy request mirroring couldn’t handle.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":108,"end":116,"href":"https:\u002F\u002Fgithub.com\u002Fsysown\u002Fproxysql\u002Fissues\u002F3389","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_57":{"__typename":"Paragraph","id":"e4991645d83_57","name":"9512","type":"OLI","href":null,"layout":null,"metadata":null,"text":"The extra network hops of ProxySQL might introduce some latency when looking from the service side metrics. If you are only looking at database side metrics this would not add any latency at the database layer. However if you are also evaluating the latency metrics measured from the application side, you might be seeing more latency from introducing one extra ProxySQL service in the networking path. You can always rely on some tracing tool to factor out the time on ProxySQL service. But this requires more patience and precaution when looking at the data.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_58":{"__typename":"Paragraph","id":"e4991645d83_58","name":"66a9","type":"H3","href":null,"layout":null,"metadata":null,"text":"Conclusion","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_59":{"__typename":"Paragraph","id":"e4991645d83_59","name":"0694","type":"P","href":null,"layout":null,"metadata":null,"text":"I’ve stumbled and struggled during my first journey to do load test for rightsizing database instance. I hope that my article will give you some inspirations if you facing similar challenge.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_60":{"__typename":"Paragraph","id":"e4991645d83_60","name":"21a7","type":"P","href":null,"layout":null,"metadata":null,"text":"Thank you for reading. Please reach out to me in the discussion or on linkedin if you have any thoughts or comments.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":70,"end":78,"href":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fmengying-li-madeline\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:e4991645d83_61":{"__typename":"Paragraph","id":"e4991645d83_61","name":"6493","type":"P","href":null,"layout":null,"metadata":null,"text":"Happy new year everyone :)","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*iYQIwwHYM2GFgNoAntKiUw.jpeg":{"__typename":"ImageMetadata","id":"1*iYQIwwHYM2GFgNoAntKiUw.jpeg","originalHeight":4032,"originalWidth":3024,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:e4991645d83_62":{"__typename":"Paragraph","id":"e4991645d83_62","name":"8e4d","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*iYQIwwHYM2GFgNoAntKiUw.jpeg"},"text":"The new year eve’s firework photo I took","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:532b19e4043c-viewerId:lo_fa61c6ef3ab4":{"__typename":"CollectionViewerEdge","id":"collectionId:532b19e4043c-viewerId:lo_fa61c6ef3ab4","isEditor":false,"isMuting":false},"UserViewerEdge:userId:dbd909ab7ead-viewerId:lo_fa61c6ef3ab4":{"__typename":"UserViewerEdge","id":"userId:dbd909ab7ead-viewerId:lo_fa61c6ef3ab4","isMuting":false},"ImageMetadata:1*zXjOKA4JKHH04Ipi2NI0jA.png":{"__typename":"ImageMetadata","id":"1*zXjOKA4JKHH04Ipi2NI0jA.png","originalWidth":1156,"originalHeight":164},"PostViewerEdge:postId:9cd6e8ac8b5c-viewerId:lo_fa61c6ef3ab4":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:9cd6e8ac8b5c-viewerId:lo_fa61c6ef3ab4"}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"HIT"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.8b67b313.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.94ea62ed.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.5bef8967.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9120.5df29668.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4505.6dfaf853.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9380.fb176dee.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.dc8dbee4.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.933c1c9a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.68bc318b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3045.1cc3d8cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.3329b100.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.a4ecfb83.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6428.36238b5a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6199.6da73f3b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.7d9f7f3d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.67eb283b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.8aa8d357.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4492.0c3e1a1d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2571.6814b962.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.1c286b32.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6128.f8800a13.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2135.2e8dc177.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.60bcefe8.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/144.86429b48.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5240.6281357f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8819.c627c2bf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.d0637ed0.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.c3ee9367.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.0d800846.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2527.18a8996d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.e1e580cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/responses.editor.e89462cb.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9134f1be085c9d1d',t:'MTczOTc4NjU3Mi4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10