XMake分布式编译
如果集群不在同一个局域网下,需要内网穿透。
FRP 内网穿透本质上是一个反向代理,将拥有公网IP的服务端的特定端口代理到无公网IP的客户端的特定端口,实现通过公网IP访问服务端即可达到访问内网中客户端的目的。
必要条件:拥有一个公网IP。
步骤 服务端
下载FRP
解压缩,配置服务端配置文件frps.toml
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
即可。
客户端
下载FRP
解压缩,编辑客户端配置文件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 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 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 projectdirxmake 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