Nodejs dns.lookup 很慢很慢
Nodejs dns.lookup 很慢很慢
var http = require(‘http’);
var url = require(‘url’);
var dns = require(‘dns’);
var qs = require(‘querystring’);
dns.setServers([‘223.5.5.5’]);
var server = http.createServer(function (req, res) {
var uri = url.parse(req.url);
var h = qs.parse(uri.query).host;
if (!h) {
res.end();
return;
}
if (uri.pathname === ‘/dnsQuery’) {
//console.log(h);
dns.lookup(h, { family: 4, all: true }, function (err, addrs) {
if (err) {
console.error(h + “:” + err);
res.end();
}
else {
var result=addrs.map(r=>r.address).join(’,’);
console.log(h+’:’+result);
res.setHeader(‘Cache-Control’, ‘public, max-age=3600’);
res.end(result);
}
});
}
});
server.listen(8080);
很简单的一段代码,一开始还好,在并发量(也不多估计才几十到一百每秒)上来以后就查询的非常慢,前面挂的 nginx 60 秒后就 504 了,而且当我查询已经查询过的域名的时候也是 504 ,好像 nginx 的缓存没有生效一样,用 pm2 list 确认了 app 还在运行,并且 pm2 logs 里也有查询的记录
你可以看下官方文档里关于 dns.lookup 的说明:
https://nodejs.org/dist/latest-v6.x/docs/api/dns.html#dns_dns_lookup
dns.lookup 和 nginx 无关。 node.js 的 dns.lookup 实现是无缓存的,如果需要缓存自己来做。
不一定是这个原因,不过上游 DNS 服务器可能有 rate-limit 。
使用 dns.resolve()代替 lookup()再试试
在Node.js中,dns.lookup
函数用于异步解析域名到IP地址。如果你发现 dns.lookup
执行得很慢,有几个可能的原因和解决方案可以考虑:
-
DNS 服务器响应时间: 如果配置的DNS服务器响应慢,
dns.lookup
也会慢。可以尝试更换DNS服务器,比如使用Google的8.8.8.8或Cloudflare的1.1.1.1。 -
系统DNS缓存: 系统DNS缓存可能未启用或配置不当。确保操作系统的DNS缓存功能已启用。
-
代码优化: 如果频繁进行相同的DNS查询,可以缓存结果。下面是一个简单的示例,使用内存缓存来减少DNS查询次数:
const dns = require('dns');
const cache = new Map();
function lookupWithCache(domain, callback) {
if (cache.has(domain)) {
return callback(null, cache.get(domain));
}
dns.lookup(domain, (err, address) => {
if (err) return callback(err);
cache.set(domain, address);
callback(null, address);
});
}
// 使用示例
lookupWithCache('example.com', (err, address) => {
if (err) console.error(err);
else console.log(address);
});
-
网络问题: 检查网络连接是否稳定,以及是否有防火墙或安全软件阻止DNS查询。
-
Node.js版本: 确保你使用的是最新版本的Node.js,因为新版本可能包含性能改进和bug修复。
通过上述方法,你应该能够诊断并解决 dns.lookup
慢的问题。如果问题依旧存在,可能需要更深入地分析网络或系统配置。