前言
因?yàn)槊看未虬鼤r間有點(diǎn)長(9min左右),組里要求進(jìn)行優(yōu)化,于是就有了ccache這個東東(當(dāng)然組里的其他同學(xué)也進(jìn)行了其它的優(yōu)化)。
簡單搜下ccache 發(fā)現(xiàn)文章并不多,就那么幾篇,然后對比了一下,都很雷同,感情大家用的少啊!
于是按照上面的配置高興的部到項(xiàng)目里,跑一下,木有啥問題,就是第一遍編譯速度出奇的慢,不過第二遍那速度杠杠的。但在后續(xù)的部署過程中遇到到了一系列問題。
磁盤讀寫慢
在部署到CI機(jī)器(是一臺Mini ,很老的機(jī)械硬盤)之后發(fā)現(xiàn)原本20min左右就跑完了,現(xiàn)在突然增到45min以上,不合理啊至少不能超過20min 吧。
帶著這個問題,我觀察了CI機(jī)上一次run的過程,發(fā)現(xiàn)一個問題,CPU 的使用率大部分時間都是維持在10%左右,只有一小部分是60%~80%,不對啊,我的本本在built 的過程中CPU 的使用率基本都是90%,為啥CPU 大部分時間都是在閑著呢?后面我看了下磁盤的IO讀寫,發(fā)現(xiàn)是滿載荷,后續(xù)又觀察了幾次都是這個樣子,我測了下磁盤讀寫速度:
time sh -c "dd if=/dev/zero of=/tmp/testfile bs=100k count=1k && sync"
額,僅僅只有 40MB/s,我的 15寸MacPro 600MB/s,好吧,不是一個量級的。后續(xù) CI 機(jī)上就移除了 ccache ,僅在打包機(jī)(垃圾桶)上部署。
模塊間的解耦
在使用ccache 的過程中,拉取同事的代碼后,經(jīng)常會出現(xiàn) Build 時間過長的現(xiàn)象,用命令 ccache -s 查看后發(fā)現(xiàn) cache 命中率下降。于是我分析了 ccache 的log,著重那些 miss 的類,發(fā)現(xiàn)其引用了相當(dāng)多的模塊,還有各種交叉的,引用很亂,組里的同學(xué)一改動就會波及到很多類,而對于那些引用很少的,命中率很高。所以模塊間的耦合對 ccache 影響很大。后續(xù)組里同學(xué)們一起進(jìn)行了模塊的解耦,效果是很顯著的。
PCH
PCH 這個東東簡直就是 ccache 的克星,所以盡量克制,能不用則不用。我司的項(xiàng)目已經(jīng)移除了 PCH。
ccache 配置
CCACHE_CPP2 這個設(shè)置我關(guān)閉,感覺這個設(shè)置很浪費(fèi)時間
CCACHE_HARDLINK 這個設(shè)置也關(guān)閉,沒必要使用壓縮的緩存
其它的配置基本都是和大家搜的博客里一樣了
策略
雖然進(jìn)行了以上幾個步驟,但 模塊間的解耦 不是立即能夠完成的,需要漫長的過程,有時候 ccache 仍然會大面積 miss 為了防止這樣的情況出現(xiàn),我們應(yīng)該做 一個策略,當(dāng)使用 ccache 超過某一個時間比如 10min,還沒有完成打包或者編譯 就自動禁掉 ccahce ,經(jīng)過長時間的測試發(fā)現(xiàn)這個策略很好使,沒有一次超過 30min 的。
總結(jié)
使用 ccache 并不一定就能使你的 Xcode 立即就飛起來,很可能會摔的更死,所以項(xiàng)目優(yōu)化是必須的,同時硬件配置也要提升,磁盤的IO讀寫越快越好。