PS Lite 笔记
本文讲解的 PS Lite 源码版本限定如下:
- GitHub: https://github.com/dmlc/ps-lite/tree/master
- Commit: f45e2e78a7430be09f76264d2f4073fb2b1d54a2
角色
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 机制。即:
- 每一个节点,对于收到的非 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% 的概率随机打印其收到的消息。
PS Lite 笔记的更多相关文章
- PS学习笔记
PS学习笔记 常用快捷键 快捷键 功能 Ctrl+T 自由变换 Ctrl+Alt+Shift+T 复制图层+再次变换 Alt+Del 以前景色填充 Ctrl+Del 以背景色填充 Ctrl+I 反相 ...
- PS学习笔记(05)
PS学习笔记(09) [2]马赛克背景 找一张图片.然后新建图层,让前景色背景色恢复到默认的状态(黑.白) 在新建图层上填充黑色-->滤镜-->渲染->云彩 像素化-->马赛克 ...
- PS 使用笔记 - PS 让工作台适应 当前图层
1. PS 让工作台适应 当前图层 选中图层 打开 [图像]=>[裁切] 勾选以下,确定即可
- ps学习笔记(二)
1)选择所有图层: Ctrl+Alt+A2)查找层:ctrl+alt+shift+f,需要在层面板输入查找层名,可自动查找层:3)隔离层:可将选择图层,更改为隔离,只对选择的层编辑:注:图层面板中有一 ...
- PS学习笔记(04)
Photoshop滤镜的安装 Photoshop滤镜的默认格式为.8bf(也有些滤镜为exe格式的可执行文件),如果你下载的是压缩包,请解压之后再安装. 方法一: 如果你下载的滤镜为exe的可执行文件 ...
- PS学习笔记(01)
[1]PS,文件-脚本-删除所有的空图层. [2]设计师与美工的区别? 设计在于有思路了再去找素材, 美工在于有素材后再去设计 (思路是在大量的设计上,才累计出来的.) [3]如何知道一张图片 ...
- 0基础90分钟会用PS——GenJi笔记
数码图像的相关基础概念 1.位图和矢量图 位图 也叫点阵图像,位图使用也称像素的一格一格的小点来描述图像,图放大后我们可以看到像素点 矢量图 根据几何特性来绘制图形,用线段和曲线描述图像,可以是一个一 ...
- PS学习笔记 1---- 光和色的关系(上)
在HSB模式中,H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度. HSB模式对应的媒介是人眼.HSB模式中S和B呈现的数值越高,饱和度明度越高,页面色 ...
- ps(笔记)
窗口 工作区 默认窗口(恢复) ctrl + n 点阵图(像素图) 小方格组成的 alt 键 配合 放大缩小 ppi dpi 打印输出. 画布新建 z键 局部放大 右击实际像素操作 f键 全屏 空格键 ...
随机推荐
- gomod使用小结
gomod使用小结 使用方法 把工程拷贝到$GOPATH/src之外 在工程目录下执行:go mod init {module name}该命令会创建一个go.mod文件 然后在该目录下执行 go b ...
- hdu1233 最小生成树Prim算法和Kruskal算法
Prim算法 时间复杂度:O(\(N^2\),N为结点数) 说明:先任意找一个点标记,然后每次找一条最短的两端分别为标记和未标记的边加进来,再把未标记的点标记上.即每次加入一条合法的最短的边,每次扩展 ...
- Kubernetes将弃用docker?
1.前言 近日,Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时.并在1.23后不再支持dock ...
- 精尽Spring Boot源码分析 - 日志系统
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- uni-app中组件picker的基本使用(日期选择器为例)
例:需要在下图"自定义日期"中使用日期选择器 <template> <div> <picker mode="date" @chan ...
- CentOS-Docker搭建GitLab
官方教程 下载镜像 $ docker pull gitlab/gitlab-ce:latest 创建相关目录 $ mkdir -p /home/gitlab/config /home/gitlab/l ...
- 想用Electron做个小工具?这个或许是终极版
故事背景 之前在网上有看到很多小伙伴基于 electron 实现了非常多好用的桌面端工具,比如图床管理工具 PicGo,就专门做图床工具.也有一些其他的类似的小工具,比如 saladict-deskt ...
- Docker:docker部署PXC-5.7.21(mysql5.7.21)集群搭建负载均衡实现双机热部署方案
单节点数据库弊端 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 推荐Mysql集群部署方案 PXC (Percon ...
- [心得体会]RabbitMQ
RabbitMQ是什么? 消息队列, 基于AMQP(高级消息队列), 使用Erlang语言编写, 收发消息使用 有什么用? 有什么应用场景? 1. 任务异步处理 2. 应用程序解耦 为什么使用Rabb ...
- 关于easyswoole实现websocket聊天室的步骤解析
在去年,我们公司内部实现了一个聊天室系统,实现了一个即时在线聊天室功能,可以进行群组,私聊,发图片,文字,语音等功能,那么,这个聊天室是怎么实现的呢?后端又是怎么实现的呢? 后端框架 在后端框架上,我 ...