技术解析

有个问题问问大家关于最大打开文件数、/etc/hosts 已经域名解析的一些事
0
2021-06-16 11:48:30
idczone
假定有个进程 A,并且在 hosts 文件里配置了 182.61.200.6 www.baidu.com ,系统配置了进程最大打开文件数是 65535 。那么正常情况进程 A 去请求 www.baidu.com 的时候应该走 hosts 找 IP,而不是再通过 DNS 找到对应的 IP 。某个时刻进程 A 已经打开了 65535 个文件,那么他请求 www.baidu.com 时就会因为超过这个进程能打开的文件数而无法打开 /etc/hosts,而去通过 DNS 去找 www.baidu.com 对应的 IP 。请求这个情况是可能发生的吗?
又不是进程 A 去打开 hosts 文件找 IP

"而去通过 DNS 去找 www.baidu.com 对应的 IP",在 Linux 中,TCP 套接字也是文件句柄,也包含在你所说的`65535`中

我也觉得是啊 可是释放了打开的文件就好了

可以考虑做个实验

一般 c 语言 libc 搞的,查下 libc 的 resolver 。

另外对于内核里依赖域名的一些功能,内核有一个自己的 resolver

说不定都开了 https://linux.die.net/man/8/nscd nscd 就没这个问题。

刚特意试了一下,别说打开`/etc/hosts`了,你连程序都没法打开:
```
[email&sudo strace -f -e open -y -yy ping test 2>&1
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libcap.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 4
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 4
open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4
```

是程序已经打开这么多文件了,然后再想打开 /etc/hosts 才打不开吧

以前有段时间家宽获取的百度网盘 DNS 记录连接不畅,手动改了 hosts 之后,baidupsc-go 依然通过 DNS 查询到的记录连接,这事当时费了好大功夫,最后发现 Golang 跟 DNS 相关的库(不知是默认还是怎么着)会直接忽略本地 hosts 。
所以本地 hosts 虽然是系统层面的配置,也确实被多数软件接受,但依然存在某些程序和库直接无视 hosts 的情况。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服