編譯測(cè)試
make
clear
cd tests
PID="`ps -ef|grep test_|grep -v 'grep'|awk '{print $2}' ORS=","`"
echo $PID | awk '{split($0,arr,",");cmd="kill -9 "; for(i in arr) system(cmd arr[i])}'
find test_* -type f -executable -exec ./repeat.sh 1 ./local.sh 1 1 ./{} \;
mxnet & kvstore & ps-lite
postoffice
-
postoffice.cc
創(chuàng)建van_ = Van::Create("zmq");
-
void Postoffice::Start()
啟動(dòng)Van::Start()
,調(diào)用ZMQVan
的Connect
,建立socket
-
KVWorker & KVServer
- 在
3rdparty/ps-lite/include/ps/kv_app.h
加上KVBorker - 更改從launch.py開(kāi)始的host笨鸡、role解析,調(diào)用KVBroker作為管理萍膛,更改
VAN
調(diào)用的ZMQVAN
為KAFKAVAN
zmq api
https://www.cnblogs.com/fengbohello/p/4230135.html
git clone git@github.com:zeromq/libzmq.git
cd libzmq/builds
cmake .. && make && sudo make install
protobuf
cd ps-lite
make
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-cpp-3.5.1.tar.gz
tar -zxvf protobuf-cpp-3.5.1.tar.gz
cd protobuf-cpp-3.5.1
./configure && make && sudo make install
ps-lite 重要的類(lèi)
Postoffice(郵局):
叫郵局的原因是敞贡,worker授滓、server將data打包成message后,交給郵局,郵局自動(dòng)的去發(fā)給需要的機(jī)器揩抡。
單例創(chuàng)建,
管理本node的一些信息:role镀琉、id等
-
rank到id的轉(zhuǎn)換:
- scheduler:1
- servergroup:2
- workergroup:4
相加為group相加(postoffice::start())
- worker_id:9, 11, 13, …
- server_id:8, 10, 12, …
Van:負(fù)責(zé)通信峦嗤,Postoffice的成員
其成員std::unordered_map senders_保存了node_id到連接的映射
Van只定義接口,具體實(shí)現(xiàn)是依賴(lài)ZMQVan(源碼只允許使用zmqvan)
Van類(lèi)負(fù)責(zé)建立鏈接滚粟、使用receiving thread監(jiān)聽(tīng)收到的message
Customer(顧客):
- 代表各個(gè)結(jié)點(diǎn)(Worker寻仗、Server)
- 分布式實(shí)測(cè)各個(gè)role(node)上只有一個(gè)實(shí)例
- 也有一個(gè)receiving thread
ps-lite啟動(dòng)流程:
van::receiving線程接受消息流程
customer::receiving 線程
customer 有一個(gè)線程安全的隊(duì)列 recv_queue_,不斷從其中pop消息出來(lái)凡壤,并調(diào)用上層傳入的recv_handle_對(duì)其進(jìn)行處理
消息收發(fā)流程
發(fā):
van::send
? 調(diào)用zmq_van::sengmsg
?
? 先使用zmq單獨(dú)發(fā)送用protobuf打包的meta包署尤,消息中加上一個(gè)flag:是否有該msg的后續(xù)包
? 依次發(fā)送data向量中的各個(gè)值,僅最后一條消息的flag為0
? 返回發(fā)送總字節(jié)數(shù)
收:
zmq_van::recvmsg
? 將收到的包依次放入一個(gè)msg內(nèi)
Barrier
實(shí)現(xiàn)sync的方式亚侠。async即在Postoffice啟動(dòng)時(shí)傳入一個(gè)false參數(shù)關(guān)閉barrier
barrier工作流程
上層 push/pull 到 ps-lite send/recv
在KVWorker::Send()中對(duì)傳入的kvpairs進(jìn)行slice曹体,分別發(fā)向不同server
在KVServer::Response()中將傳入的回復(fù)參數(shù)發(fā)向發(fā)起request的worker
雜
- 全部讀了兩遍,發(fā)現(xiàn)
src/postoffice.cc
中
應(yīng)為CHECK_EQ(customers_[app_id].count(customer_id), (size_t) 0) << "customer_id " \ << customer_id << " already exists\n";
CHECK_EQ(customers_[app_id].count(customer_id), (size_t) 1) << "customer_id " \ << customer_id << " already exists\n";