Kan-Ru Chen's Weblog

Firefox Strange Slowness and The Reason

最近系統在開啟 firefox 後常常會使得整個系統越來越慢,一開始以為是因為我用 minefield 的關係。到 bugzilla 搜尋了半天只發現跟啟用 jemalloc 會拖慢系統的相關問題,我以為就是這個原因,因為有一次我 /tmp 開不夠大,結果被 jemalloc 的 mmap 檔塞爆了。但是調整 jemalloc 相關參數之後仍不見起色。

於是我換回預設的 iceweasel 3.0.3,但情況還是一樣。只要開啟 firefox 之後系統就會明顯變慢,但是看記憶體用量也不會越變越多,是正常範圍。越來越覺得可能不是 firefox 的錯,不然 bugzilla 與 web 上早就叫苦連天了。

今天突然想到我在編譯 kernel 的時候有加入 CONFIG_HIGHPTE 選項,以為是因此拖慢系統,又認為可能是因為開啟 CONFIG_HIGHMEM4G 所以又增加額外 overhead,於是開始研究解決方法。

開啟 CONFIG_HIGHMEM4G 是因為我總共有 1.25 G 的記憶體可以用,但是 Linux 預設只能使用實體記憶體 9xx MB 的大小,不得已只好開啟 CONFIG_HIGHMEM4G,可以參考 Kernel Trap 這篇。

搜尋一下在 2004 年與 2006 年都有把 2G memory split 選項加入的討論,但是目前編譯 2.6.28-rc7 時還是要先開啟 EMBEDDED 才能選 VMSPLIT_2G...

總之編譯了 kernel 重開機測試,打開 htop 監看記憶體用量與 CPU 用量,突然發現我所有的 process 都是 nice 5,想起 awesome 有個 bug report 就是一樣的問題,因為某一次的修改讓 awesome 會用 SHELL 環境變數裡面的 shell 來執行程式,而有問題的是 zsh,因為 zsh 預設會給 background process 比較高的 nice 值,而我只有瞄過這個 bug report 沒有多想...

我使用 cpufreq 的 ondemand governor,如果 process 的 nice 值大於零則不會替該 process 調高 CPU 速度,因此很有可能這樣才讓系統顯得緩慢 (永遠都是 798 MHz),從 .xsession 把 SHELL 指定為 /bin/sh 之後 nice 值都正常了,直到現在系統都沒有變慢的情形。

令人好奇的是,究竟是因為我改了 kernel 參數而變好的,還是改了 SHELL 才變好的呢... 我猜大概是後者影響比較多吧。