xmake分布式编译
Dionysen

XMake分布式编译

如果集群不在同一个局域网下,需要内网穿透。

FRP

内网穿透本质上是一个反向代理,将拥有公网IP的服务端的特定端口代理到无公网IP的客户端的特定端口,实现通过公网IP访问服务端即可达到访问内网中客户端的目的。

必要条件:拥有一个公网IP。

步骤

服务端

  1. 下载FRP

  2. 解压缩,配置服务端配置文件frps.toml

  3. bindPort=7000
    

    4. 启动frps(记得防火墙要打开7000端口)

    ##### 自启动

    编辑`sudo vim /etc/systemd/system/frp.service`

    ```toml
    [Unit]
    Description=frpc
    After=network.target

    [Service]
    TimeoutStartSec=30
    ExecStart=/home/dionysen/frps/frps -c /home/dionysen/frps/frps.toml
    ExecStop=/bin/kill $MAINPID

    [Install]
    WantedBy=multi-user.target

然后sudo systemctl enable frp --now即可。

客户端

  1. 下载FRP
  2. 解压缩,编辑客户端配置文件frpc.toml:
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "0.0.0.0"
localPort = 22
remotePort = 6000

[[proxies]]
name = "xmake-remote-build"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9691
remotePort = 9691

[[proxies]]
name = "xmake-remote-cache"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9692
remotePort = 9692

[[proxies]]
name = "xmake-distcc-build"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9693
remotePort = 9693

其中x.x.x.x是公网IP,服务端口与服务端绑定的保持一致即可。

下面的代理则是按需配置,我需要配置xmake的分布式编译、远程编译、远程缓存,所以加了三个,端口一一对应。

第一个ssh是一个测试,即将服务端的6000端口方向代理到客户端的22端口,这样通过访问公网的x.x.x.x:6000即可访问到客户端的22端口,可作为配置成功与否的标志。(注意windows系统的sshd可有会有问题,这是sshd配置本身的问题,与frp无关)

XMake分布式编译

参考XMake分布式编译

上面内网穿透配置完成后,即可进行配置分布式编译。

拥有公网IP的服务器作为一个代理,此时与配置FRP时的客户端一起作为一个服务端(通过公网IP访问)。

服务端

初始化

通过下面命令初始化,会生成token,也会显示配置文件的目录:

xmake service

显示为:

xmake service
generating the config file to /Users/ruki/.xmake/service/server.conf ..
an token(590234653af52e91b9e438ed860f1a2b) is generated, we can use this token to connect service.
generating the config file to /Users/ruki/.xmake/service/client.conf ..
<distcc_build_server>: listening 0.0.0.0:9693 ..

编辑配置文件:

{
distcc_build = {
listen = "0.0.0.0:9693",
toolchains = {
ndk = { }
},
workdir = [[C:\Users\Dionysen\AppData\Local\.xmake\service\server\distcc_build]]
},
known_hosts = { },
logfile = [[C:\Users\Dionysen\AppData\Local\.xmake\service\server\logs.txt]],
recv_timeout = -1,
remote_build = {
listen = "0.0.0.0:9691",
workdir = [[C:\Users\Dionysen\AppData\Local\.xmake\service\server\remote_build]]
},
remote_cache = {
listen = "0.0.0.0:9692",
workdir = [[C:\Users\Dionysen\AppData\Local\.xmake\service\server\remote_cache]]
},
send_timeout = -1,
tokens = {
"caa8b09d49f02608e491d756f1107d55"
}
}

其中distcc_build为分布式编译,remote_build为远程编译,remote_cache为远程编译缓存,这是三个服务,可以同时开启。个人开发者通常使用分布式编译和远程编译即可。

启动服务

xmake service  # 启动远程编译服务
xmake service --distcc # 启动分布式编译服务
xmake service --ccache # 启动远程缓存服务

# 以 Daemon 模式开启服务
xmake service --distcc --start
xmake service --distcc --restart
xmake service --distcc --stop

客户端

配置

{
distcc_build = {
hosts = {
{
connect = "x.x.x.x:9693",
token = "caa8b09d49f02608e491d756f1107d55",
njob = 16, // 并行任务数
}
}
},
remote_build = {
connect = "x.x.x.x:9691",
token = "caa8b09d49f02608e491d756f1107d55",
njob = 16
},
remote_cache = {
connect = "x.x.x.x:9692",
token = "caa8b09d49f02608e491d756f1107d55"
},
connect_timeout = 10000,
send_timeout = -1
recv_timeout = -1
}

客户端配置主要是公网IP和端口、token,以及并行任务数。

连接

cd projectdir
xmake service --connect --distcc
<client>: connect 127.0.0.1:9693 ..
<client>: 127.0.0.1:9693 connected!

我们也可以同时连接多个服务,比如分布式编译和远程编译缓存服务。

xmake service --connect --distcc --ccache

断开连接:

xmake service --disconnect --distcc

更多信息和使用方式可查阅xmake文档。

问题总结

fallback to the local compiler, <socket: tcp4/1464.0>: sendfile timeout!
fallback to the local compiler, <socket: tcp4/1460.0>: sendfile timeout!
fallback to the local compiler, <socket: tcp4/1472.0>: sendfile timeout!

出现以上错误,是分布式编译过程中,发送文件超时导致,这与网络带宽关系很大,尤其是内网穿透还会涉及到公网服务器的网络带宽(购买的服务器有带宽限制)。

这是需要平衡速度,主要修改的是超时时间和并行任务数,可以适当地增大超时时间,减小并行任务数来缓解此问题。

-1表示无限等待。

connect_timeout = 10000,
send_timeout = -1
recv_timeout = -1
显示评论