Nodejs dns.lookup 很慢很慢

发布于 1周前 作者 yuanlaile 来自 nodejs/Nestjs

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 里也有查询的记录


5 回复

你可以看下官方文档里关于 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 执行得很慢,有几个可能的原因和解决方案可以考虑:

  1. DNS 服务器响应时间: 如果配置的DNS服务器响应慢,dns.lookup 也会慢。可以尝试更换DNS服务器,比如使用Google的8.8.8.8或Cloudflare的1.1.1.1。

  2. 系统DNS缓存: 系统DNS缓存可能未启用或配置不当。确保操作系统的DNS缓存功能已启用。

  3. 代码优化: 如果频繁进行相同的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);
});
  1. 网络问题: 检查网络连接是否稳定,以及是否有防火墙或安全软件阻止DNS查询。

  2. Node.js版本: 确保你使用的是最新版本的Node.js,因为新版本可能包含性能改进和bug修复。

通过上述方法,你应该能够诊断并解决 dns.lookup 慢的问题。如果问题依旧存在,可能需要更深入地分析网络或系统配置。

回到顶部