服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-08-17 简米科技 4,281 字 10 分钟阅读

服务器和客户端host解析怎么做,Host CPU占用高怎么办

导读修改hosts文件是最直接的host解析方式,服务器和客户端操作路径不同,但核心都是把域名指向固定IP并跳过远程DNS解析,客户端hosts解析域名怎么做:三条主流系统实操很多朋友第一次接触host解析,是在本地开发环境里把dev.example.com指向0.0.1,客户端改hosts的思路很简单:找到hos……

修改hosts文件是最直接的host解析方式,服务器和客户端操作路径不同,但核心都是把域名指向固定IP并跳过远程DNS解析。

客户端hosts解析域名怎么做:三条主流系统实操

很多朋友第一次接触host解析,是在本地开发环境里把dev.example.com指向0.0.1,客户端改hosts的思路很简单:找到hosts文件,按格式加上一行映射,保存后刷新DNS缓存,但不同系统的文件位置和编辑权限差别很大,下面按系统拆开说。

Windows:记事本以管理员身份运行

Windows的hosts文件固定放在C:\Windows\System32\drivers\etc\hosts,没有扩展名,直接用记事本打开。

操作步骤:

  • Win + R,输入notepad,但别直接回车,右键记事本图标,选择“以管理员身份运行”。
  • 在记事本里点“文件-打开”,路径填C:\Windows\System32\drivers\etc\hosts,右下角文件类型改成“所有文件”。
  • 文件末尾另起一行,写IP地址 域名,比如168.1.10 myapp.local
  • 保存后,打开命令提示符,执行ipconfig /flushdns

新手最容易栽在权限上:直接双击编辑,保存时报“拒绝访问”,解决方法是提前用管理员身份打开记事本,而不是保存时才提权,Windows 10/11的hosts文件默认是UTF-8编码,保存时别选“带BOM”的格式,否则域名后面可能带隐藏字符,解析异常。

macOS和Linux:终端里用sudo改文件

macOS的hosts路径是/etc/hosts,Linux大多数发行版也是/etc/hosts,两者操作几乎一样,只是macOS刷新DNS缓存的命令略有不同。

命令行操作:

sudo vim /etc/hosts

输入密码后,按i进入编辑模式,追加一行:

0.0.5 api.test.com

Esc,输入wq保存退出。

macOS刷新缓存:

sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

Linux刷新缓存分情况:

  • 使用systemd的系统:sudo systemd-resolve --flush-caches
  • 使用nscd的系统:sudo service nscd restart
  • 很多发行版改完立即生效,不需要额外操作。

在这里提醒一句,macOS的sudo vim进入编辑模式后,如果按错键可能弹出“E45: already set”之类的提示,不用慌,按

服务器和客户端host解析怎么做,Host CPU占用高怎么办

Esc再按q!强制退出重来。

服务器改hosts配置后,Host CPU占用不降反升?排查思路

服务器端改hosts,目的通常有两个:一是内网环境绕过公网DNS解析,把服务调用指向内网IP;二是测试环境模拟跳转,但有些运维朋友反馈,改完hosts后服务器CPU占用率反而变高了,这里需要厘清一个概念:hosts文件本身不会大幅消耗Host CPU,问题往往出在配置错误或频繁解析的进程上。

为什么会有“hosts影响CPU”的错觉

当你把域名映射到错误IP,比如把service.internal指向了一个不存在的地址,应用层会不断重试连接,每次重试都触发一次系统调用,错误堆积后,进程占用的CPU就上去了,如果hosts文件里写了大量无用条目,比如几百行注释或重复映射,虽然解析器会逐行扫描,但现代操作系统使用哈希索引,几千行内的性能损耗可以忽略不计,真正影响CPU的,是同一条映射被大量短连接请求反复触发,比如Tomcat或Nginx频繁建立连接,这时CPU消耗其实花在TCP握手和进程调度上,跟hosts本身没关系。

服务器端hosts配置的几个细节

  • 格式严格区分空格或Tab:IP域名之间至少一个空格,多打几个也没事。
  • 域名区分大小写吗?不区分,但统一小写更规范。
  • 不要用通配符,hosts文件不支持.example.com这样的写法。
  • 别在hosts里配公网域名到0.0.1来做“屏蔽”,这会导致本机服务无法访问。

服务器上验证hosts是否生效,用pingnslookup

ping api.test.com

如果返回的IP是你写在hosts里的那个,说明解析成功,注意ping命令可能走IPv6,如果hosts里写的是IPv4,建议加-4参数:

ping -4 api.test.com

高CPU场景下的排查顺序

当服务器CPU飙升,且你刚改过hosts,按以下顺序排查:

  1. 执行top查看哪个进程占用最高。
  2. 如果是Java应用,用jstack抓线程栈,看是否卡在InetAddress.getByName这类DNS查询方法上。
  3. /etc/nsswitch.confhosts这一行,确认解析顺序是files dns,还是dns files,如果dns

    服务器和客户端host解析怎么做,Host CPU占用高怎么办

    files前面,系统会先查DNS,DNS超时后才读hosts,这会让请求变慢,间接拉高CPU。

  4. strace -p 进程号跟踪系统调用,观察是否有大量connectsendto发往错误IP。

业内专家指出,多数“改hosts后CPU升高”的案例,最终都定位到应用层重试机制和连接池配置不当,而不是hosts文件本身。

host解析的常见坑:缓存、优先级和跨平台差异

客户端和服务器都改完hosts,并不代表解析一定按预期走,下面几个坑是日常排障高频问题。

hosts文件修改后不生效怎么办

先确认文件保存位置和格式,再确认解析优先级,Windows下,hosts文件默认优先级高于DNS服务器,但不影响已缓存的DNS记录,所以必须刷新缓存,Linux下,如果/etc/nsswitch.conf里配置了dns优先于files,hosts就不会被先查询。

排查步骤:

  • cat /etc/hosts(或type C:\Windows\...\hosts)确认映射行存在。
  • 执行getent hosts 域名,看返回值。
  • 如果getent返回正确,但应用访问不到,检查应用自身是否使用了自定义DNS解析库,比如Java的JVM参数-Dsun.net.inetaddr.ttl=0

hosts解析和DNS缓存是一回事吗

不是,hosts是本地静态文件,DNS缓存是系统或路由器暂存的动态查询结果。hosts文件优先级高于DNS缓存,但DNS缓存会保留一段时间,甚至覆盖hosts的修改结果,Windows的ipconfig /flushdns只能清系统缓存,清不掉应用层自己的缓存,比如浏览器内置的DNS缓存。

对比一下常见解析方式:

解析方式 生效速度 是否依赖网络 适合场景
hosts文件 立即(需刷缓存) 内网固定IP、开发测试
系统DNS缓存 毫秒级 首次查询需要 公网域名加速
本地DNS服务器 秒级 多服务器统一管理

服务器和客户端hosts统一管理:规模化场景怎么搞

单台服务器手动改hosts没问题,但几十台服务器全手工编辑,不仅累,还容易漏,这时需要配置管理工具批量下发。

用Ansible批量同步hosts

服务器和客户端host解析怎么做,Host CPU占用高怎么办

在Ansible控制机上,写一个简单的playbook:

- name: sync hosts file
  hosts: all
  tasks:
    - name: copy hosts
      copy:
        src: ./files/hosts
        dest: /etc/hosts
        owner: root
        group: root
        mode: 0644

操作流程:

  • 在控制机/etc/ansible/hosts里写好服务器清单。
  • 将统一维护的hosts文件放在./files/hosts
  • 执行ansible-playbook sync_hosts.yml,所有目标服务器自动覆盖hosts。

客户端机器数量不多,但版本差异大,比如混合了Windows和macOS,建议写脚本按系统类型分发,Windows可以用robocopy或PowerShell远程推送,macOS/Linux用scpsudo移动。

脚本片段示例:

scp hosts user@client_server:/tmp/hosts
ssh user@client_server "sudo mv /tmp/hosts /etc/hosts"

这个方案在中小团队里很实用。不需要额外部署Agent,也不用引入复杂的DNS服务,纯文件变更就能解决。

Q&A:关于host解析和Host CPU的典型问题

为什么hosts文件里的域名解析到了公网IP?

先确认hosts里是否有重复条目,后写的条目会不会覆盖前面的,多数系统解析时遵循“首次匹配”原则,但有些应用会读取所有条目,取最后一个,检查域名尾部是否有多余空格,或者文件编码被改成了UTF-16,导致解析器无法识别,重新用纯文本格式保存并刷新缓存。

服务器上改了hosts,但容器里的应用还是取不到?

容器网络模式不同,导致hosts生效范围不同。bridge模式下,容器默认使用Docker内置DNS,不会读宿主机的/etc/hosts,需要修改docker-compose.yml里的extra_hosts配置,或者直接用docker run --add-host=api.test.com:10.0.0.5host网络模式下,容器直接共享宿主机网络栈,改动宿主机hosts即可生效。

hosts解析异常会导致CPU占用居高不下吗?

会,但间接影响占主导,当应用反复解析一个hosts中不存在的域名时,每次解析都快速失败,如果代码里没有超时退避机制,就会形成密集的循环调用,此时CPU飙升是应用逻辑引起的,不是hosts解析本身,建议在应用层加缓存或限制重试频率,同时检查/etc/resolv.conf里配置的DNS服务器是否可达。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱