前一段时间在开发的一个项目中使用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系统级函数.
转载于:https://blog.51cto.com/jayceliu/1308822