Chrome multi-process limitation (Windows)
Chrome 的特殊架構(Multiple processes)讓每個tab都變成獨立的執行空間(process),因此彼此不會互相干擾,即使當掉了也不會影響整個瀏覽器和其他 tab。也因如此,在多個 tab 中效能也比較好,每個 tab 各自只負責各自的工作,只需要 CPU 夠強力即可。如果是 multiple thread 設計,那麼可能在同一個 process 的 threads 中,彼此必須針對共用的 resources 像是 HTTP request, rendering 等做 lock/unlock 等 synchronization。
但是在平常的生活中,感覺卻不是那麼一回事,因為 chrome 感覺卡卡的。就算另外一個網頁正在載入中,先切換到已經完成的網頁去瀏覽,感覺上下捲或是點選連結都頓頓的。一點都不像是 Chrome 該有的表現。我用的是 Atom netbook 沒錯,但是 Opera/Firefox 除了肥腫並不會有這些問題。甚至我也有 Ubnutu 的 Chromium,都沒這樣的問題。
後來只好叫出 Task Manager 來看,發現例如下面螢幕截圖的現象。Browser 主要視窗一個 process,其他一堆 extensions 各自擁有一個 process,還有 about:memory 的 built-in page 也用掉一個 process。但是其他網頁,不管是不同 domain,都是同一個 process。這樣不就跟使用命令列參數讓 chrome 變成非 multi-process 架構的 "--single-process" 是同樣的功用。可是我並不是這樣的參數,何況這麼多 extensions processes 也說明了並非在 single process mode。
我找了幾個 chrome 文件,說明了 Process Models 的架構和用法。也找到了幾個參數可以設定。
但是在平常的生活中,感覺卻不是那麼一回事,因為 chrome 感覺卡卡的。就算另外一個網頁正在載入中,先切換到已經完成的網頁去瀏覽,感覺上下捲或是點選連結都頓頓的。一點都不像是 Chrome 該有的表現。我用的是 Atom netbook 沒錯,但是 Opera/Firefox 除了肥腫並不會有這些問題。甚至我也有 Ubnutu 的 Chromium,都沒這樣的問題。
後來只好叫出 Task Manager 來看,發現例如下面螢幕截圖的現象。Browser 主要視窗一個 process,其他一堆 extensions 各自擁有一個 process,還有 about:memory 的 built-in page 也用掉一個 process。但是其他網頁,不管是不同 domain,都是同一個 process。這樣不就跟使用命令列參數讓 chrome 變成非 multi-process 架構的 "--single-process" 是同樣的功用。可是我並不是這樣的參數,何況這麼多 extensions processes 也說明了並非在 single process mode。
我找了幾個 chrome 文件,說明了 Process Models 的架構和用法。也找到了幾個參數可以設定。
- --single-process: 讓 chrome 的 browser, extensions, tab 都只用一個 process
- --process-per-tab: 每個 tab 都各自成為一個 process
- --process-per-site: 依照 site 各自成為一個 process, 不同的 instance 會被 group 到同一個 process。例如很多 google 服務都會用到 google.com,則這樣只會有一個 process 處理多個不同的 web site instances.
- --process-per-site-instance: 每個 site instance 都自成一個 process (預設)
理論上沒有設定,預設應該就是上面說的最後一項。我也手動把 --process-per-tab, --process-per-site, --process-per-site-instance 加入捷徑的命令列。但是完全無效。
後來,我把 extensions 全部關了,就一切恢復正常,每個不同的瀏覽 tab 各自成為一個 process。但是我把 extensions 逐一打開,到了 10 幾個 extensions 之後,又出現上面一樣的問題,不管是不同的 tab 或 website 都合在在一個 process。
後來大概看了一些 chrome 討論,Windows 上有 child process 的限制。大概猜測是這樣(沒有確切的定義或懶得找 source code),所以有一些 OS fundamental 的問題,雖然 Chrome 的 Multiple processes 好意,可是在 Windows 上就被打折了。可是在 Mac OS X 或 Linux 上就沒有這個問題。再加上 extensions & plugins 本身就是自身獨立為一個 process,因此一起動 chrome 就有十幾個 process,再加上後來的網頁瀏覽,因此 Chrome 就自動把後來的網頁 tab 都合併在同一個 process 去了。
因此本題的解法,就是把不必要的 extensions disable or uninstall。反正 disable 後需要再 enable,馬上就可以用不需要如同 firefox 需要重新啟動。如此一來,Chrome 又可以恢復到每個 site or tab 自成為 process 一格。
但是麻煩點就是在 Chrome 可以同步,因此 Mac OS X 上的 chrome 的 extensions 也因此會被 disable。但明明 Mac OS X 和 Linux 都不會有這問題,只是 Windows 上治標的方法,加上 Chrome Sync 的過程,一併給 Mac or Linux 上的 Chrome 也帶來 extensions 無法使用的不便。
Extensions 很好用,可是灌太多對於 Windows 的 Chrome 並非好處。只好保留幾個真的必須的,像是 AdBlock、Flash Block、Flash Quality、Google Dictionary。其他的就只好忍痛先 disable。
因此本題的解法,就是把不必要的 extensions disable or uninstall。反正 disable 後需要再 enable,馬上就可以用不需要如同 firefox 需要重新啟動。如此一來,Chrome 又可以恢復到每個 site or tab 自成為 process 一格。
但是麻煩點就是在 Chrome 可以同步,因此 Mac OS X 上的 chrome 的 extensions 也因此會被 disable。但明明 Mac OS X 和 Linux 都不會有這問題,只是 Windows 上治標的方法,加上 Chrome Sync 的過程,一併給 Mac or Linux 上的 Chrome 也帶來 extensions 無法使用的不便。
Extensions 很好用,可是灌太多對於 Windows 的 Chrome 並非好處。只好保留幾個真的必須的,像是 AdBlock、Flash Block、Flash Quality、Google Dictionary。其他的就只好忍痛先 disable。
張貼留言