设为首页 收藏本站
查看: 168|回复: 0

[经验分享] 解决由于DNS解析导致Emacs启动巨慢的问题

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-28 09:14:14 | 显示全部楼层 |阅读模式
小白是Emacs的忠实用户,在CentOS服务器上也要自己编译安装一个Emacs供自己使用。由于使用了很多Emacs的插件,每次启动那是很缓慢的,几乎是5s左右才打开一个文件(让大家误以为服务器配置很烂呢)。在打开文件的速度上与Vim有些差距,Vim打开文件几乎是零等待(我这里的vim是简单的配置,并没有使用额外的插件;使用Emacs的同行可不要骂我哦)。

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

在没有联网的情况下,启动到底是多慢呢?
1
2
3
4
5
[iyunv@mydevops ~]# time emacs --kill

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




看一下strace emacs的部分输出,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 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的用时为:
1
2
3
4
5
[iyunv@mydevops ~]# time emacs --kill

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



是不是相差很多。

最后,关于Emacs的启动速度问题,小白这里总结了3种方法:
  • Emacs以daemon的方式先启动(从emacs23版本开始支持),然后使用emacslient来编辑文件,这样的打开速度几乎是秒开。

1
2
3
# 具体如何操作
# emacs --daemon # 首先以daemon的方式启动
# emacsclient /etc/hosts # 然后就可以编辑文件了



在/etc/hosts里设置系统主机名解析
1
2
3
# hostname
mydevops
echo "192.168.56.101 mydevops" >> /etc/hosts



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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-196485-1-1.html 上篇帖子: Centos磁盘管理和文件系统管理 下篇帖子: Linux的文件找工具find的小秘密
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表