解决由于DNS解析导致Emacs启动巨慢的问题

小白是Emacs的忠实用户,在CentOS服务器上也要自己编译安装一个Emacs供自己使用。由于使用了很多Emacs的插件,每次启动那是很缓慢的,几乎是5s左右才打开一个文件(让大家误以为服务器配置很烂呢)。在打开文件的速度上与Vim有些差距,Vim打开文件几乎是零等待(我这里的vim是简单的配置,并没有使用额外的插件;使用Emacs的同行可不要骂我哦)。

最近发现Emacs的打开速度是巨慢无比的,之前就没有这种问题。细想了一下,主要是之前有网络连接,而这几次是没有网络连接的。所以小白就想到底是Emacs的什么插件需要用到网络呢?于是使用了系统下的strace工具进行追踪一下Emacs是如何启动的,终于找到是什么原因了,原来是主机名解析的问题,

在没有联网的情况下,启动到底是多慢呢?

[[email protected] ~]# time emacs --kill

real	0m5.402s
user	0m0.367s
sys	0m0.019s

看一下strace emacs的部分输出,

# strace emacs
.......
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3 # 首先会查看/etc/hosts文件,在hosts文件里没有找到关于系统主机名的解析
fcntl(3, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
fstat(3, {st_mode=S_IFREG|0644, st_size=338, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa6ae5a3000
read(3, "127.0.0.1   localhost.localdomai"..., 4096) = 338
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7fa6ae5a3000, 4096)            = 0
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=49825, ...}) = 0
mmap(NULL, 49825, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa6ae597000
close(3)                                = 0
open("/lib64/libnss_dns.so.2", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\20\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=27424, ...}) = 0
mmap(NULL, 2117880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa6a7483000
mprotect(0x7fa6a7488000, 2093056, PROT_NONE) = 0
mmap(0x7fa6a7687000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x7fa6a7687000
close(3)                                = 0
open("/lib64/libresolv.so.2", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\00009\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=110960, ...}) = 0
mmap(NULL, 2202248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa6a7269000
mprotect(0x7fa6a727f000, 2097152, PROT_NONE) = 0
mmap(0x7fa6a747f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fa6a747f000
mmap(0x7fa6a7481000, 6792, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa6a7481000
close(3)                                = 0
mprotect(0x7fa6a747f000, 4096, PROT_READ) = 0
mprotect(0x7fa6a7687000, 4096, PROT_READ) = 0
munmap(0x7fa6ae597000, 49825)           = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 # 接着连接本地的53端口进行域名解析,随后sendto系统调用出现"Connection refused"的错误
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "w\265\1\0\0\1\0\0\0\0\0\0\10mydevops\0\0\1\0\1", 26, MSG_NOSIGNAL, NULL, 0) = 26
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 5000) = 1 ([{fd=3, revents=POLLOUT|POLLERR}])
sendto(3, "\32\205\1\0\0\1\0\0\0\0\0\0\10mydevops\0\0\34\0\1", 26, MSG_NOSIGNAL, NULL, 0) = -1 ECONNREFUSED (Connection refused)
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "w\265\1\0\0\1\0\0\0\0\0\0\10mydevops\0\0\1\0\1", 26, MSG_NOSIGNAL, NULL, 0) = 26
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 5000) = 1 ([{fd=3, revents=POLLOUT|POLLERR}])
sendto(3, "\32\205\1\0\0\1\0\0\0\0\0\0\10mydevops\0\0\34\0\1", 26, MSG_NOSIGNAL, NULL, 0) = -1 ECONNREFUSED (Connection refused)
close(3)

大家可以看到有很多“Connection refused”的错误信息,在这些步骤中消耗了很多时间,最后超时导致的。不知道为什么Emacs启动时要解析这些信息?

既然问题出现了,这里的解决办法是在/etc/hosts文件里加上了关于主机名的解析。果然问题解决了。另外以emacs的守护进程方式启动,然后以emacsclient打开文件也是飞快的。

在/etc/hosts里添加了主机名解析后,打开Emacs的用时为:

[[email protected] ~]# time emacs --kill

real	0m0.400s
user	0m0.378s
sys	0m0.019s

是不是相差很多。

最后,关于Emacs的启动速度问题,小白这里总结了3种方法:

  1. Emacs以daemon的方式先启动(从emacs23版本开始支持),然后使用emacslient来编辑文件,这样的打开速度几乎是秒开。
# 具体如何操作
# emacs --daemon # 首先以daemon的方式启动
# emacsclient /etc/hosts # 然后就可以编辑文件了

在/etc/hosts里设置系统主机名解析

# hostname
mydevops
echo "192.168.56.101 mydevops" >> /etc/hosts

不加载任何配置文件进行启动(定制的内容越多启动越慢)

时间: 2024-10-06 19:44:56

解决由于DNS解析导致Emacs启动巨慢的问题的相关文章

连接慢的主要原因是DNS解析导致

解决方法: 1.在ssh服务端上更改/etc/ssh/sshd_config文件中的配置为如下内容: UseDNS no # GSSAPI options GSSAPIAuthentication no 然后,执行/etc/init.d/sshd restart重启sshd进程使上述配置生效,在连接一般就不慢了. 2.如果还慢的话,检查ssh服务端上/etc/hosts文件中,127.0.0.1对应的主机名是否和 uname -n的结果一样,或者把本机ip和hostname(uname -n结果

能Ping通,能DNS解析,不能打开网页(登陆QQ等)的解决办法

悲了个催,昨天的一次意外断电关机,导致操作系统再也无法访问Internet,具体表现为: 1.Ping地址正常,能ping通任何本来就可以ping通地址,如网关.域名. 2.能DNS解析域名. 3.无法打开网页,感觉是网页打开的一瞬间就显示无网络连接. 4.只需要连接ip地址.无需dns接些的程序都是无法连接,如QQ. 折腾了很久,通过重启路由.sfc修复命令.重装驱动.更换网络等方式修复均无果,郁闷了,只好启动很久以前安装在移动硬盘中的备用系统,结果发现在该系统下,网络正常.不知怎么的想起很久

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问 首先谢谢同事林路的指导,才能顺利解决问题 打开网站,访问一个域名,DNS解析到错误的IP地址,那么将不能正确访问该网站 1.使用8.8.8.8(google 公用dns定位本地dns解析和google解析),这里是zh.wikipedia.org ping zh.wikipedia.org     159.106.121.75(这个是很多dns异常解析的地址) nslookup -qt zh.wikipedia.org 8.8.8.8

解决dns服务器未找到问题 &&DNS解析服务器

第一部分: 有时已经连接到了网络,但是却提示未找到dns服务器,或未连接dns服务器,这多是因为dns设置的问题.下面是几种可行的解决方法. 方法一: 1. win + R   -> cmd -> netsh winsock reset 来重置网络目录.   2. 重启计算机. 问题: 不会存在多余的问题. 方法二: 1. 网络设置 -> 状态 -> 网络重置. 2. 五分钟后电脑自动重启. 问题: 会重置你之前设置的网络以及保存的密码. 方法三: 1. win + R ->

验证DNS解析失败:解决办法之一

今天晚上练习简单的DNS解析验证: 环境是在一台虚拟机上搭建,另一台虚拟机验证,步骤如下: 虚拟机A: 1.安装软件包 bind  和bind-chroot[[email protected] ~]# yum -y install bind-chroot bind 2.修改主配置文件  /etc/named.conf ,[[email protected] ~]# vim /etc/named.conf options {        listen-on port 53 { any; }; 

如何解决DNS解析错误故障

DNS解析出现错误,就是把一个域名解析成一个错误的IP地址,或者根本不知道某个域名对应的IP地址是什么时,我们就无法通过域名访问相应的站点了,这就是DNS解析故障.出现DNS解析故障最大的症状就是访问站点对应的IP地址没有问题,然而访问他的域名就会出现错误. 判断是否出现DNS解析故障的方法 点击开始->运行->输入CMD"后回车,输入"nslookup"回车,在输入你的域名,如果出现DNS request timed out,timeout was 2 seco

导致Tomcat启动过程缓慢的原因及解决方法

1.现象 在CentOS启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Session ID是通过SHA1算法计算得到的, 计算Session ID的时候必须有一个密钥.为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥. 22-Apr-2017 19:33:07.623 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGene

全球免费公共 DNS 解析服务器 IP 地址列表推荐 (解决无法上网/加速/防劫持)

除了宽带提供商的 DNS 以外,像阿里云.腾讯云.Google.百度.IBM.CNNIC 等一些有足够实力的大型互联网公司也非常慷慨地为公众提供了免费的 DNS 解析服务器.异次元这就搜集了全球范围内这些可靠.免费高速的公共 DNS 服务器地址列表,供大家选择使用.(推荐使用 DNS Jumper 快速修改 DNS) 国内免费公共 DNS 域名解析服务收集 以下收集的都是目前全球范围内 (更多数是国内的) 比较靠谱的免费公共 DNS 服务的 IP 地址.由于地区差异,同一组 DNS 服务器在不同

Linux性能优化实战:案例篇-DNS 解析时快时慢,我该怎么办?(37)

一.上节回顾 上一节,我带你一起学习了网络性能的评估方法.简单回顾一下,Linux 网络基于 TCP/IP协议栈构建,而在协议栈的不同层,我们所关注的网络性能也不尽相同. 在应用层,我们关注的是应用程序的并发连接数.每秒请求数.处理延迟.错误数等,可以使用 wrk.Jmeter 等工具,模拟用户的负载,得到想要的测试结果. 而在传输层,我们关注的是 TCP.UDP 等传输层协议的工作状况,比如 TCP 连接数.TCP 重传.TCP 错误数等.此时,你可以使用 iperf.netperf 等,来测