有个问题问问大家关于最大打开文件数、/etc/hosts 已经域名解析的一些事

2020-08-28 14:57:24 +08:00
 zhoudaiyu
假定有个进程 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 。请求这个情况是可能发生的吗?
2109 次点击
所在节点    Linux
10 条回复
knightdf
2020-08-28 15:01:26 +08:00
又不是进程 A 去打开 hosts 文件找 IP
asilin
2020-08-28 15:06:20 +08:00
"而去通过 DNS 去找 www.baidu.com 对应的 IP",在 Linux 中,TCP 套接字也是文件句柄,也包含在你所说的`65535`中
zhoudaiyu
2020-08-28 15:06:21 +08:00
@knightdf 我也觉得是啊 可是释放了打开的文件就好了
dongrenwen
2020-08-28 17:52:27 +08:00
可以考虑做个实验
yangbonis
2020-08-28 20:17:14 +08:00
一般 c 语言 libc 搞的,查下 libc 的 resolver 。
yangbonis
2020-08-28 20:21:14 +08:00
另外对于内核里依赖域名的一些功能,内核有一个自己的 resolver
ChristopherWu
2020-08-29 11:53:16 +08:00
说不定都开了 https://linux.die.net/man/8/nscd nscd 就没这个问题。
ChristopherWu
2020-08-29 12:05:48 +08:00
刚特意试了一下,别说打开`/etc/hosts`了,你连程序都没法打开:

```
ubuntu@VM-0-7-ubuntu:~$ sudo strace -f -e open -y -yy ping test 2>&1
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3</etc/ld.so.cache>
open("/lib/x86_64-linux-gnu/libcap.so.2", O_RDONLY|O_CLOEXEC) = 3</lib/x86_64-linux-gnu/libcap.so.2.24>
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3</lib/x86_64-linux-gnu/libc-2.23.so>
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 4</run/resolvconf/resolv.conf>
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 4</run/resolvconf/resolv.conf>
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 4</etc/nsswitch.conf>
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 4</etc/ld.so.cache>
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 4</lib/x86_64-linux-gnu/libnss_files-2.23.so>
open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 4</etc/host.conf>
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4</etc/hosts>
```
zhoudaiyu
2020-08-29 20:16:08 +08:00
@ChristopherWu 是程序已经打开这么多文件了,然后再想打开 /etc/hosts 才打不开吧
ungrown
2020-09-10 14:31:55 +08:00
以前有段时间家宽获取的百度网盘 DNS 记录连接不畅,手动改了 hosts 之后,baidupsc-go 依然通过 DNS 查询到的记录连接,这事当时费了好大功夫,最后发现 Golang 跟 DNS 相关的库(不知是默认还是怎么着)会直接忽略本地 hosts 。

所以本地 hosts 虽然是系统层面的配置,也确实被多数软件接受,但依然存在某些程序和库直接无视 hosts 的情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702217

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX