今日下午和重要客戶的幾位相關人員開會,會中除了滿足客戶原本想新建的網站之外 (我在開會的過程中直接幫他們架好基礎的網站,再交由他們自行處理後續) ,我主動提出他們在AWS主機上的效能問題,並給他們一些相關的建議和Log參考,令我感到很高興的是他們都能欣然接受,也願意想辦法去改善,實在讓我感到超開心的,所以我決定多分享一些心得。
幫客戶代管AWS主機有很多年經驗的我,雖然不幫客戶開發程式、規劃資料庫等事宜,但我會主動幫客戶觀察主機運作狀況,做好日常維運,包括:
#檔案型資料備份
#資料庫型資料備份
#系統的資安防護與效能監看
#災難復原與問題排除
若是客戶的預算較夠,也會幫他們做好異地備援的設置;若是客戶能接受建言,我才會進一步給予程式和資料庫改善的建議!
在沒使用雲端服務前,最常遇到的效能瓶頸有:
#網路頻寬不夠
#硬體規格太弱
#系統效能太差
#CPU負載太重
#Disk IO效能太差
#記憶體不足
#儲存空間不夠
#資料庫效率太差
#程式執行速度太差
自從使用AWS雲端之後,有幾個瓶頸雖然還是會遇到,但大都可以解決:
#系統效能太差
#CPU負載太重
#Disk IO效能太差
#記憶體不足
#儲存空間不夠
#資料庫效率太差
#程式執行速度太差
比較無奈的是,不論是委外開發或是自行開發的網站,只要效能一變差,幾乎都是推說系統效能的問題,很多程式開發者都會說在自家的測試主機上測試都很快,一定是AWS主機效能太差!
說真的,是有可能!
以同樣4核心、8GB記憶體的主機規格來說,虛擬主機的效能無法像實體主機那麼強悍,因為虛擬主機的底層還有雲端系統,所以在選擇AWS主機時,我都會建議客戶採用「打帶跑」方式來做調整,而這也是AWS雲端所提供的彈性優勢之一。
然而等主機升級後,效能卻不見提升
過去幾年當我在查完主機Log,然後告訴客戶是程式寫得不好造成的效能瓶頸時,只有兩種回應:
#程式是委外開發的,效能不好也無能為力
#程式是公司自行開發的,但開發人員說不是他們的問題
於是客戶只能選擇不斷升級主機規格,造成主機成本不斷上揚!
程式效能不好,很多是因為資料庫的關係
台灣最近幾年因為太多人在鼓吹學程式,於是有一大堆人透過各種方式學寫程式,可惜的是很多人太過強調開發速度,反倒很多基本功沒學,例如系統管理、系統分析、系統架構、資料庫規劃…等等,這些都是會影響程式開發的重要基礎。
例如垂直架構、水平架構的資料庫建置方式就會不太一樣,垂直架構的資料庫往往和網站程式是在同一台主機裡,兩者共用同台主機的資源,包括CPU、記憶體、儲存空間、網路等等,因此效能也會明顯有互相影響。
此外,若是資料庫規劃得不好,很容易在程式中要大量使用inner join、子查詢等方式來取得所需要的資料時,就很容易造成CPU用量激增、主機效能下降的問題,很多開發者在自家測試主機開發時會覺得沒有問題,因為:
#開發用的測試主機規格可能比雲端的虛擬主機好
#開發用的測試主機沒有那麼多資料量
#開發用的測試主機沒有那麼多人同時連線
以前我使用Cacti或AWS CloudWatch等監控工具來監看主機,但真的要用來協助客戶查詢佔用CPU效率的程序時幾乎是不可能,因為只能透過時間點來查各種Log,想要查出問題實在是曠日廢時。
現在我自己都用我去年完成的INSTAWATCHER來監看我管理的伺服器主機,可以迅速協助客戶找到是什麼程序在佔用主機的CPU效能,然後就能縮小範圍再進一步去查相關的Log來加以判斷真正瓶頸所在。
下圖就是資料庫佔用太多CPU資源
當然,還有其它許許多多的問題都必須仰賴專業的人一起合作去搜查、想辦法解決,例如:
#資安攻擊造成的效能癱瘓
#不懂雲端而用錯主機等級
#一台主機同時掛載太多任務
#既是正式主機也是測試主機
#資料庫單一表單破百萬筆資料
#…..
只是經過那麼多年,我親身經歷過那麼多案子,很多委外廠商在沒發生問題的時候只想要用自家的程式來綁住客戶,遇到問題時就開始推諉、不承認是自己的問題、或是擺爛不收尾,甚至棄案而逃…
所以我認為,真正的效能瓶頸是:人
我知道接程式開發案超累人的,我也不想評論台灣接開發案的生態為何會變成這樣(有爛廠商也有奧客人,於是造成負面循環),但我自己很堅守我的職業道德,我不懂的就會事先告訴客戶我不懂、也不會為了接案而裝懂然後再發給下包(這就是造成很多問題的關鍵點)。
而若是我所擅長的技術領域內,我能幫客戶的就會儘量幫,因為客戶若能興盛賺錢、我們也才有機會繼續為客戶服務,所以請不要把我當敵人。
我自己花那麼多年學會各種技術不是為了接程式開發案,而是為了創造自己的產品、「開發」自己的未來!
這裡有篇我在2011年分享的文章,有興趣的人可以看看:
淺談AWS的效能與備援
https://www.tts.bz/archives/571