PS Lite 筆記

本文講解的 PS Lite 源碼版本限定以下:git

  • GitHub: https://github.com/dmlc/ps-lite/tree/master
  • Commit: f45e2e78a7430be09f76264d2f4073fb2b1d54a2

角色github

PS Lite 實現了一種輕量級的參數服務器架構,其定義了三種角色:緩存

  • Scheduler - 1個,負責協調。
  • Server - 若干個,負責存儲。
  • Worker - 若干個,負責計算。

PostOffice 類服務器

PS Lite 的三種角色雖然職責不一樣,但其基礎功能均由一個全局單例的 PostOffice 類來實現。顧名思義,「郵局」類會維護了一張全局的「地址簿」,記錄了全部節點的信息。網絡

除了傳遞參數的數據消息外,各個節點之間控制信息有 EMPTY、TERMINATE、ADD_NODE、BARRIER、ACK、HEARTBEAT 共 6 種。EMPTY 類型不應出現,ACK 類型只有啓用了 Resender 類纔會出現。數據結構

Van 類多線程

郵局裏有了地址簿,就須要有貨車來負責拉送物件。PostOffice 類在實例化的時候,會建立一個 Van 類的實例(具體實現是 ZMQVan 類)做爲成員變量。該 Van 實例與所屬 PostOffice 實例生命週期相同,負責具體的節點間通訊。架構

Resender 類分佈式

在分佈式系統中,通訊也是不可靠的,丟包、延時都是必須考慮的場景。PS Lite 設計了 Resender 類來提升通訊的可靠性,它引入了 ACK 機制。即:post

  • 每個節點,對於收到的非 ACK/TERMINATE 消息,必須響應一個 ACK 消息。
  • 每個節點,對於發送的每個非 ACK/TERMINATE 消息,必須在本地緩存下來。存儲的數據結構是一個 MAP,根據消息的內容生產惟一的鍵。
  • 每個節點,對於收到的 ACK 消息,必須根據反饋的鍵從本地緩存中移除對應的消息。
  • 每個節點運行一個監控線程,每隔 PS_RESEND_TIMEOUT 毫秒檢查一下本地緩存。根據每一個消息的發送時間戳和當前時間,找出超時的消息進行重發,並累加其重試次數。

線程管理

PS Lite 定義的三種角色採用多線程機制工做,每一個線程承擔特定的職責,在所屬的 Van 實例啓動時被建立。具體描述以下:

  • Scheduler、Worker 和 Server 的 Van 實例裏均持有一個接受數據的線程。
  • Worker 和 Server 的 Van 實例裏還持有一個間歇地向 Scheduler 發送心跳的線程。
  • 若是定義了值不爲 0 環境變量 PS_RESEND,那麼 Scheduler、Worker 和 Server 還會啓動一個監控線程。

心跳機制

爲了記錄網絡的可達性,PS Lite 設計了心跳機制。具體而言:

  • 每個 Worker/Server 節點,每隔 PS_HEARTBEAT_INTERVAL 秒向 Scheduler 發送一條 HEARTBEAT 消息;Scheduler 節點收到後,響應一個 HEARTBEAT 消息。
  • 每個節點的 PostOffice 單例中維護了一個 MAP 結構,存儲了心跳關聯的節點的活躍信息。鍵爲節點編號,值爲上次收到其 HEARTBEAT 消息的時間戳。
  • Worker/Server 只記錄 Scheduler 的心跳,Scheduler 則記錄全部節點的心跳。基於時間戳和心跳超時,能夠輸出全部的死亡節點。

路由

在多 Server 架構下,一個很重要的問題是如何分佈多個參數。換句話說,給定一個參數的鍵,如何肯定其存儲在哪一臺 Server 上。路由功能直接影響到 Worker 在 Push/Pull 階段的通訊。

PS Lite 將路由邏輯放置在 Worker 端,採用範圍劃分的策略,即每個 Server 有本身固定負責的鍵的範圍。這個範圍是在 Worker 啓動的時候肯定的。具體代碼參見方法 Postoffice::GetServerKeyRanges(),細節以下:

  • 根據編譯 PS Lite 時是否設定的宏 USE_KEY32 來決定參數的鍵的數據類型,要麼是 32 位無符號整數,要麼是 64 位的。
  • 根據鍵的數據類型,肯定其值域的上界。例如 uint32_t 的上界是 4294967295。
  • 根據鍵域的上界和啓動時獲取的 Server 數量(即環境變量 DMLC_NUM_SERVER 的值)來劃分範圍。
  • 給定上界 MAX 和 Server 數量 N,第 i 個 Server 負責的範圍是 [MAX/N*i, MAX/N*(i+1))。

須要注意的是,在不能恰好整除的狀況下,鍵域上界的一小段被丟棄了。

調試

在系統運行中,咱們常常但願能打印一些收到的消息來方便定位問題。PS Lite 經過環境變量 PS_DROP_MSG 提供了這一功能,其值表明輸出消息的機率(不含百分號)。

例如,咱們啓動某個 Server 前,配置了環境變量 PS_DROP_MSG=70。那麼該 Server 進程會按照 70% 的機率隨機打印其收到的消息。

相關文章
相關標籤/搜索