Chrome启动速度极慢问题排查记录

  • 2019-05-25
  • 1,508
  • 2
  • 3

  似乎从2个月前开始,也不知道自己做了什么,电脑win10上的Chrome启动变得很慢,通常打开Chrome后,通常要等10~20秒才会弹出浏览器窗口界面。如下面的视频所示。

https://v.youku.com/v_show/id_XNDE5NTUyMjc0MA==.html?spm=a2h3j.8428770.3416059.1

  这也太慢了吧,我去年双十一刚换的电脑,9900K+TITAN RTX+970 pro组合,照理说不应该呀,公司里的i7 6700破机器启动chrome还飞快呢,正常情况1~2s就能打开。所以可以确定这是软件问题了,刚开始我以为是chrome缓存的问题,但是清除缓存,没有用。接着我尝试了更新chrome版本,禁用所有扩展程序,断网启动chrome,重装chrome,安装最新测试版chrome,无一例外全部都失败了!

  这实在是太奇葩了,看起来不是chrome本身的问题了,那难道是其他安装的程序对chrome有影响?于是又尝试了退出所有系统托盘进程,禁用windows defender,依然没有用。那怎么办?难道又要重装系统解决问题?到此我内心已经无数次想重装windows了(要是搁在当年大一大二的时候,二话不说马上重装了)。但是,因为现在工作了对于装系统这种事情多少有点懒了,其他事情一多,就不想折腾了,所以就拖着,一拖从3月拖到了5月,本以为随着系统更新也许有可能这个问题自己就解决了,然而事实并非如此,问题依旧,毫无进展。

  直到最近,稍微有了一些空闲时间,再加上自己对这个问题又忍无可忍,于是打算仔细分析一下。首先,我尝试了在安全模式中启动Chrome,速度正常,启动很快,但是正常进入系统后,Chrome启动就会变得很慢。由此断定确实是其他的一些非系统关键进程引起的Chrome启动变慢。那么这就稍微简单一点了,我只要把影响chrome启动的进程找出来干掉即可。但是说起来容易做起来很难,我尝试着杀没用的进程,杀了半天根本没有效果,200多个后台进程中要找出那个一对chrome有影响的进程简直就是大海捞针,这可怎么办呢?突然有一次,我注意到了一个细节:我在重启刚进入桌面的时候,马上打开chrome,发现打开速度很快,但是当我关闭chrome窗口后,再次启动chrome,就变得很慢了。这说明这个进程启动的时间还是稍晚于桌面一些,那么,我能不能想个办法把启动过程中进程启动顺序记录下来呢?

  要记录进程启动顺序,那显然不能自己写一个程序再加入自启动列表,因为这样程序启动的优先级太低,必须要是一个服务级别的进程才行。那么就用Visual Studio 2015写了一个windows服务吧,核心代码很简单:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ProcessRecoder
{
    public partial class Service1 : ServiceBase
    {
        private String filePath = @"D:\proc.log";
        private FileStream fs = null;
        private StreamWriter sw = null;
        private Thread maintask=null;
        private Dictionary<int, String> processidct = null;
        private bool kill;
        public Service1()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            this.fs = new FileStream(filePath, FileMode.Create,FileAccess.Write);
            this.sw = new StreamWriter(fs, UnicodeEncoding.GetEncoding("UTF-8"));
            this.processidct = new Dictionary<int, String>();
            this.maintask = new Thread(new ThreadStart(this.ProcessScope));
            this.kill = false;
            this.maintask.Start();
            
        }
        private void ProcessScope()
        {
            this.sw.WriteLine("Service Start!");
            while (true)
            {
                Process[] ps = Process.GetProcesses();
                foreach (Process p in ps)
                {
                    if (!this.processidct.ContainsKey(p.Id))
                    {
                        this.processidct.Add(p.Id, p.ProcessName);
                        String logline = p.Id + " " + p.ProcessName;
                        if (p.ProcessName.Contains("chrome"))
                        {
                            logline += "-------------------This is Chrome!!!";
                        }
                        this.sw.WriteLine(logline);
                    }
                }
                if (this.kill)
                {
                    break;
                }
            }
        }
        protected override void OnStop()
        {
            this.sw.WriteLine("Service Start!");
            this.kill = true;
            this.maintask.Join(100);
            this.fs.Flush();
            this.fs.Close();
        }
    }

 

  功能就是当用户登录是就加载服务,然后将进程启动的顺序记录在D:\proc.log文件里面。最后用InstallUtil.exe安装服务。安装好之后如图:

  好了,接下来重启机器,在进入桌面时,立即打开chrome,速度正常。然后关闭,再次打开chrome,速度很慢,好,现在已经记录下来进程启动的顺序了,接下来停止服务,打开proc.log看一下,前后没用的部分我这里就略去了:

...
5172 baidupinyin
14352 RuntimeBroker
5304 mobsync
14568 svchost
14596 svchost
14488 smartscreen
14984 chrome-------------------This is Chrome!!!
10596 chrome-------------------This is Chrome!!!
15204 chrome-------------------This is Chrome!!!
15304 chrome-------------------This is Chrome!!!
12296 AlibabaProtect
9120 wwbizsrv
15168 conhost
15440 chrome-------------------This is Chrome!!!
15464 chrome-------------------This is Chrome!!!
15524 chrome-------------------This is Chrome!!!
15540 chrome-------------------This is Chrome!!!
15752 chrome-------------------This is Chrome!!!
15964 chrome-------------------This is Chrome!!!
15972 CompPkgSrv
15988 chrome-------------------This is Chrome!!!
16104 chrome-------------------This is Chrome!!!
16112 chrome-------------------This is Chrome!!!
16232 chrome-------------------This is Chrome!!!
15632 cmd
15600 conhost
15528 svchost
3332 WCChromeNativeMessagingHost
15948 svchost
16120 wwbizsrv
7272 RuntimeBroker
16236 NahimicSvc32
3324 RuntimeBroker
15816 NahimicSvc32
15836 NahimicSvc32
15968 NahimicSvc32
16364 NahimicSvc32
16196 NahimicSvc32
16252 NahimicSvc32
15676 NahimicSvc32
15688 NahimicSvc32
15624 NahimicSvc32
16100 NahimicSvc32
15444 NahimicSvc32
15884 NahimicSvc32
15536 NahimicSvc32
10092 WmiApSrv
15504 chrome-------------------This is Chrome!!!
11084 chrome-------------------This is Chrome!!!
1488 SpatialAudioLicenseSrv
16372 CompPkgSrv
16320 RuntimeBroker
15844 SpatialAudioLicenseSrv
15420 SpatialAudioLicenseSrv
15956 SpatialAudioLicenseSrv
16188 SpatialAudioLicenseSrv
...

 

  由此就很容易分析了,两次chrome启动之间,只有这几个进程启动,分别是:

cmd
conhost
svchost
WCChromeNativeMessagingHost
wwbizsrv
RuntimeBroker
NahimicSrv32
WmiApSrv

 

  那么逐个排查吧,最后发现,当我停止Nahimic service(进程名NahimicSrv32)的时候,chome启动速度立马变快,而启动该服务,速度就立即被拖慢到十多秒。

  好了,原因已找到,那怎么卸载这个服务呢?为此我查了一些资料,原来Nahimic service是Realtek集成声卡驱动程序的一个音效插件,随声卡驱动一起安装,不会影响声卡使用,如果禁用只是效果器不能使用而已,所以其实也没多大影响,再加上前面的文章《德国坦克Terratec AUREON7.1PCIe声卡的ASIO驱动在freepiano里不能用的解决方案》中我也提到,目前我已经主要使用TERRATEC的独立声卡,集成声卡已经几乎不用,所以似乎直接卸载realtek的驱动也没事,于是,卸载大法好:

  卸载之后我又尝试重新安装了最新版本的Realtek声卡驱动,发现新的驱动的Nahimic service就不会造成chrome启动变慢了,看来真是玄学,也许是修复了一些bug吧。这个问题到此就完美解决了。

后记:

  相比以前动不动就重装系统解决问题,其实很多时候获得那个结果并不是最重要的。关键在于过程和问题的本质,现在能够静心分析问题找到答案,也算是这几年在心境方面有所收获了。

评论

  • 淳帅二代回复

    博主,我是个非程序员的也不算小白的电脑用户,也是遇到了这个问题,想用您这个方法试一下,但是安装完vs后,到用InstallUtil.exe安装服务这里就不会了,搜到的教程也比较高深难懂,请问您能否出个视频教程?

    • Jarvis回复

      我建议你可以直接卸载realtek驱动试试?

发表评论

*

浙ICP备16016405号-2
浙公网安备 33010602007544号