解决由于DNS解析导致Emacs启动巨慢的问题
小白是Emacs的忠实用户,在CentOS服务器上也要自己编译安装一个Emacs供自己使用。由于使用了很多Emacs的插件,每次启动那是很缓慢的,几乎是5s左右才打开一个文件(让大家误以为服务器配置很烂呢)。在打开文件的速度上与Vim有些差距,Vim打开文件几乎是零等待(我这里的vim是简单的配置,并没有使用额外的插件;使用Emacs的同行可不要骂我哦)。
最近发现Emacs的打开速度是巨慢无比的,之前就没有这种问题。细想了一下,主要是之前有网络连接,而这几次是没有网络连接的。所以小白就想到底是Emacs的什么插件需要用到网络呢?于是使用了系统下的strace工具进行追踪一下Emacs是如何启动的,终于找到是什么原因了,原来是主机名解析的问题,
在没有联网的情况下,启动到底是多慢呢?
[root@mydevops ~]# 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的用时为:
[root@mydevops ~]# time emacs --kill real 0m0.400s user 0m0.378s sys 0m0.019s
是不是相差很多。
最后,关于Emacs的启动速度问题,小白这里总结了3种方法:
Emacs以daemon的方式先启动(从emacs23版本开始支持),然后使用emacslient来编辑文件,这样的打开速度几乎是秒开。
# 具体如何操作 # emacs --daemon # 首先以daemon的方式启动 # emacsclient /etc/hosts # 然后就可以编辑文件了
2. 在/etc/hosts里设置系统主机名解析
# hostname mydevops echo "192.168.56.101 mydevops" >> /etc/hosts
3. 不加载任何配置文件进行启动(定制的内容越多启动越慢)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一次误操作引起的linux系统网络故障
1、故障描述 接到用户报障,生产某系统无法访问。同事接到报障后立即排查,经测试,系统确实无法访问,并且无法ping通服务器。 2、故障处理 由于客户端无法ping通服务器,需要进入机房查看。经查看,服务器硬件无报警,系统无重启。登录系统使用ifconfig命令查看,IP丢失(eth0不存在),紧接打开网卡配置目录/etc/sysconfig/network-scripts,发现网卡文件ifcfg-eth0丢失,只存在之前备份的ifcfg-eth0.bak文件和ifcfg-peth0文件。根据先抢通业务后处理故障原则,通过备份的文件复制一份进行修复,重启network服务,故障解决。 3、故障分析 3.1经了解,故障发生时,有一同事正在登录系统查询安全基线配置,但同事坚称并未进行rm或者mv网卡文件操作。通过history命令得知,该同事确实未执行rm或者mv操作,只执行了chkconfig --list命令,但却不小心把原本需要复制的内容误操作的当作命令去执行了,历史记录如下: 883chkconfig--list 884NetworkManager0:off1:off2:off3:o...
- 下一篇
企业网络中广域网出口介绍及业务办理
这次我给大家来介绍一下,企业网络中的广域网出口,说起企业(单位)的组网建设,设备调试之类的工作,我想只要是有工作经验的网工,或者系统管理员都不会陌生,核心交换机,划分VLAN ,起三层路由功能,防火墙(路由器)起NAT之类的。都是驾轻就熟了。那么在这篇文章当中暂时先不提设备是如何配置的,先谈一下这个企业网络当中的出口 我把企业网络中的广域网出口分成2种。 第一种:光纤互联网业务.即从电信或铁通这样的ISP运营商申请光纤接入,开通的是互联网,也就是俗称的“外网”业务。这种的广域网出口,只要是企业组网都是需要用到的,因为公司的员工需要收发邮件,在网络上查询信息。没有这个正常的工作就无发进行。 这个就是一个最为基础的网络拓扑图,在企业当中也应用的比较多。就是电脑接入二层交换机,通过核心的三层交换机到路由器,路由器上做NAT,这样公司内部的电脑就可以上互联网了。这种就是我说的第一种“光纤互联网业务” 这种业务的办理流程是: 1.先确定公司(单位)需要的是那个ISP运行商,电信还是铁通。确定完毕后,去当地的IPS运营商营业厅办理业务,有的企业规模较大,会有运营商直接的大客户经理进行接待。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题