今天遇到httpc:request()方法报错:
调用方法:
$ erl
1>inets:start().
2>Url = "http://example.com".
3>httpc:request(get, {Url, []}, [], []).
出错信息:
{error,{failed_connect,[{to_address,{"example.com",
80}},
{inet,[inet],nxdomain}]}}
首先考虑是防火墙和selinux的问题,把这些给关闭了:
$ /etc/init.d/iptables stop
$ setenforce 0
但是还是有问题,google一番,发现这个博客:
发现下面有这个问题:
服务器没有启动 nscd 服务,没有缓存
DNS 使用UDP 协议,即使时内网,偶尔也会丢失
erlang 对于并发查询同一个DNS 会做合并,同时只会有一个DNS 请求
erlang 的系统调用超时时间太长(5s),没有及时的重发查询,造成期间请求堆积,等DNS返回,堆积的业务同时开始处理,造成CPU波动。
解决方案:
1. 启动nscd 2. 配置inet 使用内存dns 模块缓存
在centos测试:
$ yum install nscd -y
$ service nscd start
$ chkconfig nscd on
问题解决。