更多>>关于我们
西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效获取互联网任何公开可见信息。
您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。
数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。
更多>>技术文章
问题描述:
近日发现使用DeleGate为后端的HTTP代理响应速度异常慢,访问百度首页都需要20秒左右,如下测试截图(time curl -x test:test@182.84.192.159:6666 http://www.baidu.com),本次访问耗时20.942秒。
奇怪的是只有第一次访问的时候速度才慢,一旦访问一次之后速度就正常的,如下图所示,第二次测试只用了0.139秒!
反复多次测试发现规律:DeleGate刚启动时第一个请求异常慢,后续请求速度正常。 这到底是什么原因引起的呢?
问题分析:
以Debug模式(加上-v参数)启动DeleGate,客户端用curl再次连接该代理IP。看到DeleGate的实时日志如下截图所示。
看到其中有两条可疑信息(摘录如下):
gethostbyaddr(182.84.192.159) unknown[9.77s] gethostbyaddr(47.95.118.140) unknown[11.02s]
问题解决:
其中182.84.192.159为服务端IP(也就是DeleGate监听的IP),47.95.118.140为客户端(测试机)的IP。软件尝试查询两个IP对应的主机名,由于查询失败,共耗时超过20秒。原来时间都浪费到这里了(这两个操作完全是没必要的)!
当相同客户端(IP)后续再次发送请求的时候,第一次的DNS查询结果已经缓存了,没有再次进行该gethostbyaddr()的操作,所以请求瞬间就完成了,这就是后续速度恢复正常的原因。
悲剧的是查询DeleGate的文档并没有找到能Disable这两次gethostbyaddr()的方法。看来只能自己动手修改源码了。
从官网下载软件源码,使用gethostbyaddr作为关键词搜索所有的.c文件,最终在src\inets.c文件种找到了相关的代码。如下图所示。
查看代码上下文,最终发现可以在Dgethostbyaddr()函数里做点手脚,使得软件跳过gethostbyaddr()的调用,修改部分如下图所示:
修改之后重新编译。然后再次用Debug模式测试,请求瞬间得到应答,实时日志也没看到gethostbyaddr之类的记录。问题完美解决!