1319 lines
116 KiB
HTML
1319 lines
116 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||
<meta name="mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-title" content="Engineering at Meta - Engineering at Meta Blog">
|
||
<meta property="fb:app_id" content="1425766027653270" />
|
||
<link rel="profile" href="http://gmpg.org/xfn/11">
|
||
<link rel="pingback" href="https://engineering.fb.com/xmlrpc.php">
|
||
<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' />
|
||
<script async src="https://engineering.fb.com/wp-content/themes/code-fb-com/dist/js/optimize.min.js"></script>
|
||
|
||
<!-- This site is optimized with the Yoast SEO Premium plugin v19.3 (Yoast SEO v27.3) - https://yoast.com/product/yoast-seo-premium-wordpress/ -->
|
||
<title>Simple Precision Time Protocol at Meta - Engineering at Meta</title>
|
||
<link rel="canonical" href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/" />
|
||
<meta name="twitter:label1" content="Written by" />
|
||
<meta name="twitter:data1" content="Oleg Obleukhov, Ahmad Byagowi" />
|
||
<meta name="twitter:label2" content="Est. reading time" />
|
||
<meta name="twitter:data2" content="11 minutes" />
|
||
<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/#article","isPartOf":{"@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/"},"author":[{"@id":"https:\/\/engineering.fb.com\/#\/schema\/person\/image\/5c4b775040a892703d52f0386b4ed13d"},{"@id":"https:\/\/engineering.fb.com\/#\/schema\/person\/image\/b5dacd8c2bc2dd51a8f029cefdfd2c2d"}],"headline":"Simple Precision Time Protocol at Meta","datePublished":"2024-02-07T17:00:06+00:00","dateModified":"2024-02-09T17:19:36+00:00","mainEntityOfPage":{"@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/"},"wordCount":2112,"publisher":{"@id":"https:\/\/engineering.fb.com\/#organization"},"image":{"@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/#primaryimage"},"thumbnailUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2024\/02\/Simple-PTP_SPTP.jpg","articleSection":["Connectivity","Data Center Engineering","Networking & Traffic","Production Engineering"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/","url":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/","name":"Simple Precision Time Protocol at Meta - Engineering at Meta","isPartOf":{"@id":"https:\/\/engineering.fb.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/#primaryimage"},"image":{"@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/#primaryimage"},"thumbnailUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2024\/02\/Simple-PTP_SPTP.jpg","datePublished":"2024-02-07T17:00:06+00:00","dateModified":"2024-02-09T17:19:36+00:00","breadcrumb":{"@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/#primaryimage","url":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2024\/02\/Simple-PTP_SPTP.jpg","contentUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2024\/02\/Simple-PTP_SPTP.jpg","width":1920,"height":1079},{"@type":"BreadcrumbList","@id":"https:\/\/engineering.fb.com\/2024\/02\/07\/production-engineering\/simple-precision-time-protocol-sptp-meta\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/engineering.fb.com\/"},{"@type":"ListItem","position":2,"name":"Simple Precision Time Protocol at Meta"}]},{"@type":"WebSite","@id":"https:\/\/engineering.fb.com\/#website","url":"https:\/\/engineering.fb.com\/","name":"Engineering at Meta","description":"Engineering at Meta Blog","publisher":{"@id":"https:\/\/engineering.fb.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/engineering.fb.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/engineering.fb.com\/#organization","name":"Meta","url":"https:\/\/engineering.fb.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/engineering.fb.com\/#\/schema\/logo\/image\/","url":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2023\/08\/Meta_lockup_positive-primary_RGB.jpg","contentUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2023\/08\/Meta_lockup_positive-primary_RGB.jpg","width":29011,"height":12501,"caption":"Meta"},"image":{"@id":"https:\/\/engineering.fb.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Engineering\/","https:\/\/x.com\/fb_engineering"]},[],{"@type":"Person","@id":"https:\/\/engineering.fb.com\/#\/schema\/person\/image\/5c4b775040a892703d52f0386b4ed13d","name":"Oleg Obleukhov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/engineering.fb.com\/#\/schema\/person\/image\/d59408ca3e16a8608b7228e1f136036b","url":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2020\/03\/olego.jpg?w=200&h=200&crop=1","contentUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2020\/03\/olego.jpg?w=200&h=200&crop=1","width":200,"height":200,"caption":"Oleg Obleukhov"},"description":"Production Engineer","url":"https:\/\/engineering.fb.com\/author\/oleg-obleukhov\/"},{"@type":"Person","@id":"https:\/\/engineering.fb.com\/#\/schema\/person\/image\/b5dacd8c2bc2dd51a8f029cefdfd2c2d","name":"Ahmad Byagowi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/engineering.fb.com\/#\/schema\/person\/image\/2b453cf08462d9f61b1ebe9e6b1395e6","url":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2021\/08\/233431691_582979779774890_8939834614528122823_n.jpg?w=580&h=326&crop=1","contentUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2021\/08\/233431691_582979779774890_8939834614528122823_n.jpg?w=580&h=326&crop=1","width":580,"height":326,"caption":"Ahmad Byagowi"},"description":"Ahmad Byagowi is a Research Scientist focused on Time and Frequency Synchronization in Hyper Scale Networks. Ahmad received his first Ph.D. (Dr. Techn.) from Vienna University of Technology (TUWIEN) under the supervision of Prof. Peter Kopacek working on distributed control systems in 2010. Following that, Byagowi went to the University of Manitoba, initially as a Post Doc fellow working with Prof. Zahra Moussavi working on game engines and virtual reality systems. Due to his interest in the project, Byagowi started a second Ph.D. and finished it in 2016. After that, Byagowi started working with Prof. Ramesh Raskar from the MIT Media Labs on haptic systems. This led him to Facebook as a visiting scholar. He was impressed by the research there and decided to join Facebook in 2017. Byagowi still holds an Adjunct Professor title with the University of Manitoba.","url":"https:\/\/engineering.fb.com\/author\/ahmad-byagowi\/"}]}</script>
|
||
<!-- / Yoast SEO Premium plugin. -->
|
||
|
||
|
||
<link rel='dns-prefetch' href='//secure.gravatar.com' />
|
||
<link rel='dns-prefetch' href='//v0.wordpress.com' />
|
||
<link rel="alternate" type="application/rss+xml" title="Engineering at Meta » Feed" href="https://engineering.fb.com/feed/" />
|
||
<link rel="alternate" type="application/rss+xml" title="Engineering at Meta » Comments Feed" href="https://engineering.fb.com/comments/feed/" />
|
||
<script async src="https://www.googleoptimize.com/optimize.js?id=OPT-TPNDQC5" onerror="dataLayer.hide.end && dataLayer.hide.end()"></script>
|
||
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://engineering.fb.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fengineering.fb.com%2F2024%2F02%2F07%2Fproduction-engineering%2Fsimple-precision-time-protocol-sptp-meta%2F" />
|
||
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://engineering.fb.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fengineering.fb.com%2F2024%2F02%2F07%2Fproduction-engineering%2Fsimple-precision-time-protocol-sptp-meta%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>
|
||
<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;word-break:normal!important}.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],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[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>
|
||
|
||
<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: #ffffff;--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--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);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}: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-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-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-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='all-css-12' href='https://engineering.fb.com/_static/??-eJyNjUsOwjAMRC9EaiqghQXiKFVqhzSQn+pEiNuTFJBAbNjZTzNv4BYFBp+UTxBt1sYzFKQpzpVz5WQ4QSUv0CDzCj6KaVJOMWAgJc5jwe7ZKTnAyVgSS6Jxxv90XRbv3YtKUeJVtF3TgguUbZHyJGdFkui+nMbrvxWD8QhjLvvAAY20wgYd+OupspM7tv3+sO533Wb7AImQY4U=' type='text/css' media='all' />
|
||
<script id="gdprconsent-js" src="https://engineering.fb.com/wp-content/plugins/wp-gdpr-consent/dist/gdprconsent.js?ver=2.0.0"></script>
|
||
<script id="gdprconsent-js-after">
|
||
if (window.gdprSafeTrack) {
|
||
window.gdprSafeTrack('https://www.googletagmanager.com/gtag/js?id=391063774');
|
||
window.gdprSafeTrack(function() {
|
||
var google_analytics_g4 = decodeURIComponent( '391063774' );
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
gtag('config', google_analytics_g4);
|
||
});
|
||
}
|
||
if (window.gdprSafeTrack) {
|
||
window.gdprSafeTrack(function() {
|
||
var google_tag_manager = decodeURIComponent( 'GTM-KZRLGZ8' );
|
||
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||
})(window,document,'script','dataLayer',google_tag_manager);
|
||
});
|
||
}
|
||
if (window.gdprSafeTrack) {
|
||
window.gdprSafeTrack(function() {
|
||
var facebook_pixel = decodeURIComponent( '660742068067366' );
|
||
!function(f,b,e,v,n,t,s)
|
||
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
||
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
|
||
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
|
||
n.queue=[];t=b.createElement(e);t.async=!0;
|
||
t.src=v;s=b.getElementsByTagName(e)[0];
|
||
s.parentNode.insertBefore(t,s)}(window, document,'script',
|
||
'https://connect.facebook.net/en_US/fbevents.js');
|
||
fbq('init', facebook_pixel);
|
||
fbq('track', 'PageView');
|
||
});
|
||
}
|
||
//# sourceURL=gdprconsent-js-after
|
||
</script>
|
||
<script type="text/javascript" src="https://engineering.fb.com/_static/??-eJzTLy/QzcxLzilNSS3WzwKiwtLUokoopZebmaeXVayjj0+Rbm5melFiSSpUsX2uraG5hbmZgYmloUkWAK+3Iic=" ></script><script type="text/javascript" src="https://engineering.fb.com/wp-content/themes/understrap/js/popper.min.js?m=1773259670g" ></script><link rel="https://api.w.org/" href="https://engineering.fb.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://engineering.fb.com/wp-json/wp/v2/posts/20914" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://engineering.fb.com/xmlrpc.php?rsd" />
|
||
<meta name="generator" content="WordPress 7.1" />
|
||
<link rel='shortlink' href='https://wp.me/pa0Lhq-5rk' />
|
||
<link rel="preload" href="https://engineering.fb.com/wp-content/themes/code-fb-com/fonts/FacebookReader-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous"><link rel="preload" href="https://engineering.fb.com/wp-content/themes/code-fb-com/fonts/FacebookReader-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"><link rel="preload" href="https://engineering.fb.com/wp-content/themes/code-fb-com/fonts/Optimistic_Display_W_Md.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
||
<!-- Jetpack Open Graph Tags -->
|
||
<meta property="og:type" content="article" />
|
||
<meta property="og:title" content="Simple Precision Time Protocol at Meta" />
|
||
<meta property="og:url" content="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/" />
|
||
<meta property="og:description" content="While deploying Precision Time Protocol (PTP) at Meta, we’ve developed a simplified version of the protocol (Simple Precision Time Protocol – SPTP), that can offer the same level of clock syn…" />
|
||
<meta property="article:published_time" content="2024-02-07T17:00:06+00:00" />
|
||
<meta property="article:modified_time" content="2024-02-09T17:19:36+00:00" />
|
||
<meta property="og:site_name" content="Engineering at Meta" />
|
||
<meta property="og:image" content="https://engineering.fb.com/wp-content/uploads/2024/02/Simple-PTP_SPTP.jpg" />
|
||
<meta property="og:image:width" content="1920" />
|
||
<meta property="og:image:height" content="1079" />
|
||
<meta property="og:image:alt" content="" />
|
||
<meta property="og:locale" content="en_US" />
|
||
<meta name="twitter:text:title" content="Simple Precision Time Protocol at Meta" />
|
||
<meta name="twitter:image" content="https://engineering.fb.com/wp-content/uploads/2024/02/Simple-PTP_SPTP.jpg?w=640" />
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
|
||
<!-- End Jetpack Open Graph Tags -->
|
||
<style id="wp-custom-css">
|
||
.table-of-contents {
|
||
position: sticky;
|
||
top: 20px;
|
||
background: #fff;
|
||
padding: 1em;
|
||
border: 1px solid #ddd;
|
||
border-radius: 8px;
|
||
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
||
max-width: 250px;
|
||
}
|
||
</style>
|
||
|
||
<link rel="shortcut icon" href="https://engineering.fb.com/wp-content/themes/code-fb-com/favicon.ico" />
|
||
</head>
|
||
|
||
<body class="wp-singular post-template-default single single-post postid-20914 single-format-standard wp-theme-understrap wp-child-theme-code-fb-com group-blog">
|
||
|
||
<div class="hfeed site" id="page">
|
||
|
||
<!-- ******************* The Navbar Area ******************* -->
|
||
<div class="wrapper-fluid wrapper-navbar" id="wrapper-navbar">
|
||
<a class="skip-link screen-reader-text sr-only" href="#content">
|
||
Skip to content </a>
|
||
|
||
<nav class="navbar navbar-expand-std">
|
||
|
||
<div class="nav-container">
|
||
|
||
|
||
<!-- Your site title as branding in the menu -->
|
||
|
||
<div class="nav-top-row">
|
||
|
||
<h1 class="navbar-brand mb-0">
|
||
<a rel="home" href="https://engineering.fb.com/" title="Engineering at Meta">
|
||
<img class="navbar-brand-logo" src="https://engineering.fb.com/wp-content/themes/code-fb-com/img/logo-meta.svg" class="navbar-brand-logo" alt="Engineering at Meta" width="215" height="40" loading="lazy">
|
||
</a>
|
||
</h1>
|
||
|
||
<!-- end custom logo -->
|
||
<label for="search" class="screen-reader-text">Search this site</label>
|
||
<input type="text" id="search" name="search" class="form-control-lg navbar-search" autocomplete="off">
|
||
|
||
<button class="navbar-toggler navbar-searchbar-toggler"
|
||
type="button"
|
||
data-toggle="collapse"
|
||
data-target="#searchbarDropdown"
|
||
aria-controls="searchbarDropdown"
|
||
aria-expanded="false"
|
||
aria-label="Toggle navigation">
|
||
<img src="https://engineering.fb.com/wp-content/themes/code-fb-com/img/icon-search.svg" class="navbar-mobile-search-icon" loading="lazy" width="24" height="25" />
|
||
</button>
|
||
|
||
<!-- desktop language menu (mobile language menu is implemented via jQuery)-->
|
||
<div class="notranslate nice-select navbar-language form-control">
|
||
</div>
|
||
|
||
<button class="navbar-toggler collapsed navbar-menu-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
|
||
<span class="icon-bar"></span>
|
||
<span class="icon-bar"></span>
|
||
<span class="icon-bar"></span>
|
||
</button>
|
||
|
||
</div>
|
||
|
||
<div class="navbar-border"></div>
|
||
|
||
<!-- The WordPress Menu goes here -->
|
||
<div id="navbarNavDropdown" class="collapse navbar-collapse"><ul id="main-menu" class="navbar-nav"><li id="menu-item-60" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-60 dropdown"><a title="Open Source" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle">Open Source <span class="caret"></span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 129 129" enable-background="new 0 0 129 129" width="12px" height="15px">
|
||
<polyline points="40 50 80 90 120 50" stroke="#adb1b8" stroke-width="10" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
|
||
</svg></a>
|
||
<ul class=" dropdown-menu" role="menu">
|
||
<li id="menu-item-12330" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-12330"><a title="Open Source" href="https://engineering.fb.com/category/open-source/" class="nav-link">Open Source</a></li>
|
||
<li id="menu-item-12331" class="menu-item menu-item-type-custom menu-item-object-custom nav-item menu-item-12331"><a title="Meta Open Source" href="https://opensource.fb.com" class="nav-link">Meta Open Source</a></li>
|
||
</ul>
|
||
</li>
|
||
<li id="menu-item-2686" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-2686 dropdown"><a title="Platforms" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle">Platforms <span class="caret"></span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 129 129" enable-background="new 0 0 129 129" width="12px" height="15px">
|
||
<polyline points="40 50 80 90 120 50" stroke="#adb1b8" stroke-width="10" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
|
||
</svg></a>
|
||
<ul class=" dropdown-menu" role="menu">
|
||
<li id="menu-item-65" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-65"><a title="Android" href="https://engineering.fb.com/category/android/" class="nav-link">Android</a></li>
|
||
<li id="menu-item-66" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-66"><a title="iOS" href="https://engineering.fb.com/category/ios/" class="nav-link">iOS</a></li>
|
||
<li id="menu-item-67" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-67"><a title="Web" href="https://engineering.fb.com/category/web/" class="nav-link">Web</a></li>
|
||
</ul>
|
||
</li>
|
||
<li id="menu-item-2682" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-2682 dropdown"><a title="Infrastructure Systems" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle">Infrastructure Systems <span class="caret"></span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 129 129" enable-background="new 0 0 129 129" width="12px" height="15px">
|
||
<polyline points="40 50 80 90 120 50" stroke="#adb1b8" stroke-width="10" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
|
||
</svg></a>
|
||
<ul class=" dropdown-menu" role="menu">
|
||
<li id="menu-item-218" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-218"><a title="Core Infra" href="https://engineering.fb.com/category/core-infra/" class="nav-link">Core Infra</a></li>
|
||
<li id="menu-item-219" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-219"><a title="Data Infrastructure" href="https://engineering.fb.com/category/data-infrastructure/" class="nav-link">Data Infrastructure</a></li>
|
||
<li id="menu-item-220" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-220"><a title="DevInfra" href="https://engineering.fb.com/category/developer-tools/" class="nav-link">DevInfra</a></li>
|
||
<li id="menu-item-226" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent nav-item menu-item-226"><a title="Production Engineering" href="https://engineering.fb.com/category/production-engineering/" class="nav-link">Production Engineering</a></li>
|
||
<li id="menu-item-227" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-227"><a title="Security & Privacy" href="https://engineering.fb.com/category/security/" class="nav-link">Security & Privacy</a></li>
|
||
<li id="menu-item-18607" class="menu-item menu-item-type-custom menu-item-object-custom nav-item menu-item-18607"><a title="Research Publications" href="https://research.facebook.com/publications/research-areas/systems-infrastructure/" class="nav-link">Research Publications</a></li>
|
||
</ul>
|
||
</li>
|
||
<li id="menu-item-2683" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-2683 dropdown"><a title="Physical Infrastructure" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle">Physical Infrastructure <span class="caret"></span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 129 129" enable-background="new 0 0 129 129" width="12px" height="15px">
|
||
<polyline points="40 50 80 90 120 50" stroke="#adb1b8" stroke-width="10" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
|
||
</svg></a>
|
||
<ul class=" dropdown-menu" role="menu">
|
||
<li id="menu-item-215" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent nav-item menu-item-215"><a title="Connectivity" href="https://engineering.fb.com/category/connectivity/" class="nav-link">Connectivity</a></li>
|
||
<li id="menu-item-216" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent nav-item menu-item-216"><a title="Data Center Engineering" href="https://engineering.fb.com/category/data-center-engineering/" class="nav-link">Data Center Engineering</a></li>
|
||
<li id="menu-item-217" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent nav-item menu-item-217"><a title="Networking & Traffic" href="https://engineering.fb.com/category/networking-traffic/" class="nav-link">Networking & Traffic</a></li>
|
||
<li id="menu-item-18608" class="menu-item menu-item-type-custom menu-item-object-custom nav-item menu-item-18608"><a title="Research Publications" href="https://research.facebook.com/publications/research-areas/networking-connectivity/" class="nav-link">Research Publications</a></li>
|
||
</ul>
|
||
</li>
|
||
<li id="menu-item-2684" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-2684 dropdown"><a title="Video Engineering & AR/VR" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle">Video Engineering & AR/VR <span class="caret"></span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 129 129" enable-background="new 0 0 129 129" width="12px" height="15px">
|
||
<polyline points="40 50 80 90 120 50" stroke="#adb1b8" stroke-width="10" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
|
||
</svg></a>
|
||
<ul class=" dropdown-menu" role="menu">
|
||
<li id="menu-item-225" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-225"><a title="Video Engineering" href="https://engineering.fb.com/category/video-engineering/" class="nav-link">Video Engineering</a></li>
|
||
<li id="menu-item-223" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-223"><a title="Virtual Reality" href="https://engineering.fb.com/category/virtual-reality/" class="nav-link">Virtual Reality</a></li>
|
||
<li id="menu-item-13388" class="menu-item menu-item-type-custom menu-item-object-custom nav-item menu-item-13388"><a title="Research Publications" href="https://research.facebook.com/publications/research-areas/augmented-reality-virtual-reality/" class="nav-link">Research Publications</a></li>
|
||
</ul>
|
||
</li>
|
||
<li id="menu-item-2685" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nav-item menu-item-2685 dropdown"><a title="Artificial Intelligence" href="#" data-toggle="dropdown" class="nav-link dropdown-toggle">Artificial Intelligence <span class="caret"></span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 129 129" enable-background="new 0 0 129 129" width="12px" height="15px">
|
||
<polyline points="40 50 80 90 120 50" stroke="#adb1b8" stroke-width="10" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
|
||
</svg></a>
|
||
<ul class=" dropdown-menu" role="menu">
|
||
<li id="menu-item-222" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-222"><a title="ML Applications" href="https://engineering.fb.com/category/ml-applications/" class="nav-link">ML Applications</a></li>
|
||
<li id="menu-item-221" class="menu-item menu-item-type-taxonomy menu-item-object-category nav-item menu-item-221"><a title="AI Research" href="https://engineering.fb.com/category/ai-research/" class="nav-link">AI Research</a></li>
|
||
<li id="menu-item-13387" class="menu-item menu-item-type-custom menu-item-object-custom nav-item menu-item-13387"><a title="Research Publications" href="https://ai.facebook.com/results/?content_types%5B0%5D=publication" class="nav-link">Research Publications</a></li>
|
||
</ul>
|
||
</li>
|
||
<li id="menu-item-228" class="menu-item menu-item-type-custom menu-item-object-custom nav-item menu-item-228"><a title="Watch Videos" href="/videos" class="nav-link">Watch Videos</a></li>
|
||
</ul></div> </div><!-- .container -->
|
||
|
||
<div class="search-container collapse" id="searchbarDropdown">
|
||
<div class="searchbar-search">
|
||
<div class="searchbar-container">
|
||
|
||
<div class="navbar-mobile-search-margin"></div>
|
||
<input type="text" name="search" placeholder="Search" class="form-control-lg navbar-mobile-search" autofocus autocomplete="off">
|
||
<button class="searchbar-clear">
|
||
<span class="icon-bar"></span>
|
||
<span class="icon-bar"></span>
|
||
<span class="icon-bar"></span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav><!-- .site-navigation -->
|
||
|
||
</div><!-- .wrapper-navbar end -->
|
||
|
||
<div class="wrapper" id="single-wrapper">
|
||
|
||
<div class="single-container row" id="content" tabindex="-1">
|
||
|
||
<!-- Do the left sidebar check. -->
|
||
|
||
|
||
|
||
<div class="content-area" id="primary">
|
||
<main class="site-main" id="main">
|
||
|
||
|
||
|
||
<article class="post-20914 post type-post status-publish format-standard has-post-thumbnail hentry category-connectivity category-data-center-engineering category-networking-traffic category-production-engineering fb_content_type-article" id="post-20914">
|
||
|
||
<header class="entry-header">
|
||
<div class="entry-meta">
|
||
POSTED ON <span class="posted-on entry-date"><time class="published updated" datetime="2024-02-07">FEBRUARY 7, 2024</time></span> TO <span class="cat-links"><a href="https://engineering.fb.com/category/connectivity/" rel="category tag">Connectivity</a>, <a href="https://engineering.fb.com/category/data-center-engineering/" rel="category tag">Data Center Engineering</a>, <a href="https://engineering.fb.com/category/networking-traffic/" rel="category tag">Networking & Traffic</a>, <a href="https://engineering.fb.com/category/production-engineering/" rel="category tag">Production Engineering</a></span>
|
||
<h1 class="entry-title"><div>Simple Precision Time Protocol at Meta</div></h1> </div><!-- .entry-meta -->
|
||
|
||
</header><!-- .entry-header -->
|
||
|
||
<figure id="post-feat-image-container">
|
||
<img width="1920" height="1079" src="https://engineering.fb.com/wp-content/uploads/2024/02/Simple-PTP_SPTP.jpg" class="wp-post-image" alt="" /> </figure>
|
||
|
||
<div class="entry-authors-social">
|
||
<div class="entry-authors">
|
||
By <a href="https://engineering.fb.com/author/oleg-obleukhov/" title="Posts by Oleg Obleukhov" class="author url fn" rel="author">Oleg Obleukhov</a>, <a href="https://engineering.fb.com/author/ahmad-byagowi/" title="Posts by Ahmad Byagowi" class="author url fn" rel="author">Ahmad Byagowi</a> </div>
|
||
</div>
|
||
|
||
|
||
<div class="entry-content">
|
||
|
||
<ul>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">While deploying Precision Time Protocol (PTP) at Meta, we’ve developed a simplified version of the protocol (Simple Precision Time Protocol – SPTP), that can offer the same level of clock synchronization as unicast PTPv2 more reliably and with fewer resources.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">In our own tests, SPTP boasts comparable performance to PTP, but with significant improvements in CPU, memory, and network utilization.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">We’ve made the source code for the SPTP client and server available on</span><a href="https://github.com/facebook/time"> <span style="font-weight: 400;">GitHub</span></a><span style="font-weight: 400;">.</span></li>
|
||
</ul>
|
||
<p><span style="font-weight: 400;">We’ve previously spoken in great detail about</span><a href="https://engineering.fb.com/2022/11/21/production-engineering/precision-time-protocol-at-meta/"> <span style="font-weight: 400;">how Precision Time Protocol is being deployed at Meta</span></a><span style="font-weight: 400;">, including </span><span style="font-weight: 400;">the protocol itself and Meta’s precision time architecture.</span></p>
|
||
<p><span style="font-weight: 400;">As we deployed PTP into one of our data centers, we were also evaluating and testing alternative PTP clients. In doing so, we soon realized that we could eliminate a lot of complexity in the PTP protocol itself that we experienced during data center deployments while still maintaining complete hardware compatibility with our existing equipment.</span></p>
|
||
<p><span style="font-weight: 400;">This is how the idea of Simple Precision Time Protocol (SPTP) was born. </span></p>
|
||
<p><span style="font-weight: 400;">But before we dive under the hood of SPTP we should explore why the IEEE 1588</span><a href="https://www.itu.int/rec/T-REC-G.8265.1/en"> <span style="font-weight: 400;">G8265.1</span></a><span style="font-weight: 400;"> and</span><a href="https://www.itu.int/rec/T-REC-G.8275.2/en"> <span style="font-weight: 400;">G8275.2</span></a><span style="font-weight: 400;"> unicast profiles (here, we just call them PTP) weren’t a perfect fit for our data center deployment.</span></p>
|
||
<h2><span style="font-weight: 400;">PTP and its limitations</span></h2>
|
||
<h3><span style="font-weight: 400;">Excessive network communication</span></h3>
|
||
<p><span style="font-weight: 400;">A typical IEEE 1588-2019 two-step PTPv2 unicast UDP flow consists of the following exchange:</span></p>
|
||
<figure id="attachment_20920" aria-describedby="caption-attachment-20920" style="width: 1024px" class="wp-caption alignnone"><img decoding="async" class="size-large wp-image-20920" src="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_Image1.png?w=1024" alt="" width="1024" height="562" srcset="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_Image1.png 1024w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_Image1.png?resize=916,503 916w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_Image1.png?resize=768,422 768w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_Image1.png?resize=96,53 96w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_Image1.png?resize=192,105 192w" sizes="(max-width: 992px) 100vw, 62vw" /><figcaption id="caption-attachment-20920" class="wp-caption-text">Figure 1: Typical two-step PTPv2 exchange.</figcaption></figure>
|
||
<p><span style="font-weight: 400;">This sequence repeats either in full or in part depending on the negotiation result. The exchange shown is one of many possible combinations. It may involve additional steps such as grant cancellation, grant cancellation acknowledgements, and so on.</span></p>
|
||
<p><span style="font-weight: 400;">The frequency of these messages may vary depending on the implementation and configuration. After completing negotiation, the frequency of some messages can change dynamically.</span></p>
|
||
<p><span style="font-weight: 400;">This design allows for a lot of flexibility, especially for less powerful equipment where resources are limited. In combination with multicast, it allows us to support a relatively large number of clients using either very old or embedded devices. For example, a PTP server can reject the request or confirm a less frequent exchange if the resources are exhausted.</span></p>
|
||
<p><span style="font-weight: 400;">This design, however, leads to excessive network communication, which is particularly visible on a</span><a href="https://engineering.fb.com/2021/08/11/open-source/time-appliance/"> <span style="font-weight: 400;">time appliance</span></a><span style="font-weight: 400;"> serving a large number of clients.</span></p>
|
||
<h3><span style="font-weight: 400;">State machine</span></h3>
|
||
<p><span style="font-weight: 400;">Due to the “subscription” model, both the PTP client and the server have to keep the state in memory. This approach comes with the tradeoffs such as:</span><span style="font-weight: 400;"><br />
|
||
</span></p>
|
||
<ul>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Excessive usage of resources such as memory and CPU.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Strict capacity limits that mean multicast support is required for large numbers of clients.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Code complexity.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Fragile state transitions.</span></li>
|
||
</ul>
|
||
<p><span style="font-weight: 400;">These issues can manifest, for example, in so-called abandoned syncs – situations where the work of a PTP client is interrupted (either forcefully stopped or crashed). Because the PTP server didn’t receive a cancellation signaling message it will keep sending sync and followup packets until the subscription expires (which may take hours). This leads to additional complexity and fragility in the system. </span></p>
|
||
<p><span style="font-weight: 400;"> </span><span style="font-weight: 400;">There are additional protocol design side effects such as:</span><span style="font-weight: 400;"><br />
|
||
</span></p>
|
||
<ul>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">An almost infinite Denial of Service Attack (DoS) amplification factor.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Server-driven communication with little control by the client.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Complete trust in the validity of server timestamps.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Asynchronous path delay calculations.</span></li>
|
||
</ul>
|
||
<p><span style="font-weight: 400;">In data centers, where communication is typically driven by hundreds of thousands of clients and multicast is not supported, these tradeoffs are very limiting. </span></p>
|
||
<h2><span style="font-weight: 400;">SPTP</span></h2>
|
||
<p><span style="font-weight: 400;">True to its name, SPTP significantly reduces the number of exchanges between a server and client, allowing for much more efficient network communication.</span></p>
|
||
<h3><span style="font-weight: 400;">Exchange</span></h3>
|
||
<figure id="attachment_20921" aria-describedby="caption-attachment-20921" style="width: 1024px" class="wp-caption alignnone"><img decoding="async" class="size-large wp-image-20921" src="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image2.jpg?w=1024" alt="" width="1024" height="1024" srcset="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image2.jpg 1080w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image2.jpg?resize=916,916 916w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image2.jpg?resize=768,768 768w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image2.jpg?resize=1024,1024 1024w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image2.jpg?resize=96,96 96w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image2.jpg?resize=192,192 192w" sizes="(max-width: 992px) 100vw, 62vw" /><figcaption id="caption-attachment-20921" class="wp-caption-text">Figure 2: Typical SPTP exchange.</figcaption></figure>
|
||
<p><span style="font-weight: 400;">In a typical SPTP exchange:</span><span style="font-weight: 400;"><br />
|
||
</span></p>
|
||
<ol>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">The client sends a delay request.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">The server responds with a sync.</span></li>
|
||
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">The server sends a followup/announce.</span></li>
|
||
</ol>
|
||
<p><span style="font-weight: 400;">The number of network exchanges is drastically reduced. Instead of 11 different network exchanges as shown on Figure 1 and the requirement for client and server state machines for the duration of the subscription, there are only three packets exchanged and no state needs to be preserved on either side. In the simplified exchange, every packet has an important role:</span></p>
|
||
<h4><span style="font-weight: 400;">Delay request</span></h4>
|
||
<p><span style="font-weight: 400;">A delay request initiates the SPTP exchange. It’s interpreted by a server not only as a standard delay request containing the correction field (CF1) of the transparent clock, but also as a signal to respond with sync and followup packets. Just like in a two-step PTPv2 exchange, it generates T3 upon departure from the client side and T4 upon arrival on the server side.</span></p>
|
||
<p><span style="font-weight: 400;">To distinguish between a PTPv2 delay request and a SPTP delay request, the PTP profile Specific 1 flag must be set by the client.</span></p>
|
||
<h4><span style="font-weight: 400;">Sync</span></h4>
|
||
<p><span style="font-weight: 400;">In response to a delay request, a sync packet would be sent containing the T4 generated at an earlier stage. Just like in a regular two-step PTPv2 exchange, a sync packet will generate a T1 upon departure from the server side. While in transit, the correction field of the packet (CF2) is populated by the network equipment.</span></p>
|
||
<h4><span style="font-weight: 400;">Followup/announce</span></h4>
|
||
<p><span style="font-weight: 400;">Following the sync packet, an announce packet is immediately sent containing T1 generated at a previous stage. In addition, the correction filed from the Delay Request field is populated by the CF1 value collected at an earlier stage. </span></p>
|
||
<p><span style="font-weight: 400;">The announce packet also contains typical PTPv2 information such as clock class, clock accuracy, and so on. On the client side, the arrival of the packet generates the T2 timestamp.</span></p>
|
||
<p><span style="font-weight: 400;">After a successful SPTP exchange, default two-step PTPv2 formulas for mean path delay and clock offset must be applied:</span></p>
|
||
<p style="text-align: center;"><em><span style="font-weight: 400;">mean_path_delay = ((T4 – T3) + (T2-T1) – CF1 -CF2)/2</span></em></p>
|
||
<p style="text-align: center;"><em><span style="font-weight: 400;">clock_offset = T2 – T1 – mean_path_delay</span></em></p>
|
||
<p><span style="font-weight: 400;">After every exchange the client has access to the announce message attributes such as time source, clock quality, etc., as well as the path delay and a calculated clock offset after every exchange with every server. And, because the exchange is client-driven, the offsets could be calculated at the exact same time. This avoids a situation where a client is following a faulty server and has no chance of detecting it.</span></p>
|
||
<figure id="attachment_20922" aria-describedby="caption-attachment-20922" style="width: 1024px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="size-large wp-image-20922" src="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image3.png?w=1024" alt="" width="1024" height="553" srcset="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image3.png 1408w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image3.png?resize=916,494 916w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image3.png?resize=768,415 768w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image3.png?resize=1024,553 1024w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image3.png?resize=96,52 96w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image3.png?resize=192,104 192w" sizes="auto, (max-width: 992px) 100vw, 62vw" /><figcaption id="caption-attachment-20922" class="wp-caption-text">Figure 3: Client following faulty Time Server 2 based on announce.</figcaption></figure>
|
||
<h3><span style="font-weight: 400;">Reliability</span></h3>
|
||
<p><span style="font-weight: 400;">We can also provide stronger reliability guarantees by using multi-clock reliance.</span></p>
|
||
<p><span style="font-weight: 400;">In our implementation for precision time synchronization, we provide time as well as a window of uncertainty (WOU) to the consumer application via the fbclock API. As we described in a previous blog post on</span><a href="https://engineering.fb.com/2022/11/21/production-engineering/precision-time-protocol-at-meta/"> <span style="font-weight: 400;">how PTP is being deployed at Meta</span></a><span style="font-weight: 400;"> the WOU is based on the observation of time sync errors for the minimum duration to have stationarity of the state of the system. </span></p>
|
||
<p><span style="font-weight: 400;">In addition, we’ve established a method based on a collection of clocks that each client can access for timing information that we call a </span><i><span style="font-weight: 400;">clock ensemble</span></i><span style="font-weight: 400;">. The clock ensemble operates in two modes, steady state and transient; where steady state is during normal operation and transient is in the case of holdover.</span></p>
|
||
<p><span style="font-weight: 400;">However, with a pool of N clocks, C, forming the clock ensemble, the question becomes which clocks to select for determining robustness and accurate timing information. Clocks that are not accurate are rejected (C_reject) and, thus, our ensemble size falls to N = C_total – C_reject. We employ two stages, one that is based on each individual clock, and the second that acts on the collection of valid clocks in the ensemble. </span></p>
|
||
<p><span style="font-weight: 400;">The first stage observes the previous measurements of each individual clock, where the main criteria is to reject outliers in the previous states of the clock. Once this criterion threshold is exceeded, the entire clock is rejected from the valid clock ensemble pool. This is based off</span><a href="https://www.statisticshowto.com/chauvenets-criterion/"> <span style="font-weight: 400;">Chauvenet’s criterion</span></a><span style="font-weight: 400;">, where the criterion is a probability band that is centered on the mean of the clock outputs (assuming a normal distribution during steady state). Based on the stationarity tests, we use a sample size of 400 previous clock outputs and calculate a maximum allowable deviation. </span></p>
|
||
<p><span style="font-weight: 400;">For example:</span></p>
|
||
<p><span style="font-weight: 400;"><img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20D_%7Bmax%7D%5Cge%20%5Cfrac%7B%7CC%20-%20%5Cbar%7BC%7D%7C%7D%7BS_%7Bc%7D%7D" />, where <img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20C" /> is the current clock output, <img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20%5Coverline%20C" /> </span><span style="font-weight: 400;">is the clock sample mean, and <img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20S_%7Bc%7D" /> </span><span style="font-weight: 400;">is the clock set standard deviation.</span></p>
|
||
<p><span style="font-weight: 400;">We find the probability that the current clock output is in disagreement with the previous 400 samples:</span></p>
|
||
<p><img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20%7BP_%7Bz%7D%20%3D%201%20-%20%5Cfrac%7B1%7D%7B4%28400%29%7D%20%5Capprox%200.9993%7D" /></p>
|
||
<p><span style="font-weight: 400;">Based on a window size of 400 previous samples, the maximum allowed deviation is:</span></p>
|
||
<p><img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20D_%7Bmax%7D%20%3D%203.2272" /></p>
|
||
<p><span style="font-weight: 400;">Now, the clock outputs are tested against this value. If they exceed the <img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20D_%7Bmax%7D" /> </span><span style="font-weight: 400;">they are rejected, an alert is raised, and a threshold counter is incremented. Once the rejection threshold is reached for an individual clock, this clock is entirely rejected.</span></p>
|
||
<p><span style="font-weight: 400;">Now, we enter the second stage of verifying the clock ensemble composed of the valid clocks. The second stage forms a weighted average of the non-rejected clocks in the valid clock ensemble, where each clock in the ensemble is reported as its sample size, mean, and variance. The average of the clocks’ means is the weighted average, where the weights are inversely proportional to the mean absolute deviations reported by each clock after applying Chauvenet’s criterion. </span></p>
|
||
<p><span style="font-weight: 400;">Now we can report the mean and variance of the clock ensemble, ensuring the clocks contained therewith are valid and not providing erroneous values. The confidence interval is scaled with the number of good clocks in the ensemble, where the higher the number of valid clocks out of the total clocks provides greater reliability.</span></p>
|
||
<p><span style="font-weight: 400;">For a number of hosts, we show that the distribution of clocks falls within the following heatmap:</span></p>
|
||
<figure id="attachment_20923" aria-describedby="caption-attachment-20923" style="width: 640px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="size-large wp-image-20923" src="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image4.png?w=640" alt="" width="640" height="480" srcset="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image4.png 640w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image4.png?resize=96,72 96w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image4.png?resize=192,144 192w" sizes="auto, (max-width: 992px) 100vw, 62vw" /><figcaption id="caption-attachment-20923" class="wp-caption-text">Figure 4: Offset distribution overlay of multiple clocks.</figcaption></figure>
|
||
<p><span style="font-weight: 400;">We calculate the variance, <img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20v_%7Bk%7D" /></span><span style="font-weight: 400;">, of each individual clock’s observations, then we calculate a weighted mean, <img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20w_%7Bk%7D" /></span><span style="font-weight: 400;">, taking into consideration the reciprocal of each clock’s variance as the weight.</span></p>
|
||
<p><img decoding="async" class="aligncenter" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20w_%7Bk%7D%20%3D%20%5Cfrac%7BC%7D%7B%5Csqrt%7B%5Cfrac%7Bv%7D%7Bk%7D%7D%7D%2C%20C%20%3D%20%5B%5Cfrac%7B1%7D%7Bk%7D%5Csum%20%5Cfrac%7B1%7D%7Bv_%7Bk%7D%7D%5D%5E%7B-1%7D" /></p>
|
||
<p><span style="font-weight: 400;">Due to independence of clocks, the variance of the weighted sum, <img decoding="async" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20w_%7Bk%7D" /></span><span style="font-weight: 400;">, is:</span></p>
|
||
<p><img decoding="async" class="aligncenter" src="https://latex.codecogs.com/png.latex?%5Cfn_cm%20%5Cfrac%7B1%7D%7Bk%7D%5Csum_%7B%7D%5E%7B%7D%5Cmathrm%7BW%7D_%7Bk%7D%5E%7B2%7Dv_%7Bk%7D%20%3D%20%5Csum_%7B%7D%5E%7B%7DC%5E%7B2%7D%20%3D%20N_%7Bw%7DC%5E%7B2%7D" /></p>
|
||
<p><span style="font-weight: 400;">In summary, we collect samples from a number of clock sources that form our clock ensemble. The overall precision and reliability of the provided data by SPTP is a function of the number of reliable and in distribution clocks forming the clock ensemble.</span></p>
|
||
<p><span style="font-weight: 400;">A future post will focus on this specifically. </span></p>
|
||
<h2><span style="font-weight: 400;">SPTP’s performance</span></h2>
|
||
<p><span style="font-weight: 400;">Let’s explore performance of the SPTP versus PTP.</span></p>
|
||
<p><span style="font-weight: 400;">Initial deployments to a single client confirmed no regression in the precision of the synchronization:</span></p>
|
||
<figure id="attachment_20981" aria-describedby="caption-attachment-20981" style="width: 1024px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="wp-image-20981 size-large" src="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png?w=1024" alt="" width="1024" height="404" srcset="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png 1999w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png?resize=916,362 916w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png?resize=768,303 768w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png?resize=1024,404 1024w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png?resize=1536,606 1536w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png?resize=96,38 96w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP-Figure-5-revision.png?resize=192,76 192w" sizes="auto, (max-width: 992px) 100vw, 62vw" /><figcaption id="caption-attachment-20981" class="wp-caption-text">Figure 5: Clock offset after switching from ptp4l and SPTP.</figcaption></figure>
|
||
<p><span style="font-weight: 400;">Repeating the same measurement after migration to SPTP produces a very similar result, only marginally different due to a statistical error:</span></p>
|
||
<figure id="attachment_20925" aria-describedby="caption-attachment-20925" style="width: 1024px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="size-large wp-image-20925" src="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?w=1024" alt="" width="1024" height="574" srcset="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png 1999w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?resize=580,326 580w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?resize=916,514 916w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?resize=768,431 768w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?resize=1024,574 1024w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?resize=1536,861 1536w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?resize=96,54 96w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image6.png?resize=192,108 192w" sizes="auto, (max-width: 992px) 100vw, 62vw" /><figcaption id="caption-attachment-20925" class="wp-caption-text">Figure 6: P99.99 offset collected from over 100000 SPTP clients.</figcaption></figure>
|
||
<p><span style="font-weight: 400;">With large-scale deployment of our implementations, we can confirm resource utilization improvements.</span></p>
|
||
<p><span style="font-weight: 400;">We noticed that due to the difference in multi-server support, the performance gains vary significantly depending on the number of tracked time servers.</span></p>
|
||
<p><span style="font-weight: 400;">For example, with just a single time appliance serving the entire network there are significant improvements across the board. Most notably over 40 percent CPU, 70 percent memory, and 50 percent network utilization improvements:</span></p>
|
||
<figure id="attachment_20926" aria-describedby="caption-attachment-20926" style="width: 1024px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="size-large wp-image-20926" src="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png?w=1024" alt="" width="1024" height="574" srcset="https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png 1234w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png?resize=580,326 580w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png?resize=916,514 916w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png?resize=768,431 768w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png?resize=1024,574 1024w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png?resize=96,54 96w, https://engineering.fb.com/wp-content/uploads/2024/02/SPTP_image7.png?resize=192,108 192w" sizes="auto, (max-width: 992px) 100vw, 62vw" /><figcaption id="caption-attachment-20926" class="wp-caption-text">Figure 7: Packets per second with ptp4l (green) vs SPTP (blue).</figcaption></figure>
|
||
<h2><span style="font-weight: 400;">The next steps for SPTP at Meta</span></h2>
|
||
<p><span style="font-weight: 400;">Since SPTP can offer the exact same level of synchronization with a lot fewer resources consumed, we think it’s a reasonable alternative to the existing unicast PTP profiles.</span></p>
|
||
<p><span style="font-weight: 400;">In a large-scale data center deployment, it can help to combat frequently changing network paths and create savings in terms of network traffic, memory usage, and number of CPU cycles.</span></p>
|
||
<p><span style="font-weight: 400;">It will also eliminate a lot of complexity inherited from multicast PTP profiles, which is not necessarily useful in the trusted networks of the modern data centers.</span></p>
|
||
<p><span style="font-weight: 400;">It should be noted that SPTP may not be suitable for systems that still require subscription and authentication. But this could be solved by using PTP TLVs (type-length-value). </span></p>
|
||
<p><span style="font-weight: 400;">Additionally, by removing the need for subscriptions, it’s possible to observe multiple clocks – which allows us to provide higher reliability by comparing the time sync from multiple sources at the end node.</span></p>
|
||
<p><span style="font-weight: 400;">SPTP can offer significantly simpler, faster, and more reliable synchronization. Similar to G.8265.1 and G.8275.2 it provides excellent synchronization quality using a different set of parameters. Simplification comes with certain tradeoffs, such as missing signaling messages, that users need to be aware of and decide which profile is the best for them.</span></p>
|
||
<p><span style="font-weight: 400;">Having it standardized and assigned a unicast profile identifier will encourage wider support, adoption, and popularization of PTP as a default precise time synchronization protocol.</span></p>
|
||
<p><span style="font-weight: 400;">The source code for the SPTP client and the server can be accessed on our</span><a href="https://github.com/facebook/time"> <span style="font-weight: 400;">GitHub page</span></a><span style="font-weight: 400;">.</span></p>
|
||
<h2><i><span style="font-weight: 400;">Acknowledgements</span></i></h2>
|
||
<p><em>We would like to thank Alexander Bulimov, Vadim Fedorenko, and Mike Lambeta for their help implementing the code and the math for this article.</em></p>
|
||
<div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-facebook"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-facebook-20914"
|
||
class="share-facebook sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=facebook"
|
||
target="_blank"
|
||
aria-labelledby="sharing-facebook-20914"
|
||
>
|
||
<span id="sharing-facebook-20914" hidden>Share on Facebook (Opens in new window)</span>
|
||
<span>Facebook</span>
|
||
</a></li><li class="share-threads"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-threads-20914"
|
||
class="share-threads sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=threads"
|
||
target="_blank"
|
||
aria-labelledby="sharing-threads-20914"
|
||
>
|
||
<span id="sharing-threads-20914" hidden>Share on Threads (Opens in new window)</span>
|
||
<span>Threads</span>
|
||
</a></li><li class="share-jetpack-whatsapp"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-whatsapp-20914"
|
||
class="share-jetpack-whatsapp sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=jetpack-whatsapp"
|
||
target="_blank"
|
||
aria-labelledby="sharing-whatsapp-20914"
|
||
>
|
||
<span id="sharing-whatsapp-20914" hidden>Share on WhatsApp (Opens in new window)</span>
|
||
<span>WhatsApp</span>
|
||
</a></li><li class="share-linkedin"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-linkedin-20914"
|
||
class="share-linkedin sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=linkedin"
|
||
target="_blank"
|
||
aria-labelledby="sharing-linkedin-20914"
|
||
>
|
||
<span id="sharing-linkedin-20914" hidden>Share on LinkedIn (Opens in new window)</span>
|
||
<span>LinkedIn</span>
|
||
</a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-reddit-20914"
|
||
class="share-reddit sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=reddit"
|
||
target="_blank"
|
||
aria-labelledby="sharing-reddit-20914"
|
||
>
|
||
<span id="sharing-reddit-20914" hidden>Share on Reddit (Opens in new window)</span>
|
||
<span>Reddit</span>
|
||
</a></li><li class="share-x"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-x-20914"
|
||
class="share-x sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=x"
|
||
target="_blank"
|
||
aria-labelledby="sharing-x-20914"
|
||
>
|
||
<span id="sharing-x-20914" hidden>Share on X (Opens in new window)</span>
|
||
<span>X</span>
|
||
</a></li><li class="share-bluesky"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-bluesky-20914"
|
||
class="share-bluesky sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=bluesky"
|
||
target="_blank"
|
||
aria-labelledby="sharing-bluesky-20914"
|
||
>
|
||
<span id="sharing-bluesky-20914" hidden>Share on Bluesky (Opens in new window)</span>
|
||
<span>Bluesky</span>
|
||
</a></li><li class="share-mastodon"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-mastodon-20914"
|
||
class="share-mastodon sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=mastodon"
|
||
target="_blank"
|
||
aria-labelledby="sharing-mastodon-20914"
|
||
>
|
||
<span id="sharing-mastodon-20914" hidden>Share on Mastodon (Opens in new window)</span>
|
||
<span>Mastodon</span>
|
||
</a></li><li class="share-custom share-custom-hackernews"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-custom-20914"
|
||
class="share-custom share-custom-hackernews sd-button share-icon"
|
||
href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=custom-1699562127"
|
||
target="_blank"
|
||
aria-labelledby="sharing-custom-20914"
|
||
>
|
||
<span id="sharing-custom-20914" hidden>Share on Hacker News (Opens in new window)</span>
|
||
<span style="background-image:url("https://news.ycombinator.com/y18.svg");">Hacker News</span>
|
||
</a></li><li class="share-email"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-email-20914"
|
||
class="share-email sd-button share-icon"
|
||
href="mailto:?subject=%5BShared%20Post%5D%20Simple%20Precision%20Time%20Protocol%20at%20Meta&body=https%3A%2F%2Fengineering.fb.com%2F2024%2F02%2F07%2Fproduction-engineering%2Fsimple-precision-time-protocol-sptp-meta%2F&share=email"
|
||
target="_blank"
|
||
aria-labelledby="sharing-email-20914"
|
||
data-email-share-error-title="Do you have email set up?" data-email-share-error-text="If you're having problems sharing via email, you might not have email set up for your browser. You may need to create a new email yourself." data-email-share-nonce="8fa9c4e6d9" data-email-share-track-url="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/?share=email">
|
||
<span id="sharing-email-20914" hidden>Email a link to a friend (Opens in new window)</span>
|
||
<span>Email</span>
|
||
</a></li><li class="share-end"></li></ul></div></div></div>
|
||
|
||
</div><!-- .entry-content -->
|
||
|
||
|
||
</article><!-- #post-## -->
|
||
|
||
<footer class="entry-footer">
|
||
|
||
|
||
</footer><!-- .entry-footer -->
|
||
|
||
<div class="fb-like"
|
||
data-href="https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/"
|
||
data-width=""
|
||
data-layout="standard"
|
||
data-action="like"
|
||
data-size="small"
|
||
data-share="true">
|
||
</div>
|
||
|
||
|
||
<div class="related-articles">
|
||
<div class="related-articles__header">
|
||
<h3 class="related-articles__header__headline">Read More in Connectivity</h3>
|
||
<a
|
||
aria-label="View all articles in this Connectivity"
|
||
class="related-articles__header__link"
|
||
href="https://engineering.fb.com/category/connectivity/"
|
||
>
|
||
View All </a>
|
||
</div>
|
||
|
||
<div class="article-grids related-articles__grid">
|
||
<div class="row">
|
||
<div class="article-grid col-12 col-md-4">
|
||
|
||
<article class="post post-20914 type-post status-publish format-standard has-post-thumbnail hentry category-connectivity category-data-center-engineering category-networking-traffic category-production-engineering fb_content_type-article" id="post-23313">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2025/11/2Africa-Completion-Hero.png?w=580&h=326&crop=1" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" />
|
||
<header class="entry-header">
|
||
<div class="entry-header__top">
|
||
<span class="posted-on">
|
||
<time class="entry-date published" datetime="2025-11-17T22:00:58-08:00">
|
||
NOV 17, 2025 </time>
|
||
</span>
|
||
</div>
|
||
|
||
<div class="entry-title">
|
||
<div>
|
||
<a href="https://engineering.fb.com/2025/11/17/connectivity/core-2africa-system-completion-future-connectivity/" rel="bookmark" aria-label="Read More about Announcing the Completion of the Core 2Africa System: Building the Future of Connectivity Together">
|
||
Announcing the Completion of the Core 2Africa System: Building the Future of Connectivity Together </a>
|
||
</div>
|
||
</div>
|
||
|
||
</header><!-- .entry-header -->
|
||
|
||
</article><!-- #post-## -->
|
||
</div><!-- /.article-grid -->
|
||
<div class="article-grid col-12 col-md-4">
|
||
|
||
<article class="post post-20914 type-post status-publish format-standard has-post-thumbnail hentry category-connectivity category-data-center-engineering category-networking-traffic category-production-engineering fb_content_type-article" id="post-23046">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2025/10/APAC_Subsea_Cables_Blog_Post_Visual_2025_01_updated_10012025.png?w=580&h=326&crop=1" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" />
|
||
<header class="entry-header">
|
||
<div class="entry-header__top">
|
||
<span class="posted-on">
|
||
<time class="entry-date published" datetime="2025-10-05T19:30:07-07:00">
|
||
OCT 5, 2025 </time>
|
||
</span>
|
||
</div>
|
||
|
||
<div class="entry-title">
|
||
<div>
|
||
<a href="https://engineering.fb.com/2025/10/05/connectivity/introducing-the-candle-subsea-cable-updates-to-our-asia-pacific-connectivity-projects/" rel="bookmark" aria-label="Read More about Introducing the Candle Subsea Cable, Updates to Our Asia-Pacific Connectivity Projects">
|
||
Introducing the Candle Subsea Cable, Updates to Our Asia-Pacific Connectivity Projects </a>
|
||
</div>
|
||
</div>
|
||
|
||
</header><!-- .entry-header -->
|
||
|
||
</article><!-- #post-## -->
|
||
</div><!-- /.article-grid -->
|
||
<div class="article-grid col-12 col-md-4">
|
||
|
||
<article class="post post-20914 type-post status-publish format-standard has-post-thumbnail hentry category-connectivity category-data-center-engineering category-networking-traffic category-production-engineering fb_content_type-article" id="post-22560">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2025/05/Rio-de-Janeiro-landing.png?w=580&h=326&crop=1" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" />
|
||
<header class="entry-header">
|
||
<div class="entry-header__top">
|
||
<span class="posted-on">
|
||
<time class="entry-date published" datetime="2025-05-22T09:00:08-07:00">
|
||
MAY 22, 2025 </time>
|
||
</span>
|
||
</div>
|
||
|
||
<div class="entry-title">
|
||
<div>
|
||
<a href="https://engineering.fb.com/2025/05/22/connectivity/extending-malbec-subsea-cable-southern-brazil/" rel="bookmark" aria-label="Read More about Extending the Malbec subsea cable to Southern Brazil">
|
||
Extending the Malbec subsea cable to Southern Brazil </a>
|
||
</div>
|
||
</div>
|
||
|
||
</header><!-- .entry-header -->
|
||
|
||
</article><!-- #post-## -->
|
||
</div><!-- /.article-grid -->
|
||
<div class="article-grid col-12 col-md-4">
|
||
|
||
<article class="post post-20914 type-post status-publish format-standard has-post-thumbnail hentry category-connectivity category-data-center-engineering category-networking-traffic category-production-engineering fb_content_type-article" id="post-22481">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2025/05/MTP74_FBLI_1200_630-1.png?w=580&h=326&crop=1" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" title="MTP74_FBLI_1200_630 (1)" />
|
||
<header class="entry-header">
|
||
<div class="entry-header__top">
|
||
<span class="posted-on">
|
||
<time class="entry-date published" datetime="2025-05-01T11:48:02-07:00">
|
||
MAY 1, 2025 </time>
|
||
</span>
|
||
</div>
|
||
|
||
<div class="entry-title">
|
||
<div>
|
||
<a href="https://engineering.fb.com/2025/05/01/connectivity/taking-the-plunge-the-engineering-journey-of-building-a-subsea-cable/" rel="bookmark" aria-label="Read More about Taking the plunge: The engineering journey of building a subsea cable">
|
||
Taking the plunge: The engineering journey of building a subsea cable </a>
|
||
</div>
|
||
</div>
|
||
|
||
</header><!-- .entry-header -->
|
||
|
||
</article><!-- #post-## -->
|
||
</div><!-- /.article-grid -->
|
||
<div class="article-grid col-12 col-md-4">
|
||
|
||
<article class="post post-20914 type-post status-publish format-standard has-post-thumbnail hentry category-connectivity category-data-center-engineering category-networking-traffic category-production-engineering fb_content_type-article" id="post-22278">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2025/02/Cable-Landing_Project-Waterworth.png?w=580&h=326&crop=1" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" />
|
||
<header class="entry-header">
|
||
<div class="entry-header__top">
|
||
<span class="posted-on">
|
||
<time class="entry-date published" datetime="2025-02-14T08:28:06-08:00">
|
||
FEB 14, 2025 </time>
|
||
</span>
|
||
</div>
|
||
|
||
<div class="entry-title">
|
||
<div>
|
||
<a href="https://engineering.fb.com/2025/02/14/connectivity/project-waterworth-ai-subsea-infrastructure/" rel="bookmark" aria-label="Read More about Unlocking global AI potential with next-generation subsea infrastructure">
|
||
Unlocking global AI potential with next-generation subsea infrastructure </a>
|
||
</div>
|
||
</div>
|
||
|
||
</header><!-- .entry-header -->
|
||
|
||
</article><!-- #post-## -->
|
||
</div><!-- /.article-grid -->
|
||
<div class="article-grid col-12 col-md-4">
|
||
|
||
<article class="post post-20914 type-post status-publish format-standard has-post-thumbnail hentry category-connectivity category-data-center-engineering category-networking-traffic category-production-engineering fb_content_type-article" id="post-22128">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2025/01/Meta-ILA-Evo-HERO-Render-SMALL.jpg?w=580&h=326&crop=1" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" />
|
||
<header class="entry-header">
|
||
<div class="entry-header__top">
|
||
<span class="posted-on">
|
||
<time class="entry-date published" datetime="2025-01-10T09:00:20-08:00">
|
||
JAN 10, 2025 </time>
|
||
</span>
|
||
</div>
|
||
|
||
<div class="entry-title">
|
||
<div>
|
||
<a href="https://engineering.fb.com/2025/01/10/production-engineering/ila-evo-in-line-amplifier-sites-meta/" rel="bookmark" aria-label="Read More about ILA Evo: Meta’s journey to reimagine fiber optic in-line amplifier sites">
|
||
ILA Evo: Meta’s journey to reimagine fiber optic in-line amplifier sites </a>
|
||
</div>
|
||
</div>
|
||
|
||
</header><!-- .entry-header -->
|
||
|
||
</article><!-- #post-## -->
|
||
</div><!-- /.article-grid -->
|
||
</div><!-- /.row -->
|
||
</div><!--/.article-grids -->
|
||
|
||
</div><!-- /.related-articles -->
|
||
|
||
|
||
<!-- include the carousel nav here. -->
|
||
|
||
|
||
|
||
|
||
</main><!-- #main -->
|
||
|
||
</div><!-- #primary -->
|
||
|
||
<!-- Do the right sidebar check. -->
|
||
|
||
|
||
|
||
|
||
<div class="col-md-4 widget-area" id="right-sidebar" role="complementary">
|
||
<aside id="fb_related_post_widget-4" class="widget widget_fb_related_post_widget"><h3 class="widget-title">Related Posts</h3><hr>
|
||
<div class="aside-related-projects"><div class="article-grid-redesign">
|
||
<article class="post-19686 post type-post status-publish has-post-thumbnail hentry" id="post-19686">
|
||
<a href="https://engineering.fb.com/2022/11/21/production-engineering/precision-time-protocol-at-meta/" rel="bookmark" aria-label="Read More about How Precision Time Protocol is being deployed at Meta">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2022/11/CD22-717-Eng-PTP-DeepDive-Hero-02.jpg?w=580&h=326&crop=1" class="wp-post-image" alt="" srcset="https://engineering.fb.com/wp-content/uploads/2022/11/CD22-717-Eng-PTP-DeepDive-Hero-02.jpg?w=580&h=326&crop=1 580w, https://engineering.fb.com/wp-content/uploads/2022/11/CD22-717-Eng-PTP-DeepDive-Hero-02.jpg?w=580&h=326&crop=1 326w" sizes="(max-width: 580px) 100vw, 580px" loading="lazy">
|
||
<header class="entry-header">
|
||
<span class="posted-on"><time class="entry-date published" datetime="Nov 21, 2022">Nov 21, 2022</time></span>
|
||
<h4 class="entry-title">How Precision Time Protocol is being deployed at Meta</h4>
|
||
</header><!-- .entry-header -->
|
||
</a>
|
||
</article><!-- #post-## -->
|
||
</div><div class="article-grid-redesign">
|
||
<article class="post-19052 post type-post status-publish has-post-thumbnail hentry" id="post-19052">
|
||
<a href="https://engineering.fb.com/2022/07/25/production-engineering/its-time-to-leave-the-leap-second-in-the-past/" rel="bookmark" aria-label="Read More about It’s time to leave the leap second in the past">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2022/07/CD22_475-Eng-Blog-Metas-Position-on-the-Leap-Second_Hero_Static2.jpg?w=580&h=326&crop=1" class="wp-post-image" alt="" srcset="https://engineering.fb.com/wp-content/uploads/2022/07/CD22_475-Eng-Blog-Metas-Position-on-the-Leap-Second_Hero_Static2.jpg?w=580&h=326&crop=1 580w, https://engineering.fb.com/wp-content/uploads/2022/07/CD22_475-Eng-Blog-Metas-Position-on-the-Leap-Second_Hero_Static2.jpg?w=580&h=326&crop=1 326w" sizes="(max-width: 580px) 100vw, 580px" loading="lazy">
|
||
<header class="entry-header">
|
||
<span class="posted-on"><time class="entry-date published" datetime="Jul 25, 2022">Jul 25, 2022</time></span>
|
||
<h4 class="entry-title">It’s time to leave the leap second in the past</h4>
|
||
</header><!-- .entry-header -->
|
||
</a>
|
||
</article><!-- #post-## -->
|
||
</div><div class="article-grid-redesign">
|
||
<article class="post-17988 post type-post status-publish has-post-thumbnail hentry" id="post-17988">
|
||
<a href="https://engineering.fb.com/2021/08/11/open-source/time-appliance/" rel="bookmark" aria-label="Read More about Open-sourcing a more precise time appliance">
|
||
<img width="580" height="326" src="https://engineering.fb.com/wp-content/uploads/2021/08/CD21_391-Eng-Blog-Facebook-Time-Appliances-Hero-image-v2.jpg?w=580&h=326&crop=1" class="wp-post-image" alt="" srcset="https://engineering.fb.com/wp-content/uploads/2021/08/CD21_391-Eng-Blog-Facebook-Time-Appliances-Hero-image-v2.jpg?w=580&h=326&crop=1 580w, https://engineering.fb.com/wp-content/uploads/2021/08/CD21_391-Eng-Blog-Facebook-Time-Appliances-Hero-image-v2.jpg?w=580&h=326&crop=1 326w" sizes="(max-width: 580px) 100vw, 580px" loading="lazy">
|
||
<header class="entry-header">
|
||
<span class="posted-on"><time class="entry-date published" datetime="Aug 11, 2021">Aug 11, 2021</time></span>
|
||
<h4 class="entry-title">Open-sourcing a more precise time appliance</h4>
|
||
</header><!-- .entry-header -->
|
||
</a>
|
||
</article><!-- #post-## -->
|
||
</div></div></aside><aside id="wpb_widget-3" class="widget widget_wpb_widget"><h3 class="widget-title">Related Positions</h3><hr><ul class="available-positions-list"><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/2278965319592702/>
|
||
<div class="job-description">
|
||
Data Governance Lead, Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
BELLEVUE, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/2278965319592702/>
|
||
<div class="job-description">
|
||
Data Governance Lead, Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
MENLO PARK, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/2278965319592702/>
|
||
<div class="job-description">
|
||
Data Governance Lead, Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
SEATTLE, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/1458825126087114/>
|
||
<div class="job-description">
|
||
Generator Engineer, Data Center Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
RESTON, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/1458825126087114/>
|
||
<div class="job-description">
|
||
Generator Engineer, Data Center Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
MENLO PARK, US
|
||
</div>
|
||
</a>
|
||
</li> </ul>
|
||
<a href="https://www.metacareers.com">
|
||
<div class="btn available-positions-btn">
|
||
See All Jobs </div>
|
||
</a>
|
||
</aside>
|
||
</div><!-- #secondary -->
|
||
|
||
|
||
|
||
<!-- <php get_template_part('content-single-side-bar'); ?> -->
|
||
|
||
<!-- Do the right sidebar check. -->
|
||
|
||
</div><!-- Container end -->
|
||
|
||
</div><!-- Wrapper end -->
|
||
|
||
</div>
|
||
|
||
<!-- ******************* The Footer Full-width Widget Area ******************* -->
|
||
|
||
<div class="wrapper wrapper-community-outer">
|
||
<div class="wrapper-community">
|
||
|
||
<div class="community" tabindex="-1">
|
||
|
||
<div class="row">
|
||
<!-- community section is generated through WordPress widget -->
|
||
<div id="wpb_widget-2" class="footer-widget widget_wpb_widget widget-count-3 col-md-4"><h3 class="widget-title">Available Positions</h3><hr><ul class="available-positions-list"><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/2278965319592702/>
|
||
<div class="job-description">
|
||
Data Governance Lead, Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
BELLEVUE, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/2278965319592702/>
|
||
<div class="job-description">
|
||
Data Governance Lead, Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
MENLO PARK, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/2278965319592702/>
|
||
<div class="job-description">
|
||
Data Governance Lead, Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
SEATTLE, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/1458825126087114/>
|
||
<div class="job-description">
|
||
Generator Engineer, Data Center Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
RESTON, US
|
||
</div>
|
||
</a>
|
||
</li><li class="available-positions-item">
|
||
<a href=https://www.metacareers.com/jobs/1458825126087114/>
|
||
<div class="job-description">
|
||
Generator Engineer, Data Center Infrastructure
|
||
</div>
|
||
<div class="job-location">
|
||
MENLO PARK, US
|
||
</div>
|
||
</a>
|
||
</li> </ul>
|
||
<a href="https://www.metacareers.com">
|
||
<div class="btn available-positions-btn">
|
||
See All Jobs </div>
|
||
</a>
|
||
</div><!-- .footer-widget --><div id="custom_html-2" class="widget_text footer-widget widget_custom_html widget-count-3 col-md-4"><h3 class="widget-title">Technology at Meta</h3><div class="textwidget custom-html-widget"><ul class="stay-connected-lists">
|
||
<li class="stay-connected-item">
|
||
<img class="footer-fb-engineering stay-connected-item-left" src="/wp-content/themes/code-fb-com/img/meta_logo.png" alt="footer-fb-engineering" loading="lazy" width="70" height="70">
|
||
<div class="stay-connected-item-right">
|
||
<div class="stay-connected-label">
|
||
Engineering at Meta - X
|
||
</div>
|
||
<a onclick='return twitterFollow("Meta_Engineers")'>
|
||
<button class="btn stay-connected-btn">
|
||
Follow
|
||
</button>
|
||
</a>
|
||
</div>
|
||
</li>
|
||
<li class="stay-connected-item">
|
||
<img class="footer-fb-engineering stay-connected-item-left" src="/wp-content/themes/code-fb-com/img/meta_logo.png" alt="footer-AI" loading="lazy" width="70" height="70">
|
||
<div class="stay-connected-item-right">
|
||
<div class="stay-connected-label">
|
||
AI at Meta
|
||
</div>
|
||
<a href="https://ai.meta.com/blog/">
|
||
<button class="btn stay-connected-btn">
|
||
Read
|
||
</button>
|
||
</a>
|
||
</div>
|
||
</li>
|
||
<li class="stay-connected-item">
|
||
<img class="footer-fb-engineering stay-connected-item-left" src="/wp-content/themes/code-fb-com/img/meta_logo.png" alt="footer-developers" loading="lazy" width="70" height="70">
|
||
<div class="stay-connected-item-right">
|
||
<div class="stay-connected-label">
|
||
Meta Quest Blog
|
||
</div>
|
||
<a href="https://www.meta.com/blog/quest/">
|
||
<button class="btn stay-connected-btn">
|
||
Read
|
||
</button>
|
||
</a>
|
||
</div>
|
||
</li>
|
||
|
||
<li class="stay-connected-item">
|
||
<img class="footer-fb-engineering stay-connected-item-left" src="/wp-content/themes/code-fb-com/img/meta_logo.png" alt="footer-developers" loading="lazy" width="70" height="70">
|
||
<div class="stay-connected-item-right">
|
||
<div class="stay-connected-label">
|
||
Meta for Developers
|
||
</div>
|
||
<a href="https://developers.facebook.com/">
|
||
<button class="btn stay-connected-btn">
|
||
Read
|
||
</button>
|
||
</a>
|
||
</div>
|
||
</li>
|
||
<li class="stay-connected-item">
|
||
<img class="footer-fb-engineering stay-connected-item-left" src="/wp-content/themes/code-fb-com/img/meta_logo.png" alt="footer-bug-bounty" loading="lazy" width="70" height="70">
|
||
<div class="stay-connected-item-right">
|
||
<div class="stay-connected-label">
|
||
Meta Bug Bounty
|
||
</div>
|
||
<a href="https://bugbounty.meta.com/">
|
||
<button class="btn stay-connected-btn">
|
||
Learn more
|
||
</button>
|
||
</a>
|
||
</div>
|
||
</li>
|
||
|
||
<li class="stay-connected-item">
|
||
<img class="stay-connected-item-left" src="/wp-content/themes/code-fb-com/img/rss.png" alt="footer-rss" loading="lazy" width="70" height="70">
|
||
<div class="stay-connected-item-right">
|
||
<div class="stay-connected-label">
|
||
RSS
|
||
</div>
|
||
<a href="https://code.facebook.com/posts/rss/">
|
||
<button class="btn stay-connected-btn">
|
||
Subscribe
|
||
</button>
|
||
</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div></div><!-- .footer-widget --><div id="custom_html-3" class="widget_text footer-widget widget_custom_html widget-count-3 col-md-4"><h3 class="widget-title">Open Source</h3><div class="textwidget custom-html-widget"><p class="opensource-desc">
|
||
Meta believes in building community through open source technology. Explore our latest projects in Artificial Intelligence, Data Infrastructure, Development Tools, Front End, Languages, Platforms, Security, Virtual Reality, and more.
|
||
</p>
|
||
<ul class="opensource-cats">
|
||
<li class="opensource-cat">
|
||
<img src="/wp-content/themes/code-fb-com/img/android.png" alt="android" loading="lazy" width="50" height="59">
|
||
<div class="opensource-cap">
|
||
ANDROID
|
||
</div>
|
||
</li>
|
||
<li class="opensource-cat">
|
||
<img src="/wp-content/themes/code-fb-com/img/ios.png" alt="ios" loading="lazy" width="48" height="58">
|
||
<div class="opensource-cap">
|
||
iOS
|
||
</div>
|
||
</li>
|
||
<li class="opensource-cat">
|
||
<img src="/wp-content/themes/code-fb-com/img/web.png" alt="web" loading="lazy" width="55" height="49">
|
||
<div class="opensource-cap">
|
||
WEB
|
||
</div>
|
||
</li>
|
||
<li class="opensource-cat">
|
||
<img src="/wp-content/themes/code-fb-com/img/backend.png" alt="backend" loading="lazy" width="56" height="51">
|
||
<div class="opensource-cap">
|
||
BACKEND
|
||
</div>
|
||
</li>
|
||
<li class="opensource-cat">
|
||
<img src="/wp-content/themes/code-fb-com/img/hardware.png" alt="hardware" loading="lazy" width="55" height="44">
|
||
<div class="opensource-cap">
|
||
HARDWARE
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
|
||
<button class="btn opensource-btn" onclick="window.location.href='https://opensource.fb.com/'">
|
||
Learn More
|
||
</button>
|
||
|
||
</div></div><!-- .footer-widget -->
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</div><!-- #wrapper-footer-full -->
|
||
|
||
|
||
<div class="wrapper-footer" id="wrapper-footer">
|
||
<div class="inner-container">
|
||
<div class="footer">
|
||
<div class="row">
|
||
<div class="col-md-12">
|
||
<footer class="meta-footer" id="meta-footer">
|
||
<div class="site-info row justify-content-between">
|
||
<div class="col-md-5 meta-logo-container">
|
||
<a href="https://about.facebook.com/">
|
||
<img src="https://engineering.fb.com/wp-content/themes/code-fb-com/img/meta_logo_full.svg" width="89" height="18" alt="Meta" />
|
||
</a>
|
||
<div id="text-2" class="widget widget_text"> <div class="textwidget"><p>Engineering at Meta is a technical news resource for engineers interested in how we solve large-scale technical challenges at Meta.</p>
|
||
</div>
|
||
</div> </div>
|
||
<div class="col-md-6 footer-meta-links-container">
|
||
<ul class="meta-footer-links">
|
||
<li class="footer-link"><a href="https://engineering.fb.com">Home</a></li><li class="footer-link"><a href="https://about.meta.com/">Company Info</a></li><li class="footer-link"><a href="https://www.metacareers.com/?ref=engineering.fb.com">Careers</a></li> </ul>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="footer">
|
||
<div class="row">
|
||
|
||
<div class="col-md-12">
|
||
|
||
<footer class="site-footer" id="colophon">
|
||
<div class="inner-container">
|
||
<div class="site-info row justify-content-between">
|
||
|
||
<div class="col-md-4 copyright-container">
|
||
<div class="copyright"> © 2026 Meta</div>
|
||
</div>
|
||
|
||
<!-- static footer -->
|
||
<div class="col-md-7 footer-links-container">
|
||
<ul class="footer-links">
|
||
<li class="footer-link"><a href="https://www.facebook.com/policies">Terms</a></li><li class="footer-link"><a href="https://www.facebook.com/privacy/policy">Privacy</a></li><li class="footer-link"><a href="/privacy">Cookies</a></li><li class="footer-link"><a href="https://www.facebook.com/help">Help</a></li> </ul>
|
||
</div>
|
||
</div>
|
||
</div><!-- .site-info -->
|
||
|
||
</footer><!-- #colophon -->
|
||
|
||
</div><!--col end -->
|
||
|
||
</div><!-- row end -->
|
||
|
||
</div><!-- //.inner-container -->
|
||
</div><!-- wrapper end -->
|
||
|
||
</div><!-- #page we need this extra closing tag here -->
|
||
|
||
<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/code-fb-com/*","/wp-content/themes/understrap/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
|
||
</script>
|
||
<div class="gdprconsent-container" id="GDPRConsentBar">
|
||
<div class="gdprconsent-wrapper">
|
||
<div class="gdprconsent-content">
|
||
<p>To help personalize content, tailor and measure ads and provide a safer experience, we use cookies. By clicking or navigating the site, you agree to allow our collection of information on and off Facebook through cookies. Learn more, including about available controls: <a href="/privacy">Cookie Policy</a></p>
|
||
<div class="gdprconsent-button">
|
||
<button type="button" data-gdpr-accept>Accept</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Twitter universal website tag code -->
|
||
<script>
|
||
if (window.gdprSafeTrack) {
|
||
window.gdprSafeTrack(function() {
|
||
!function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);
|
||
},s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js',
|
||
a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');
|
||
// Insert Twitter Pixel ID and Standard Event data below
|
||
twq('init','o31u0');
|
||
twq('track','PageView');
|
||
});
|
||
}
|
||
</script>
|
||
<!-- End Twitter universal website tag code -->
|
||
|
||
|
||
<script type="text/javascript">
|
||
window.WPCOM_sharing_counts = {"https://engineering.fb.com/2024/02/07/production-engineering/simple-precision-time-protocol-sptp-meta/":20914};
|
||
</script>
|
||
|
||
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KZRLGZ8" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
||
|
||
<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=660742068067366&ev=PageView&noscript=1"/></noscript>
|
||
<script id="child-understrap-scripts-js-extra">
|
||
var loadmore_params = {"restfulURL":"https://engineering.fb.com/wp-json/fb/v1/loadmore","searchText":"","posts":"{\"page\":0,\"year\":2024,\"monthnum\":2,\"day\":7,\"name\":\"simple-precision-time-protocol-sptp-meta\",\"category_name\":\"production-engineering\",\"error\":\"\",\"m\":\"\",\"p\":0,\"post_parent\":\"\",\"subpost\":\"\",\"subpost_id\":\"\",\"attachment\":\"\",\"attachment_id\":0,\"pagename\":\"\",\"page_id\":0,\"second\":\"\",\"minute\":\"\",\"hour\":\"\",\"w\":0,\"tag\":\"\",\"cat\":\"\",\"tag_id\":\"\",\"author\":\"\",\"author_name\":\"\",\"feed\":\"\",\"tb\":\"\",\"paged\":0,\"meta_key\":\"\",\"meta_value\":\"\",\"preview\":\"\",\"s\":\"\",\"sentence\":\"\",\"title\":\"\",\"fields\":\"all\",\"menu_order\":\"\",\"embed\":\"\",\"category__in\":[],\"category__not_in\":[],\"category__and\":[],\"post__in\":[],\"post__not_in\":[],\"post_name__in\":[],\"tag__in\":[],\"tag__not_in\":[],\"tag__and\":[],\"tag_slug__in\":[],\"tag_slug__and\":[],\"post_parent__in\":[],\"post_parent__not_in\":[],\"author__in\":[],\"author__not_in\":[],\"search_columns\":[],\"ignore_sticky_posts\":false,\"suppress_filters\":false,\"cache_results\":true,\"update_post_term_cache\":true,\"update_menu_item_cache\":false,\"lazy_load_term_meta\":true,\"update_post_meta_cache\":true,\"post_type\":\"\",\"posts_per_page\":12,\"nopaging\":false,\"comments_per_page\":\"50\",\"no_found_rows\":false,\"order\":\"DESC\"}","current_page":"1","max_page":"0","post_type":"post"};
|
||
var search_params = {"ajaxurl":"https://engineering.fb.com/wp-admin/admin-ajax.php","posts":"{\"page\":0,\"year\":2024,\"monthnum\":2,\"day\":7,\"name\":\"simple-precision-time-protocol-sptp-meta\",\"category_name\":\"production-engineering\",\"error\":\"\",\"m\":\"\",\"p\":0,\"post_parent\":\"\",\"subpost\":\"\",\"subpost_id\":\"\",\"attachment\":\"\",\"attachment_id\":0,\"pagename\":\"\",\"page_id\":0,\"second\":\"\",\"minute\":\"\",\"hour\":\"\",\"w\":0,\"tag\":\"\",\"cat\":\"\",\"tag_id\":\"\",\"author\":\"\",\"author_name\":\"\",\"feed\":\"\",\"tb\":\"\",\"paged\":0,\"meta_key\":\"\",\"meta_value\":\"\",\"preview\":\"\",\"s\":\"\",\"sentence\":\"\",\"title\":\"\",\"fields\":\"all\",\"menu_order\":\"\",\"embed\":\"\",\"category__in\":[],\"category__not_in\":[],\"category__and\":[],\"post__in\":[],\"post__not_in\":[],\"post_name__in\":[],\"tag__in\":[],\"tag__not_in\":[],\"tag__and\":[],\"tag_slug__in\":[],\"tag_slug__and\":[],\"post_parent__in\":[],\"post_parent__not_in\":[],\"author__in\":[],\"author__not_in\":[],\"search_columns\":[],\"ignore_sticky_posts\":false,\"suppress_filters\":false,\"cache_results\":true,\"update_post_term_cache\":true,\"update_menu_item_cache\":false,\"lazy_load_term_meta\":true,\"update_post_meta_cache\":true,\"post_type\":\"\",\"posts_per_page\":12,\"nopaging\":false,\"comments_per_page\":\"50\",\"no_found_rows\":false,\"order\":\"DESC\"}","current_page":"1","max_page":"0","article_filter":"20b1c3dc67"};
|
||
var more_articles = {"next_article":{"label":"Next","permalink":"https://engineering.fb.com/2024/02/12/developer-tools/meta-loves-python/","title":"Meta loves Python","thumbnail":["https://engineering.fb.com/wp-content/uploads/2024/02/MetaTechPodcast-Python312.webp?w=580&h=326&crop=1",580,326,true]},"prev_article":{"label":"Prev","permalink":"https://engineering.fb.com/2024/02/06/developer-tools/dotslash-simplified-executable-deployment/","title":"DotSlash: Simplified executable deployment","thumbnail":["https://engineering.fb.com/wp-content/uploads/2024/02/Dotslash-hero-Black_smaller.png?w=580&h=326&crop=1",580,326,true]}};
|
||
//# sourceURL=child-understrap-scripts-js-extra
|
||
</script>
|
||
<script type="text/javascript" src="https://engineering.fb.com/_static/??/wp-content/themes/code-fb-com/dist/js/child-theme.min.js,/wp-content/themes/code-fb-com/js/prism.js?m=1783017802j" ></script><script id="sharing-js-js-extra">
|
||
var sharing_js_options = {"lang":"en","counts":"1","is_stats_active":""};
|
||
//# sourceURL=sharing-js-js-extra
|
||
</script>
|
||
<script id="sharing-js-js" src="https://engineering.fb.com/wp-content/mu-plugins/jetpack-16.1/_inc/build/sharedaddy/sharing.min.js?ver=16.1.3"></script>
|
||
<script id="sharing-js-js-after">
|
||
var windowOpen;
|
||
( function () {
|
||
function matches( el, sel ) {
|
||
return !! (
|
||
el.matches && el.matches( sel ) ||
|
||
el.msMatchesSelector && el.msMatchesSelector( sel )
|
||
);
|
||
}
|
||
|
||
document.body.addEventListener( 'click', function ( event ) {
|
||
if ( ! event.target ) {
|
||
return;
|
||
}
|
||
|
||
var el;
|
||
if ( matches( event.target, 'a.share-facebook' ) ) {
|
||
el = event.target;
|
||
} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-facebook' ) ) {
|
||
el = event.target.parentNode;
|
||
}
|
||
|
||
if ( el ) {
|
||
event.preventDefault();
|
||
|
||
// If there's another sharing window open, close it.
|
||
if ( typeof windowOpen !== 'undefined' ) {
|
||
windowOpen.close();
|
||
}
|
||
windowOpen = window.open( el.getAttribute( 'href' ), 'wpcomfacebook', 'menubar=1,resizable=1,width=600,height=400' );
|
||
return false;
|
||
}
|
||
} );
|
||
} )();
|
||
var windowOpen;
|
||
( function () {
|
||
function matches( el, sel ) {
|
||
return !! (
|
||
el.matches && el.matches( sel ) ||
|
||
el.msMatchesSelector && el.msMatchesSelector( sel )
|
||
);
|
||
}
|
||
|
||
document.body.addEventListener( 'click', function ( event ) {
|
||
if ( ! event.target ) {
|
||
return;
|
||
}
|
||
|
||
var el;
|
||
if ( matches( event.target, 'a.share-threads' ) ) {
|
||
el = event.target;
|
||
} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-threads' ) ) {
|
||
el = event.target.parentNode;
|
||
}
|
||
|
||
if ( el ) {
|
||
event.preventDefault();
|
||
|
||
// If there's another sharing window open, close it.
|
||
if ( typeof windowOpen !== 'undefined' ) {
|
||
windowOpen.close();
|
||
}
|
||
windowOpen = window.open( el.getAttribute( 'href' ), 'wpcomthreads', 'menubar=1,resizable=1,width=600,height=400' );
|
||
return false;
|
||
}
|
||
} );
|
||
} )();
|
||
var windowOpen;
|
||
( function () {
|
||
function matches( el, sel ) {
|
||
return !! (
|
||
el.matches && el.matches( sel ) ||
|
||
el.msMatchesSelector && el.msMatchesSelector( sel )
|
||
);
|
||
}
|
||
|
||
document.body.addEventListener( 'click', function ( event ) {
|
||
if ( ! event.target ) {
|
||
return;
|
||
}
|
||
|
||
var el;
|
||
if ( matches( event.target, 'a.share-linkedin' ) ) {
|
||
el = event.target;
|
||
} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-linkedin' ) ) {
|
||
el = event.target.parentNode;
|
||
}
|
||
|
||
if ( el ) {
|
||
event.preventDefault();
|
||
|
||
// If there's another sharing window open, close it.
|
||
if ( typeof windowOpen !== 'undefined' ) {
|
||
windowOpen.close();
|
||
}
|
||
windowOpen = window.open( el.getAttribute( 'href' ), 'wpcomlinkedin', 'menubar=1,resizable=1,width=580,height=450' );
|
||
return false;
|
||
}
|
||
} );
|
||
} )();
|
||
var windowOpen;
|
||
( function () {
|
||
function matches( el, sel ) {
|
||
return !! (
|
||
el.matches && el.matches( sel ) ||
|
||
el.msMatchesSelector && el.msMatchesSelector( sel )
|
||
);
|
||
}
|
||
|
||
document.body.addEventListener( 'click', function ( event ) {
|
||
if ( ! event.target ) {
|
||
return;
|
||
}
|
||
|
||
var el;
|
||
if ( matches( event.target, 'a.share-x' ) ) {
|
||
el = event.target;
|
||
} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-x' ) ) {
|
||
el = event.target.parentNode;
|
||
}
|
||
|
||
if ( el ) {
|
||
event.preventDefault();
|
||
|
||
// If there's another sharing window open, close it.
|
||
if ( typeof windowOpen !== 'undefined' ) {
|
||
windowOpen.close();
|
||
}
|
||
windowOpen = window.open( el.getAttribute( 'href' ), 'wpcomx', 'menubar=1,resizable=1,width=600,height=350' );
|
||
return false;
|
||
}
|
||
} );
|
||
} )();
|
||
var windowOpen;
|
||
( function () {
|
||
function matches( el, sel ) {
|
||
return !! (
|
||
el.matches && el.matches( sel ) ||
|
||
el.msMatchesSelector && el.msMatchesSelector( sel )
|
||
);
|
||
}
|
||
|
||
document.body.addEventListener( 'click', function ( event ) {
|
||
if ( ! event.target ) {
|
||
return;
|
||
}
|
||
|
||
var el;
|
||
if ( matches( event.target, 'a.share-bluesky' ) ) {
|
||
el = event.target;
|
||
} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-bluesky' ) ) {
|
||
el = event.target.parentNode;
|
||
}
|
||
|
||
if ( el ) {
|
||
event.preventDefault();
|
||
|
||
// If there's another sharing window open, close it.
|
||
if ( typeof windowOpen !== 'undefined' ) {
|
||
windowOpen.close();
|
||
}
|
||
windowOpen = window.open( el.getAttribute( 'href' ), 'wpcombluesky', 'menubar=1,resizable=1,width=600,height=400' );
|
||
return false;
|
||
}
|
||
} );
|
||
} )();
|
||
var windowOpen;
|
||
( function () {
|
||
function matches( el, sel ) {
|
||
return !! (
|
||
el.matches && el.matches( sel ) ||
|
||
el.msMatchesSelector && el.msMatchesSelector( sel )
|
||
);
|
||
}
|
||
|
||
document.body.addEventListener( 'click', function ( event ) {
|
||
if ( ! event.target ) {
|
||
return;
|
||
}
|
||
|
||
var el;
|
||
if ( matches( event.target, 'a.share-mastodon' ) ) {
|
||
el = event.target;
|
||
} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-mastodon' ) ) {
|
||
el = event.target.parentNode;
|
||
}
|
||
|
||
if ( el ) {
|
||
event.preventDefault();
|
||
|
||
// If there's another sharing window open, close it.
|
||
if ( typeof windowOpen !== 'undefined' ) {
|
||
windowOpen.close();
|
||
}
|
||
windowOpen = window.open( el.getAttribute( 'href' ), 'wpcommastodon', 'menubar=1,resizable=1,width=460,height=400' );
|
||
return false;
|
||
}
|
||
} );
|
||
} )();
|
||
//# sourceURL=sharing-js-js-after
|
||
</script>
|
||
<script id="video-analytics-js-after">
|
||
if (window.gdprSafeTrack) {
|
||
window.gdprSafeTrack(function() {
|
||
let youtube = document.querySelectorAll('[src*="youtube-nocookie"]');
|
||
for (let i = 0; i < youtube.length; i++) {
|
||
youtube[i].src = youtube[i].src.replace('youtube-nocookie.com', 'youtube.com');
|
||
}
|
||
let vimeo = document.querySelectorAll('[src*="vimeo"]');
|
||
for (let i = 0; i < vimeo.length; i++) {
|
||
vimeo[i].src = vimeo[i].src.replace('&dnt=true', '');
|
||
}
|
||
});
|
||
}
|
||
//# sourceURL=video-analytics-js-after
|
||
</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://engineering.fb.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}}
|
||
</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://engineering.fb.com/wp-includes/js/wp-emoji-loader.min.js
|
||
</script>
|
||
|
||
</body>
|
||
|
||
</html>
|