iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
AI & Data

資料工程師修煉之路 Part II系列 第 10

Trouble with Distributed Systems (3-1) - Unreliable Clocks

  • 分享至 

  • twitterImage
  •  

不可靠的時鐘 (Unreliable Clocks)

時鐘對應用程式來說很重要,它可以回答以下問題:

  1. 這個 request 該 timeout 了嗎?
  2. 服務的 99 百分位回應時間為何?
  3. 在前五分鐘的平均 QPS 多少?
  4. 使用者在我們網站會停留多久?
  5. 文章什麼時候發佈的?
  6. Cache 什麼時候過期的?
  7. log 裡的錯誤訊息是在什麼候發生的?

在分散式系統中,時間是一件棘手的事情,因為彼此的溝通可能會延遲且又不曉得延遲多久,更甚者,每台機器在硬體內都有自己的時鐘:石英振盪器 (quartz crystal oscillator),此設備並不完全準確,所以每台機器都有自己的時間概念,這就代表了跟其他機器比起來可能有快有慢。

還好我們可以選擇使用 網路時間協定 (Network Time Protocol) NTP 來同步時鐘。

單調遞增時鐘 v.s. 日歷鐘 (Monotonic Versus Time-of-Day Clocks)

現代電腦有 2 個類型的時鐘: 單調遞增時鐘 (Monotonic Clock)日曆鐘 (Time-of-Day Clock),區分它們是很重要的,它們有不同的用途。

日曆鐘 (Time-of-Day Clock)

日曆鐘根據了 壁時計時刻 (wall-clock time) 回傳了掛上該時鐘開始到現在的時間,簡單說就是從 UTC 1970-01-01 開始到現在經過的秒數(或毫秒),不計算閏秒。相關函式有 Linux 的 clock_gettime(CLOCK_REALTIME) 和 Java 的 System.currentTimeMillis()

日曆鐘通常會使用 NTP 來同步時間,在特定情形中,如果本地時鐘超過 NTP 伺服器太多,它會強制重置且跳回先前的時間點,因為上述論點以及它們經常忽略閏秒的關係,日曆鐘比較不適合來測量執行時間。

單調遞增時鐘 (Monotonic Clock)

單調遞增時鐘就很適合來測量執行時間或間隔 (interval) 、timeout 或回應時間。它來自於系統啟動後流逝的時間,所以它保證時間會一直往前進,相關函式有 Linux 的 clock_gettime(CLOCK_MONOTONIC) 和 Java 的 System.nanoTime()

當 NTP 檢測到電腦的石英移動太快或太慢時,NTP 有可能會調整單調遞增時鐘向前移動的頻率(稱為 slewing the clock),預設是允許時鐘速率加快或減慢 0.05%,但 NTP 不會讓該時鐘往前或往後跳,這個特性讓大多數的系統能將執行時間等等的測量精確到奈秒等級。


乾是 TGI Friday 加上明天要上班所以懶的寫了,剩下的明天補上吧!


上一篇
Trouble with Distributed Systems (2) - Unreliable Networks
下一篇
Trouble with Distributed Systems (3-2) - Unreliable Clocks
系列文
資料工程師修煉之路 Part II30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言