Roundup是基因組繪圖應用之一,用于預測基因、生物體和生物功能之間的進化關系。Roundup使用了計算密集型算法,開發該算法的哈佛大學研究人員在其中結合使用了簡單存儲服務(Simple Storage Service,S3)、彈性計算云(Elastic Compute Cloud,EC2)和Elastic MapReduce(EMR)等服務,這些服務都由亞馬遜網絡服務(AWS)提供。為了優化該應用,Roundup團隊減少了磁盤輸入/輸出,削減內存中緩存的使用,還計算了所需要的最佳實例數量。Roundup由此節省了40%的費用,并確保在不影響性能的情況下,可以滿足將來計算增長的需要。
如果不進行像Roundup所做的這類優化,應用也許能正常運行,但是進行優化則可能提升應用的可用性、防災能力,最重要的是降低使用公共云的成本。以下是將應用遷移到公共云時可以采用的五個具體的優化方法。
重構代碼
AWS不僅對所用的計算、存儲空間和網絡寬帶收費,而且每當訪問存儲空間進行讀取或寫入操作時,它同樣要收費。因此,我們應該結合應用中的讀取和寫入操作,盡可能把它們并為單次操作。這樣,當你使用自己的服務器進行讀取或寫入操作時,就不會產生額外成本。
這種云優化辦法的總體效果取決于所簽約使用的公共云服務提供商(CSP)的定價方法。然而,無論與哪家CSP簽約,重構代碼都可以看成是提升應用性能的機會。
優化選擇云實例
借助彈性計算云(EC2)建立實例時,可以在不同數量的計算、內存和存儲空間之間做一個選擇。此外,EC2提供了現貨實例(Spot Instance),指那些隨時可用的多余容量,而且價格低于普通實例。
在選擇之前,我們有必要花點時間對該應用進行一番試驗,以便確定所需要的計算、內存和存儲空間的最佳數量。這將保證我們在容量或配置方面不會過度開支,還能弄清楚是否應該考慮使用現貨實例(或者另一家CSP提供的同類服務)。
注重服務級別
每種應用都有其自己的服務級別要求,也就是它的一般用途和功能。比如說,面向客戶的電子商務網站,其服務級別就不同于面向內部員工的門戶網站。對照各應用所需的服務級別來評估公共云實例的成本,這也許可以降低和優化公共云成本。
今年6月的一個周五的夜晚,一場突如其來的暴風雨導致亞馬遜網絡服務(AWS)中斷,美國東部地區的許多用戶因此無法使用Netflix、Pinterest和Instagram等服務,這對視頻網站Netflix的用戶影響最大,因為周五晚上通常是需求高峰時段。
在這個事例中,由于視頻流服務本身所具有的特性,以及考慮到Netflix的存儲量大、帶寬密集,如果轉而使用亞馬遜在其他地區的數據中心也許不現實,但對于那些帶寬不太密集又比較關鍵的服務,可以對其進行優化,以便用備用數據中心來提供服務,而使它們不受這類服務中斷事件的影響。
微調自動擴展規則
能夠自動上下擴展(增減)服務器實例數量的應用為優化提供了大好機會。比如說,也許有這樣一條自動擴展規則:一旦所有目前實例上的處理器利用率達到80%,就會創建一個新實例;一旦處理器平均利用率達到40%,就會運用另一條自動擴展規則。
那我們如何知道80%和40%就是合適的數字?為什么不是85%和35%?如果采用后一條規則,可以創建較少的實例,降低成本。
此外,每個應用對計算、存儲空間和帶寬都有不一樣的要求。因此,其規則要取決于這三個因素的復雜組合,而不單單取決于處理器。我們可以擬定一個對公共云應用和它們所需的服務級別來說看似合理的組合,然后進行測試,并在一段時間內優化這些百分比。
數據庫的行優化
像Netflix等應用具有局部的特性,也就是說在大多數情況下,用戶只訪問符合自己要求的相關數據。Netflix使用AWS的地理區域(Region)和可用分區(Availability Zone),托管運行那些為住在數據中心附近的用戶提供服務的服務器。
這些都仰仗于數據庫分片(database sharding)技術。該技術可以拆分數據庫中的行,并且把不同分區存儲在位于不同數據中心的數據庫內。這項技術還適用于信用卡處理等應用,因為分片技術可應用于局部使用模式,比如查詢一個信用卡持有者的交易或者與一家商戶之間的交易。
不需要把所有的數據庫行存儲在所有的數據庫實例中。如果能拆分數據庫行,并把它們存儲在不同實例中的數據庫片段,那么就能充分利用所使用的模式的局部性。這將減少所需要的服務器實例的數量,因而可降低公共云服務的成本。
將應用遷移到公共云時,也許不用任何改動,它就能像平常那樣非常順暢地運行。但如果注意到CSP的收費方式,再結合應用的計算、內存、存儲空間和網絡帶寬的使用模式,就可以輕松減少公共云開支。借助一番代碼重構來優化應用本身,也許能提升性能、延長應用的使用壽命;對自己的默認實例做一番試驗和微調,加上自動擴展原則,也許能幫助進一步降低CSP收取的費用。