V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zhoudaiyu
V2EX  ›  Linux

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

  •  
  •   zhoudaiyu · 2020-08-28 14:57:24 +08:00 · 2122 次点击
    这是一个创建于 1552 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假定有个进程 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 。请求这个情况是可能发生的吗?
    10 条回复    2020-09-10 14:31:55 +08:00
    knightdf
        1
    knightdf  
       2020-08-28 15:01:26 +08:00   ❤️ 1
    又不是进程 A 去打开 hosts 文件找 IP
    asilin
        2
    asilin  
       2020-08-28 15:06:20 +08:00
    "而去通过 DNS 去找 www.baidu.com 对应的 IP",在 Linux 中,TCP 套接字也是文件句柄,也包含在你所说的`65535`中
    zhoudaiyu
        3
    zhoudaiyu  
    OP
       2020-08-28 15:06:21 +08:00 via iPhone
    @knightdf 我也觉得是啊 可是释放了打开的文件就好了
    dongrenwen
        4
    dongrenwen  
       2020-08-28 17:52:27 +08:00
    可以考虑做个实验
    yangbonis
        5
    yangbonis  
       2020-08-28 20:17:14 +08:00 via iPhone
    一般 c 语言 libc 搞的,查下 libc 的 resolver 。
    yangbonis
        6
    yangbonis  
       2020-08-28 20:21:14 +08:00 via iPhone
    另外对于内核里依赖域名的一些功能,内核有一个自己的 resolver
    ChristopherWu
        7
    ChristopherWu  
       2020-08-29 11:53:16 +08:00
    说不定都开了 https://linux.die.net/man/8/nscd nscd 就没这个问题。
    ChristopherWu
        8
    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
        9
    zhoudaiyu  
    OP
       2020-08-29 20:16:08 +08:00 via iPhone
    @ChristopherWu 是程序已经打开这么多文件了,然后再想打开 /etc/hosts 才打不开吧
    ungrown
        10
    ungrown  
       2020-09-10 14:31:55 +08:00
    以前有段时间家宽获取的百度网盘 DNS 记录连接不畅,手动改了 hosts 之后,baidupsc-go 依然通过 DNS 查询到的记录连接,这事当时费了好大功夫,最后发现 Golang 跟 DNS 相关的库(不知是默认还是怎么着)会直接忽略本地 hosts 。

    所以本地 hosts 虽然是系统层面的配置,也确实被多数软件接受,但依然存在某些程序和库直接无视 hosts 的情况。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:41 · PVG 04:41 · LAX 12:41 · JFK 15:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.