488 lines
78 KiB
HTML
488 lines
78 KiB
HTML
<!DOCTYPE html>
|
||
<html dir="ltr" lang="en-CA" class="no-js">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<link rel="profile" href="https://gmpg.org/xfn/11">
|
||
<script>
|
||
(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);
|
||
//# sourceURL=twentysixteen_javascript_detection
|
||
</script>
|
||
<title>The Tail at Scale Revisited | bill duncan's blog</title>
|
||
|
||
<!-- All in One SEO 5.0.1.1 - aioseo.com -->
|
||
<meta name="description" content="Some charts for a better understanding of the relationship of backend objectives and how they impact user experience." />
|
||
<meta name="robots" content="max-image-preview:large" />
|
||
<meta name="author" content="bduncan"/>
|
||
<meta name="keywords" content="sla,slo,backend,probability,long tail,tail at scale,service level objectives" />
|
||
<link rel="canonical" href="https://billduncan.org/the-tail-at-scale-revisited/" />
|
||
<meta name="generator" content="All in One SEO (AIOSEO) 5.0.1.1" />
|
||
<script type="application/ld+json" class="aioseo-schema">
|
||
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#article","name":"The Tail at Scale Revisited | bill duncan's blog","headline":"The Tail at Scale Revisited","author":{"@id":"https:\/\/billduncan.org\/author\/ve3ied\/#author"},"publisher":{"@id":"https:\/\/billduncan.org\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/billduncan.org\/wp-content\/uploads\/2020\/05\/reverse-pdf.png","@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#articleImage","width":1200,"height":800,"caption":"SLA\/SLO Rates"},"datePublished":"2020-05-24T15:32:54-04:00","dateModified":"2020-05-30T12:21:27-04:00","inLanguage":"en-CA","commentCount":5,"mainEntityOfPage":{"@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#webpage"},"isPartOf":{"@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#webpage"},"articleSection":"Detecting Performance Issues, Monitoring, SRE, System Performance"},{"@type":"BreadcrumbList","@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/billduncan.org#listItem","position":1,"name":"Home","item":"https:\/\/billduncan.org","nextItem":{"@type":"ListItem","@id":"https:\/\/billduncan.org\/category\/detecting-performance-issues\/#listItem","name":"Detecting Performance Issues"}},{"@type":"ListItem","@id":"https:\/\/billduncan.org\/category\/detecting-performance-issues\/#listItem","position":2,"name":"Detecting Performance Issues","item":"https:\/\/billduncan.org\/category\/detecting-performance-issues\/","nextItem":{"@type":"ListItem","@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#listItem","name":"The Tail at Scale Revisited"},"previousItem":{"@type":"ListItem","@id":"https:\/\/billduncan.org#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#listItem","position":3,"name":"The Tail at Scale Revisited","previousItem":{"@type":"ListItem","@id":"https:\/\/billduncan.org\/category\/detecting-performance-issues\/#listItem","name":"Detecting Performance Issues"}}]},{"@type":"Organization","@id":"https:\/\/billduncan.org\/#organization","name":"bill duncan's blog","description":"Performance Matters (and Other Tidbits from the Trenches)","url":"https:\/\/billduncan.org\/"},{"@type":"Person","@id":"https:\/\/billduncan.org\/author\/ve3ied\/#author","url":"https:\/\/billduncan.org\/author\/ve3ied\/","name":"bduncan","image":{"@type":"ImageObject","@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=96&d=mm&r=pg","width":96,"height":96,"caption":"bduncan"}},{"@type":"WebPage","@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#webpage","url":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/","name":"The Tail at Scale Revisited | bill duncan's blog","description":"Some charts for a better understanding of the relationship of backend objectives and how they impact user experience.","inLanguage":"en-CA","isPartOf":{"@id":"https:\/\/billduncan.org\/#website"},"breadcrumb":{"@id":"https:\/\/billduncan.org\/the-tail-at-scale-revisited\/#breadcrumblist"},"author":{"@id":"https:\/\/billduncan.org\/author\/ve3ied\/#author"},"creator":{"@id":"https:\/\/billduncan.org\/author\/ve3ied\/#author"},"datePublished":"2020-05-24T15:32:54-04:00","dateModified":"2020-05-30T12:21:27-04:00"},{"@type":"WebSite","@id":"https:\/\/billduncan.org\/#website","url":"https:\/\/billduncan.org\/","name":"bill duncan's blog","description":"Performance Matters (and Other Tidbits from the Trenches)","inLanguage":"en-CA","publisher":{"@id":"https:\/\/billduncan.org\/#organization"}}]}
|
||
</script>
|
||
<!-- All in One SEO -->
|
||
|
||
<link rel='dns-prefetch' href='//cdn.trustedsite.com' />
|
||
<link rel='dns-prefetch' href='//platform-api.sharethis.com' />
|
||
<link rel="alternate" type="application/rss+xml" title="bill duncan's blog » Feed" href="https://billduncan.org/feed/" />
|
||
<link rel="alternate" type="application/rss+xml" title="bill duncan's blog » Comments Feed" href="https://billduncan.org/comments/feed/" />
|
||
<link rel="alternate" type="application/rss+xml" title="bill duncan's blog » The Tail at Scale Revisited Comments Feed" href="https://billduncan.org/the-tail-at-scale-revisited/feed/" />
|
||
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://billduncan.org/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbillduncan.org%2Fthe-tail-at-scale-revisited%2F" />
|
||
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://billduncan.org/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbillduncan.org%2Fthe-tail-at-scale-revisited%2F&format=xml" />
|
||
<style id="wp-img-auto-sizes-contain-inline-css">
|
||
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
|
||
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
|
||
</style>
|
||
<link rel='stylesheet' id='wp-quicklatex-format-css' href='https://billduncan.org/wp-content/plugins/wp-quicklatex/css/quicklatex-format.css?ver=7.0.4' media='all' />
|
||
<style id="wp-emoji-styles-inline-css">
|
||
|
||
img.wp-smiley, img.emoji {
|
||
display: inline !important;
|
||
border: none !important;
|
||
box-shadow: none !important;
|
||
height: 1em !important;
|
||
width: 1em !important;
|
||
margin: 0 0.07em !important;
|
||
vertical-align: -0.1em !important;
|
||
background: none !important;
|
||
padding: 0 !important;
|
||
}
|
||
/*# sourceURL=wp-emoji-styles-inline-css */
|
||
</style>
|
||
<style id="wp-block-library-inline-css">
|
||
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
|
||
|
||
/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
|
||
</style>
|
||
<style id="classic-theme-styles-inline-css">
|
||
/*! This file is auto-generated */
|
||
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
|
||
/*# sourceURL=/wp-includes/css/classic-themes.min.css */
|
||
</style>
|
||
|
||
<link rel='stylesheet' id='font-awesome-css' href='https://billduncan.org/wp-content/plugins/contact-widgets/assets/css/font-awesome.min.css?ver=4.7.0' media='all' />
|
||
<style id="site-designer-shared-pattern-classes-inline-css">
|
||
/* Dark cover/section overlay + on-dark text. */
|
||
body .wp-site-blocks .is-style-overlay-dark .wp-block-cover__background { background-color: var(--wp--preset--color--base-3); color: var(--wp--preset--color--contrast-3); }
|
||
.wp-block-cover.is-style-overlay-dark .wp-block-cover__background.has-background-dim { opacity: 0.50 !important; }
|
||
:is(.wp-block-designsetgo-section, .wp-block-designsetgo-scroll-slides).is-style-overlay-dark { --dsgo-overlay-color: var(--wp--preset--color--base-3); --dsgo-overlay-opacity: 0.50; color: var(--wp--preset--color--contrast-3); }
|
||
.dsgo-image-accordion-item.is-style-overlay-dark { --dsgo-overlay-color: var(--wp--preset--color--base-3); }
|
||
.wp-block-group.has-background.is-style-overlay-dark { box-shadow: inset 0 0 0 9999px color-mix(in srgb, var(--wp--preset--color--base-3) 50%, transparent); }
|
||
body .wp-site-blocks .is-style-overlay-dark, body .wp-site-blocks .is-style-on-dark { --dsgo-text-color: var(--wp--preset--color--contrast-3); color: var(--wp--preset--color--contrast-3) !important; }
|
||
body .wp-site-blocks .is-style-overlay-dark :is(h1,h2,h3,h4,h5,h6,p,li,blockquote,cite), body .wp-site-blocks .is-style-on-dark :is(h1,h2,h3,h4,h5,h6,p,li,blockquote,cite) { color: var(--wp--preset--color--contrast-3) !important; }
|
||
|
||
/* Solid dark section background + light text. */
|
||
.is-style-bg-dark { background-color: var(--wp--preset--color--contrast); color: var(--wp--preset--color--base); }
|
||
.is-style-bg-dark a { color: var(--wp--preset--color--base); }
|
||
/*# sourceURL=site-designer-shared-pattern-classes-inline-css */
|
||
</style>
|
||
<style id="global-styles-inline-css">
|
||
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #1a1a1a;--wp--preset--color--medium-gray: #686868;--wp--preset--color--light-gray: #e5e5e5;--wp--preset--color--blue-gray: #4d545c;--wp--preset--color--bright-blue: #007acc;--wp--preset--color--light-blue: #9adffd;--wp--preset--color--dark-brown: #402b30;--wp--preset--color--medium-brown: #774e24;--wp--preset--color--dark-red: #640c1f;--wp--preset--color--bright-red: #ff675f;--wp--preset--color--yellow: #ffef8e;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-color{color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-color{color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-color{color: var(--wp--preset--color--light-gray) !important;}.has-blue-gray-color{color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-color{color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-color{color: var(--wp--preset--color--light-blue) !important;}.has-dark-brown-color{color: var(--wp--preset--color--dark-brown) !important;}.has-medium-brown-color{color: var(--wp--preset--color--medium-brown) !important;}.has-dark-red-color{color: var(--wp--preset--color--dark-red) !important;}.has-bright-red-color{color: var(--wp--preset--color--bright-red) !important;}.has-yellow-color{color: var(--wp--preset--color--yellow) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-background-color{background-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-background-color{background-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-background-color{background-color: var(--wp--preset--color--light-gray) !important;}.has-blue-gray-background-color{background-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-background-color{background-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-background-color{background-color: var(--wp--preset--color--light-blue) !important;}.has-dark-brown-background-color{background-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-brown-background-color{background-color: var(--wp--preset--color--medium-brown) !important;}.has-dark-red-background-color{background-color: var(--wp--preset--color--dark-red) !important;}.has-bright-red-background-color{background-color: var(--wp--preset--color--bright-red) !important;}.has-yellow-background-color{background-color: var(--wp--preset--color--yellow) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-border-color{border-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-border-color{border-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-border-color{border-color: var(--wp--preset--color--light-gray) !important;}.has-blue-gray-border-color{border-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-border-color{border-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-border-color{border-color: var(--wp--preset--color--light-blue) !important;}.has-dark-brown-border-color{border-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-brown-border-color{border-color: var(--wp--preset--color--medium-brown) !important;}.has-dark-red-border-color{border-color: var(--wp--preset--color--dark-red) !important;}.has-bright-red-border-color{border-color: var(--wp--preset--color--bright-red) !important;}.has-yellow-border-color{border-color: var(--wp--preset--color--yellow) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
|
||
/*# sourceURL=global-styles-inline-css */
|
||
</style>
|
||
|
||
<link rel='stylesheet' id='mc4wp-form-themes-css' href='https://billduncan.org/wp-content/plugins/mailchimp-for-wp/assets/css/form-themes.css?ver=4.14.1' media='all' />
|
||
<link rel='stylesheet' id='wp-components-css' href='https://billduncan.org/wp-includes/css/dist/components/style.min.css?ver=7.0.4' media='all' />
|
||
<link rel='stylesheet' id='godaddy-styles-css' href='https://billduncan.org/wp-content/mu-plugins/vendor/wpex/godaddy-launch/includes/Dependencies/GoDaddy/Styles/build/latest.css?ver=2.0.2' media='all' />
|
||
<link rel='stylesheet' id='twentysixteen-fonts-css' href='https://billduncan.org/wp-content/themes/twentysixteen/fonts/merriweather-plus-montserrat-plus-inconsolata.css?ver=20230328' media='all' />
|
||
<link rel='stylesheet' id='genericons-css' href='https://billduncan.org/wp-content/themes/twentysixteen/genericons/genericons.css?ver=20251101' media='all' />
|
||
<link rel='stylesheet' id='twentysixteen-style-css' href='https://billduncan.org/wp-content/themes/twentysixteen/style.css?ver=20260819' media='all' />
|
||
<link rel='stylesheet' id='twentysixteen-block-style-css' href='https://billduncan.org/wp-content/themes/twentysixteen/css/blocks.css?ver=20260105' media='all' />
|
||
<script id="jquery-core-js" src="https://billduncan.org/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
|
||
<script id="jquery-migrate-js" src="https://billduncan.org/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
|
||
<script id="twentysixteen-script-js-extra">
|
||
var screenReaderText = {"expand":"expand child menu","collapse":"collapse child menu"};
|
||
//# sourceURL=twentysixteen-script-js-extra
|
||
</script>
|
||
<script data-wp-strategy="defer" defer id="twentysixteen-script-js" src="https://billduncan.org/wp-content/themes/twentysixteen/js/functions.js?ver=20230629"></script>
|
||
<script id="googleanalytics-platform-sharethis-js" src="//platform-api.sharethis.com/js/sharethis.js#source=googleanalytics-wordpress#product=ga&property=5b1f3e1fe9c37c00114cb833"></script>
|
||
<script id="wp-quicklatex-frontend-js" src="https://billduncan.org/wp-content/plugins/wp-quicklatex/js/wp-quicklatex-frontend.js?ver=1.0"></script>
|
||
<link rel="https://api.w.org/" href="https://billduncan.org/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://billduncan.org/wp-json/wp/v2/posts/919" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://billduncan.org/xmlrpc.php?rsd" />
|
||
<meta name="generator" content="WordPress 7.0.4" />
|
||
<link rel='shortlink' href='https://billduncan.org/?p=919' />
|
||
<script>
|
||
(function() {
|
||
(function (i, s, o, g, r, a, m) {
|
||
i['GoogleAnalyticsObject'] = r;
|
||
i[r] = i[r] || function () {
|
||
(i[r].q = i[r].q || []).push(arguments)
|
||
}, i[r].l = 1 * new Date();
|
||
a = s.createElement(o),
|
||
m = s.getElementsByTagName(o)[0];
|
||
a.async = 1;
|
||
a.src = g;
|
||
m.parentNode.insertBefore(a, m)
|
||
})(window, document, 'script', 'https://google-analytics.com/analytics.js', 'ga');
|
||
|
||
ga('create', 'UA-120366658-1', 'auto');
|
||
ga('send', 'pageview');
|
||
})();
|
||
</script>
|
||
<style id="wp-site-designer-contrast-fallback"> .wp-block-group:not([data-dsgo-inline-bg]),.wp-block-column:not([data-dsgo-inline-bg]),.wp-block-columns:not([data-dsgo-inline-bg]){--dsgo-text-color:initial;} :is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover:not(.has-text-color){color:var(--wp--preset--color--contrast-3) !important;--dsgo-text-color:var(--wp--preset--color--contrast-3);} body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h1:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h2:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h3:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h4:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h5:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h6:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) p:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) .wp-element-caption:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)){color:var(--dsgo-text-color,inherit) !important;} body .wp-site-blocks :is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column)[data-dsgo-inline-bg] .wp-block-button:is([class*="is-style-outline"],[class*="is-style-secondary"]) .wp-element-button{color:var(--dsgo-text-color,inherit) !important;border-color:currentColor !important;}body .wp-site-blocks :is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column)[data-dsgo-inline-bg] .wp-block-button:is([class*="is-style-outline"],[class*="is-style-secondary"]) .wp-element-button:hover{opacity:0.75;} body .wp-site-blocks [data-dsgo-inline-bg] h1:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h2:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h3:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h4:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h5:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h6:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] p:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] .wp-element-caption:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)){color:var(--dsgo-text-color,inherit) !important;} .wp-block-designsetgo-section.has-background:not([data-dsgo-inline-bg]):not(.has-text-color){color:var(--wp--preset--color--contrast);--dsgo-text-color:var(--wp--preset--color--contrast);} :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-5);color:var(--wp--preset--color--contrast);} body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast);} :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-2);color:var(--wp--preset--color--contrast);} body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast);} :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-1);color:var(--wp--preset--color--contrast);} body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast);} :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-3);color:var(--wp--preset--color--accent-2);} body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--accent-2);} :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--contrast);color:var(--wp--preset--color--base);} body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--base);} body .wp-site-blocks input:not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="image"]):not([type="hidden"]),body .wp-site-blocks textarea,body .wp-site-blocks select{background-color:var(--wp--preset--color--base);color:var(--wp--preset--color--contrast);border:1px solid color-mix(in srgb, var(--wp--preset--color--contrast) 30%, transparent);} .wp-site-blocks input[type="submit"]:not(.wp-element-button),.wp-site-blocks button[type="submit"]:not(.wp-element-button){background-color:var(--wp--preset--color--accent-2);color:var(--wp--preset--color--base);border-width:0;padding:12px 30px;font-family:inherit;font-size:var(--wp--preset--font-size--medium, 1rem);line-height:inherit;cursor:pointer;}</style>
|
||
<style id="site-designer-logo-constraints">
|
||
.wp-block-site-logo.is-default-size img {
|
||
width: auto;
|
||
height: auto;
|
||
max-width: 180px;
|
||
max-height: 80px;
|
||
}
|
||
.wp-block-site-logo img {
|
||
height: auto;
|
||
}
|
||
</style>
|
||
</head>
|
||
|
||
<body class="wp-singular post-template-default single single-post postid-919 single-format-standard wp-embed-responsive wp-theme-twentysixteen">
|
||
<div id="page" class="site">
|
||
<div class="site-inner">
|
||
<a class="skip-link screen-reader-text" href="#content">
|
||
Skip to content </a>
|
||
|
||
<header id="masthead" class="site-header">
|
||
<div class="site-header-main">
|
||
<div class="site-branding">
|
||
<p class="site-title"><a href="https://billduncan.org/" rel="home" >bill duncan's blog</a></p>
|
||
<p class="site-description">Performance Matters (and Other Tidbits from the Trenches)</p>
|
||
</div><!-- .site-branding -->
|
||
|
||
<button id="menu-toggle" class="menu-toggle">Menu</button>
|
||
|
||
<div id="site-header-menu" class="site-header-menu">
|
||
<nav id="site-navigation" class="main-navigation" aria-label="Primary Menu">
|
||
<div class="menu-primary-menu-container"><ul id="menu-primary-menu" class="primary-menu"><li id="menu-item-15" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-15"><a href="https://billduncan.org">Home</a></li>
|
||
<li id="menu-item-13" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-13"><a href="https://billduncan.org/about/">About Me</a></li>
|
||
<li id="menu-item-12" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-12"><a href="https://billduncan.org/contact/">Contact bill duncan</a></li>
|
||
<li id="menu-item-87" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-87"><a href="https://billduncan.org/references/">Links</a></li>
|
||
</ul></div> </nav><!-- .main-navigation -->
|
||
|
||
</div><!-- .site-header-menu -->
|
||
</div><!-- .site-header-main -->
|
||
|
||
<div class="header-image">
|
||
<a href="https://billduncan.org/" rel="home" >
|
||
<img src="https://billduncan.org/wp-content/uploads/2018/10/k05d1996-cropped.jpg" width="1198" height="280" alt="bill duncan's blog" sizes="(max-width: 709px) 85vw, (max-width: 909px) 81vw, (max-width: 1362px) 88vw, 1200px" srcset="https://billduncan.org/wp-content/uploads/2018/10/k05d1996-cropped.jpg 1198w, https://billduncan.org/wp-content/uploads/2018/10/k05d1996-cropped-300x70.jpg 300w, https://billduncan.org/wp-content/uploads/2018/10/k05d1996-cropped-768x179.jpg 768w, https://billduncan.org/wp-content/uploads/2018/10/k05d1996-cropped-1024x239.jpg 1024w" decoding="async" fetchpriority="high" /> </a>
|
||
</div><!-- .header-image -->
|
||
</header><!-- .site-header -->
|
||
|
||
<div id="content" class="site-content">
|
||
|
||
<div id="primary" class="content-area">
|
||
<main id="main" class="site-main">
|
||
|
||
<article id="post-919" class="post-919 post type-post status-publish format-standard hentry category-detecting-performance-issues category-monitoring category-sre category-system-performance">
|
||
<header class="entry-header">
|
||
<h1 class="entry-title">The Tail at Scale Revisited</h1> </header><!-- .entry-header -->
|
||
|
||
|
||
|
||
<div class="entry-content">
|
||
<p>My last article discussed some of the missing math related to setting back-end objectives. This article presents a chart which is useful in understanding the relationship to the user experience and we examine ways to dramatically improve the overall performance.<span id="more-919"></span></p>
|
||
<p>Please read the <a title="The Tail at Scale" href="https://billduncan.org/the-tail-at-scale/" target="_blank" rel="noopener noreferrer">previous article</a> if you haven’t already. It includes a link to the original <a title="The Tail at Scale" href="https://www2.cs.duke.edu/courses/cps296.4/fall13/838-CloudPapers/dean_longtail.pdf" target="_blank" rel="noopener noreferrer">brilliant paper</a> and provides more background. The graph included in this article hopefully is a more useful, actionable tool in developing or refining objectives and seeing the relationships between backend performance and customer experience.</p>
|
||
<p>The paper also discusses mitigation techniques and we’ll demonstrate how amazingly effective they are in improving the user experience.</p>
|
||
<h2>Assumptions</h2>
|
||
<p>The relationships discussed are SLI (service level indicator) agnostic. While they may be most useful in developing latency time budgets for the back-end, it can also be used in looking at other indicators such as availability or error service levels.</p>
|
||
<p>The only requirement really is that there are a significant number of measurements; that the back-end responses are relatively independent and that the back end systems and responses are relatively the same. (Never entirely true, but the calculations here get us in the ballpark and are useful guidelines anyway.)</p>
|
||
<p> </p>
|
||
<h2>The Chart</h2>
|
||
<p>Service levels are often described as a percentage of success to meet objectives. They can also be described as the reciprocal of failure rates and we’ll show both in the following graphs. For example, an SLO of 75% would be a failure rate of 25% or 1/4 and the reciprocal would be shown as “4” along the left side of the chart.</p>
|
||
<figure id="attachment_936" aria-describedby="caption-attachment-936" style="width: 1200px" class="wp-caption alignnone"><img decoding="async" class="wp-image-936 size-full" src="https://billduncan.org/wp-content/uploads/2020/05/reverse-pdf.png" alt="SLA/SLO Rates" width="1200" height="800" srcset="https://billduncan.org/wp-content/uploads/2020/05/reverse-pdf.png 1200w, https://billduncan.org/wp-content/uploads/2020/05/reverse-pdf-300x200.png 300w, https://billduncan.org/wp-content/uploads/2020/05/reverse-pdf-1024x683.png 1024w, https://billduncan.org/wp-content/uploads/2020/05/reverse-pdf-768x512.png 768w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption id="caption-attachment-936" class="wp-caption-text">SLA/SLO Rates</figcaption></figure>
|
||
<p>(A PDF version of the chart is here.. <a href="https://billduncan.org/wp-content/uploads/2020/05/reverse-pdf.pdf">PDF_Chart</a>.)</p>
|
||
<p>The diagonal lines represent different service levels for each of the services in the backend. The number of services is along the bottom. To use the graph, pick any two of the variables and look up the third.</p>
|
||
<p>The calculations can obviously be done programmatically, but the chart is useful in seeing the sensitivity to changing the variables and doing <em>what-if</em> calculations while defining or refining your SLOs.</p>
|
||
<h2>An Example</h2>
|
||
<p>In my previous article I described a situation which was close to what I’d seen in the past. We’ll work through a similar example using a modified version of the chart to make it easier to describe.</p>
|
||
<p>To recap, we were achieving somewhere around 99.9% service level in each of the backend services. We had SLAs for some customers at the 90% level for latencies (it doesn’t matter what they were for this discussion). Obviously we wanted to do better than that to give us a buffer, so we’ll pick 95% as our internal SLO (objective) for the customer experience.</p>
|
||
<p>The smaller customers would be hitting maybe a few dozen services, usually less than 50. The <strong>#1</strong> marker in the chart along the bottom diagonal line for 99.9% backend SLO shows that we’re cool at this point. However as we move across to 500 systems for the larger clients, the customer experience sucks (becomes around 61% shown with marker <strong>#2</strong>).</p>
|
||
<p>To achieve our customer objective with 500 systems would require 4 nines, or 99.99% service level from the backend services as shown in <strong>#4</strong>. Ouch!</p>
|
||
<figure id="attachment_929" aria-describedby="caption-attachment-929" style="width: 1200px" class="wp-caption alignnone"><img decoding="async" class="size-full wp-image-929" src="https://billduncan.org/wp-content/uploads/2020/05/reverse-example.png" alt="Example Plot" width="1200" height="800" srcset="https://billduncan.org/wp-content/uploads/2020/05/reverse-example.png 1200w, https://billduncan.org/wp-content/uploads/2020/05/reverse-example-300x200.png 300w, https://billduncan.org/wp-content/uploads/2020/05/reverse-example-1024x683.png 1024w, https://billduncan.org/wp-content/uploads/2020/05/reverse-example-768x512.png 768w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption id="caption-attachment-929" class="wp-caption-text">Example used in the text</figcaption></figure>
|
||
<h2>Mitigation</h2>
|
||
<p>We were struggling to provide a service level of 3 nines in the backend. How would we accomplish 4 nines?!?</p>
|
||
<p>If we send the requests off to both replicas of each service, the success level increases dramatically. Using probability, most of the time (99.9%) the services will succeed. To calculate what happens when we contact two systems for each service, we need to find the intersection set of the inverse, when both systems in a service fails. They both fail at a rate of 1 in 1000. Square it and we get a failure rate of 1 in a million or 99.9999% success rate as shown with marker <strong>#3</strong>. That corresponds to a customer SLO/SLA rate of just one failure in 2000, or 99.95% !!</p>
|
||
<p>In fact, if we contact both replicas for each service, we can relax backend requirements to only 99% to get a combined 99.99%, to achieve our desired 95% customer SLO/SLA (as shown with marker <strong>#4 </strong>again).</p>
|
||
<h2>Deferred</h2>
|
||
<p>Possibly a better approach in some circumstances is to defer requests going out to the second replicas. Given the long tail of request latency outliers, we were finding that roughly 95% of the responses were completed by the backend in half the time budget. So, if we waited until half time to send requests out to the replicas, we’d only need to send them out to about 5% of the replicas and we’d get responses back from them at a success rate of about 95%. (We might also get the original requests back during that time, but we’d just throw away duplicate responses.)</p>
|
||
<p>Calculating the probability for this, we again use the inverse; the probability of both replicas failing. Multiplying out we have 1/1000 * 1/20 to get a combined failure rate of 1/20,000 or success rate of 99.995%. Better than 4 nines!!</p>
|
||
<p>Looking at marker <strong>#5</strong>, we can see that it corresponds to a customer service level of 97.5% or only 1 in 40 requests failing the objective with the large clients. More than enough headroom for the actual 90% SLAs and even some buffer available with our internal 95% SLO to account for growth to a thousand systems. Bonus is that smaller customers will achieve happiness at better than 99.75% of the time (marker <strong>#6</strong>)</p>
|
||
<h2>Conclusion</h2>
|
||
<p>Hopefully the chart will give you a better understanding of the relationship between customer SLO and backend SLO rates. It may be a starting point in understanding and discussing the service rates with engineering and support; what is desirable vs. what is possible. Print out the <a href="https://billduncan.org/wp-content/uploads/2020/05/reverse-pdf.pdf">PDF_Chart</a> and pass it around when discussing updates to the SLO.</p>
|
||
<p>Most of all, it hopefully demonstrates how involving replicas in the backend requests <em>dramatically</em> improves the user experience and/or relaxes the requirements for the backend.</p>
|
||
<p>Of course, all of this depends on specific circumstances with regard to other interactions and dependencies in your systems. YMMV, but may serve for setting guidelines with a better understanding. Leave yourself a margin in communicating objectives with customers and read the relevant chapters for setting SLO in the <a title="Google SRE Books" href="https://landing.google.com/sre/books/" target="_blank" rel="noopener noreferrer">Google Books. </a>Also remember that the time budget for the backend systems may be significantly less than the frontend SLO target.</p>
|
||
<p>Good luck!</p>
|
||
</div><!-- .entry-content -->
|
||
|
||
<footer class="entry-footer">
|
||
<span class="byline"><img alt='' src='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=49&d=mm&r=pg' srcset='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=98&d=mm&r=pg 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://billduncan.org/author/ve3ied/">bduncan</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://billduncan.org/the-tail-at-scale-revisited/" rel="bookmark"><time class="entry-date published" datetime="2020-05-24T15:32:54-04:00">2020-05-24</time><time class="updated" datetime="2020-05-30T12:21:27-04:00">2020-05-30</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://billduncan.org/category/detecting-performance-issues/" rel="category tag">Detecting Performance Issues</a>, <a href="https://billduncan.org/category/monitoring/" rel="category tag">Monitoring</a>, <a href="https://billduncan.org/category/sre/" rel="category tag">SRE</a>, <a href="https://billduncan.org/category/system-performance/" rel="category tag">System Performance</a></span> </footer><!-- .entry-footer -->
|
||
</article><!-- #post-919 -->
|
||
|
||
<div id="comments" class="comments-area">
|
||
|
||
<h2 class="comments-title">
|
||
5 thoughts on “The Tail at Scale Revisited” </h2>
|
||
|
||
|
||
<ol class="comment-list">
|
||
<li id="comment-352" class="comment byuser comment-author-ve3ied bypostauthor even thread-even depth-1">
|
||
<article id="div-comment-352" class="comment-body">
|
||
<footer class="comment-meta">
|
||
<div class="comment-author vcard">
|
||
<img alt='' src='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=42&d=mm&r=pg' srcset='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=84&d=mm&r=pg 2x' class='avatar avatar-42 photo' height='42' width='42' loading='lazy' decoding='async'/> <b class="fn">bduncan</b> <span class="says">says:</span> </div><!-- .comment-author -->
|
||
|
||
<div class="comment-metadata">
|
||
<a href="https://billduncan.org/the-tail-at-scale-revisited/#comment-352"><time datetime="2020-05-31T15:42:40-04:00">2020-05-31 at 15:42</time></a> </div><!-- .comment-metadata -->
|
||
|
||
</footer><!-- .comment-meta -->
|
||
|
||
<div class="comment-content">
|
||
<p>If there are any calculator geeks around, I wrote a small program for the HP-41C programmable calculator and have uploaded it here: <a href="https://www.hpmuseum.org/forum/thread-15091.html" rel="nofollow ugc">https://www.hpmuseum.org/forum/thread-15091.html</a></p>
|
||
</div><!-- .comment-content -->
|
||
|
||
</article><!-- .comment-body -->
|
||
</li><!-- #comment-## -->
|
||
<li id="comment-353" class="comment byuser comment-author-ve3ied bypostauthor odd alt thread-odd thread-alt depth-1">
|
||
<article id="div-comment-353" class="comment-body">
|
||
<footer class="comment-meta">
|
||
<div class="comment-author vcard">
|
||
<img alt='' src='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=42&d=mm&r=pg' srcset='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=84&d=mm&r=pg 2x' class='avatar avatar-42 photo' height='42' width='42' loading='lazy' decoding='async'/> <b class="fn">bduncan</b> <span class="says">says:</span> </div><!-- .comment-author -->
|
||
|
||
<div class="comment-metadata">
|
||
<a href="https://billduncan.org/the-tail-at-scale-revisited/#comment-353"><time datetime="2020-06-02T18:17:02-04:00">2020-06-02 at 18:17</time></a> </div><!-- .comment-metadata -->
|
||
|
||
</footer><!-- .comment-meta -->
|
||
|
||
<div class="comment-content">
|
||
<p>Close enough for horseshoes..</p>
|
||
<p>For every order of magnitude of number of systems, you need an order of magnitude better reliability in the backend.</p>
|
||
<p>eg. If you need one nine (90%) as your objective.. Your backend will need better than one nine with one system, two nines at 10 systems, three nines at 100 systems, four nines at 1000…</p>
|
||
</div><!-- .comment-content -->
|
||
|
||
</article><!-- .comment-body -->
|
||
</li><!-- #comment-## -->
|
||
<li id="comment-354" class="comment byuser comment-author-ve3ied bypostauthor even thread-even depth-1">
|
||
<article id="div-comment-354" class="comment-body">
|
||
<footer class="comment-meta">
|
||
<div class="comment-author vcard">
|
||
<img alt='' src='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=42&d=mm&r=pg' srcset='https://secure.gravatar.com/avatar/9ce8613e8528c4c7ee8688ca76ed48b04e3bca24bc5aab38416266ea89876147?s=84&d=mm&r=pg 2x' class='avatar avatar-42 photo' height='42' width='42' loading='lazy' decoding='async'/> <b class="fn">bduncan</b> <span class="says">says:</span> </div><!-- .comment-author -->
|
||
|
||
<div class="comment-metadata">
|
||
<a href="https://billduncan.org/the-tail-at-scale-revisited/#comment-354"><time datetime="2020-06-03T11:53:38-04:00">2020-06-03 at 11:53</time></a> </div><!-- .comment-metadata -->
|
||
|
||
</footer><!-- .comment-meta -->
|
||
|
||
<div class="comment-content">
|
||
<p>Another quick estimator.. If you involve two replicas for each service in the backend, you double the number of nines. eg. If you have 99% service level for backend services, hitting both replicas for the services would effectively be 99.99%. Three nines will give you six etc. If the last digit is greater than 7, add an additional nine. eg. 99.7% would be like five nines.</p>
|
||
</div><!-- .comment-content -->
|
||
|
||
</article><!-- .comment-body -->
|
||
</li><!-- #comment-## -->
|
||
<li id="comment-355" class="pingback odd alt thread-odd thread-alt depth-1">
|
||
<div class="comment-body">
|
||
Pingback: <a href="http://sreweekly.com/sre-weekly-issue-222/" class="url" rel="ugc external nofollow">SRE Weekly Issue #222 – SRE WEEKLY</a> </div>
|
||
</li><!-- #comment-## -->
|
||
<li id="comment-363" class="pingback even thread-even depth-1">
|
||
<div class="comment-body">
|
||
Pingback: <a href="https://billduncan.org/the-tail-at-scale-approximation/" class="url" rel="ugc">The Tail at Scale Approximation | bill duncan's blog</a> </div>
|
||
</li><!-- #comment-## -->
|
||
</ol><!-- .comment-list -->
|
||
|
||
|
||
|
||
<p class="no-comments">Comments are closed.</p>
|
||
|
||
|
||
</div><!-- .comments-area -->
|
||
|
||
<nav class="navigation post-navigation" aria-label="Posts">
|
||
<h2 class="screen-reader-text">Post navigation</h2>
|
||
<div class="nav-links"><div class="nav-previous"><a href="https://billduncan.org/the-tail-at-scale/" rel="prev"><span class="meta-nav" aria-hidden="true">Previous</span> <span class="screen-reader-text">Previous post:</span> <span class="post-title">The Tail at Scale</span></a></div><div class="nav-next"><a href="https://billduncan.org/riddler-can-you-solve-the-not-so-corn-maze/" rel="next"><span class="meta-nav" aria-hidden="true">Next</span> <span class="screen-reader-text">Next post:</span> <span class="post-title">Riddler: Can you solve the not-so-corn maze?</span></a></div></div>
|
||
</nav>
|
||
</main><!-- .site-main -->
|
||
|
||
|
||
</div><!-- .content-area -->
|
||
|
||
|
||
<aside id="secondary" class="sidebar widget-area">
|
||
<section id="search-2" class="widget widget_search">
|
||
<form role="search" method="get" class="search-form" action="https://billduncan.org/">
|
||
<label>
|
||
<span class="screen-reader-text">
|
||
Search for: </span>
|
||
<input type="search" class="search-field" placeholder="Search …" value="" name="s" />
|
||
</label>
|
||
<button type="submit" class="search-submit"><span class="screen-reader-text">
|
||
Search </span></button>
|
||
</form>
|
||
</section>
|
||
<section id="recent-posts-2" class="widget widget_recent_entries">
|
||
<h2 class="widget-title">Recent Posts</h2><nav aria-label="Recent Posts">
|
||
<ul>
|
||
<li>
|
||
<a href="https://billduncan.org/latencylens/">latencylens</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://billduncan.org/type-conversion/">Type Conversion</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://billduncan.org/ai-and-sre/">AI and SRE</a>
|
||
</li>
|
||
</ul>
|
||
|
||
</nav></section><section id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives">
|
||
<ul>
|
||
<li><a href='https://billduncan.org/2026/09/'>September 2026</a></li>
|
||
<li><a href='https://billduncan.org/2026/08/'>August 2026</a></li>
|
||
<li><a href='https://billduncan.org/2023/04/'>April 2023</a></li>
|
||
<li><a href='https://billduncan.org/2023/01/'>January 2023</a></li>
|
||
<li><a href='https://billduncan.org/2022/09/'>September 2022</a></li>
|
||
<li><a href='https://billduncan.org/2022/08/'>August 2022</a></li>
|
||
<li><a href='https://billduncan.org/2021/07/'>July 2021</a></li>
|
||
<li><a href='https://billduncan.org/2021/02/'>February 2021</a></li>
|
||
<li><a href='https://billduncan.org/2020/12/'>December 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/07/'>July 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/06/'>June 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/05/'>May 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/04/'>April 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/03/'>March 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/02/'>February 2020</a></li>
|
||
<li><a href='https://billduncan.org/2019/12/'>December 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/11/'>November 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/10/'>October 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/05/'>May 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/01/'>January 2019</a></li>
|
||
<li><a href='https://billduncan.org/2018/12/'>December 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/11/'>November 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/10/'>October 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/09/'>September 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/08/'>August 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/07/'>July 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/06/'>June 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/05/'>May 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/04/'>April 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/03/'>March 2018</a></li>
|
||
</ul>
|
||
|
||
</nav></section><section id="categories-2" class="widget widget_categories"><h2 class="widget-title">Categories</h2><nav aria-label="Categories">
|
||
<ul>
|
||
<li class="cat-item cat-item-97"><a href="https://billduncan.org/category/ai/">AI</a> (1)
|
||
</li>
|
||
<li class="cat-item cat-item-87"><a href="https://billduncan.org/category/aviation/">Aviation</a> (8)
|
||
</li>
|
||
<li class="cat-item cat-item-12"><a href="https://billduncan.org/category/code-bits/">Code Bits</a> (14)
|
||
</li>
|
||
<li class="cat-item cat-item-17"><a href="https://billduncan.org/category/data-corruption/">Data Corruption</a> (2)
|
||
</li>
|
||
<li class="cat-item cat-item-4"><a href="https://billduncan.org/category/detecting-performance-issues/">Detecting Performance Issues</a> (14)
|
||
</li>
|
||
<li class="cat-item cat-item-43"><a href="https://billduncan.org/category/devops/">devops</a> (27)
|
||
</li>
|
||
<li class="cat-item cat-item-11"><a href="https://billduncan.org/category/diagnosing-issues/">Diagnosing Issues</a> (9)
|
||
</li>
|
||
<li class="cat-item cat-item-51"><a href="https://billduncan.org/category/documentation/">Documentation</a> (5)
|
||
</li>
|
||
<li class="cat-item cat-item-67"><a href="https://billduncan.org/category/event-logs/">Event logs</a> (2)
|
||
</li>
|
||
<li class="cat-item cat-item-53"><a href="https://billduncan.org/category/geolocating/">Geolocating</a> (1)
|
||
</li>
|
||
<li class="cat-item cat-item-47"><a href="https://billduncan.org/category/golang/">golang</a> (1)
|
||
</li>
|
||
<li class="cat-item cat-item-16"><a href="https://billduncan.org/category/just-for-fun/">Just-for-Fun</a> (12)
|
||
</li>
|
||
<li class="cat-item cat-item-89"><a href="https://billduncan.org/category/k8s/">K8S</a> (2)
|
||
</li>
|
||
<li class="cat-item cat-item-68"><a href="https://billduncan.org/category/monitoring/">Monitoring</a> (4)
|
||
</li>
|
||
<li class="cat-item cat-item-58"><a href="https://billduncan.org/category/ot/">OT</a> (6)
|
||
</li>
|
||
<li class="cat-item cat-item-46"><a href="https://billduncan.org/category/problem-solving/">Problem Solving</a> (5)
|
||
</li>
|
||
<li class="cat-item cat-item-21"><a href="https://billduncan.org/category/r/">R</a> (2)
|
||
</li>
|
||
<li class="cat-item cat-item-60"><a href="https://billduncan.org/category/reading-week/">Reading Week</a> (6)
|
||
</li>
|
||
<li class="cat-item cat-item-78"><a href="https://billduncan.org/category/remotework/">RemoteWork</a> (2)
|
||
</li>
|
||
<li class="cat-item cat-item-44"><a href="https://billduncan.org/category/rtfm/">RTFM</a> (5)
|
||
</li>
|
||
<li class="cat-item cat-item-59"><a href="https://billduncan.org/category/security/">Security</a> (2)
|
||
</li>
|
||
<li class="cat-item cat-item-45"><a href="https://billduncan.org/category/sre/">SRE</a> (34)
|
||
</li>
|
||
<li class="cat-item cat-item-10"><a href="https://billduncan.org/category/system-performance/">System Performance</a> (13)
|
||
</li>
|
||
<li class="cat-item cat-item-1"><a href="https://billduncan.org/category/uncategorized/">Uncategorized</a> (2)
|
||
</li>
|
||
<li class="cat-item cat-item-61"><a href="https://billduncan.org/category/wfm/">WFM</a> (5)
|
||
</li>
|
||
</ul>
|
||
|
||
</nav></section><section id="archives-3" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives">
|
||
<ul>
|
||
<li><a href='https://billduncan.org/2026/09/'>September 2026</a></li>
|
||
<li><a href='https://billduncan.org/2026/08/'>August 2026</a></li>
|
||
<li><a href='https://billduncan.org/2023/04/'>April 2023</a></li>
|
||
<li><a href='https://billduncan.org/2023/01/'>January 2023</a></li>
|
||
<li><a href='https://billduncan.org/2022/09/'>September 2022</a></li>
|
||
<li><a href='https://billduncan.org/2022/08/'>August 2022</a></li>
|
||
<li><a href='https://billduncan.org/2021/07/'>July 2021</a></li>
|
||
<li><a href='https://billduncan.org/2021/02/'>February 2021</a></li>
|
||
<li><a href='https://billduncan.org/2020/12/'>December 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/07/'>July 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/06/'>June 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/05/'>May 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/04/'>April 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/03/'>March 2020</a></li>
|
||
<li><a href='https://billduncan.org/2020/02/'>February 2020</a></li>
|
||
<li><a href='https://billduncan.org/2019/12/'>December 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/11/'>November 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/10/'>October 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/05/'>May 2019</a></li>
|
||
<li><a href='https://billduncan.org/2019/01/'>January 2019</a></li>
|
||
<li><a href='https://billduncan.org/2018/12/'>December 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/11/'>November 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/10/'>October 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/09/'>September 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/08/'>August 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/07/'>July 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/06/'>June 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/05/'>May 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/04/'>April 2018</a></li>
|
||
<li><a href='https://billduncan.org/2018/03/'>March 2018</a></li>
|
||
</ul>
|
||
|
||
</nav></section> </aside><!-- .sidebar .widget-area -->
|
||
|
||
</div><!-- .site-content -->
|
||
|
||
<footer id="colophon" class="site-footer">
|
||
<nav class="main-navigation" aria-label="Footer Primary Menu">
|
||
<div class="menu-primary-menu-container"><ul id="menu-primary-menu-1" class="primary-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-15"><a href="https://billduncan.org">Home</a></li>
|
||
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-13"><a href="https://billduncan.org/about/">About Me</a></li>
|
||
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-12"><a href="https://billduncan.org/contact/">Contact bill duncan</a></li>
|
||
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-87"><a href="https://billduncan.org/references/">Links</a></li>
|
||
</ul></div> </nav><!-- .main-navigation -->
|
||
|
||
|
||
<div class="site-info">
|
||
<span class="site-title"><a href="https://billduncan.org/" rel="home">bill duncan's blog</a></span>
|
||
<a href="https://wordpress.org/" class="imprint">
|
||
Proudly powered by WordPress </a>
|
||
</div><!-- .site-info -->
|
||
</footer><!-- .site-footer -->
|
||
</div><!-- .site-inner -->
|
||
</div><!-- .site -->
|
||
|
||
<script type="speculationrules">
|
||
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/twentysixteen/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
|
||
</script>
|
||
<script async data-wp-strategy="async" id="trustedsite-badge-js" src="https://cdn.trustedsite.com/js/1.js"></script>
|
||
<script id="wp-emoji-settings" type="application/json">
|
||
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://billduncan.org/wp-includes/js/wp-emoji-release.min.js?ver=7.0.4"}}
|
||
</script>
|
||
<script type="module">
|
||
/*! This file is auto-generated */
|
||
var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
|
||
//# sourceURL=https://billduncan.org/wp-includes/js/wp-emoji-loader.min.js
|
||
</script>
|
||
</body>
|
||
</html>
|