前一段时间在开发的一个项目中使用rsync代替了文件推送功能.


在边缘节点找到一台上传数据延迟严重的服务器.

查看rsync daemon传输日志内容:


2013/10/13 04:01:46 [18610] name lookup failed for xxx.xxx.xxx: Name or service not known

2013/10/13 04:01:46 [18610] connect from UNKNOWN (xxx.xxx.xxx.xxx)

2013/10/13 04:02:47 [18633] name lookup failed for xxx.xxx.xxx.xxx: Name or service not known

2013/10/13 04:02:47 [18633] connect from UNKNOWN (xxx.xxx.xxx.xxx)


通过这份数据一看前后两次链接rsync服务端时间差距在1分钟,而client端数据实际传输只需要1秒钟就能传完了,而其他时间全部阻塞在lookup的查询动作;


查阅rsyncd.conf文档没有发现禁止这个功能的选项;

通过google查到了最新发布的版本3.1.0版本可以支持reverse lookup = no选项,可禁止lookup的动作,但是我使用了log-file的选项,3.1.0版本的日志信息会输出很多,面对特别多的客户端,分析这个日志成了比较麻烦的事儿,也没有选项可以控制这些信息的输出;


这个lookup功能对于我来说没什么用,又不能禁止,新版本还不知道有没有其他的问题,而且面对的是大面积的客户端,也有其他程序使用rsync,更新版本的危险比较大,再说这个功能只是daemon的时候使用,所以没必要更新客户端;索性直接修改源代码,将这部分代码注释掉.


在传输大文件的情况下,也许可以忽略这个lookup所产生的影响.


源码文件: clientname.c

char *client_name(int fd)

{

..........

..........

/*if (lookup_name(fd, &ss, ss_len, name_buf, sizeof name_buf,

port_buf, sizeof port_buf) == 0)

check_name(fd, &ss, name_buf, sizeof name_buf);

*/

return name_buf;

}



在这次使用过程中影响传输的另外一个问题,务必增加timeout选项,因为如果是网关服务器丢包,没有收到fin包的话,这个rsync进程将永远不会停止.


测试方法: 限速至1kb,然后将网卡重启一次,使用strace -p 跟踪rsync调用select系统级函数.