第六節 服務器的考量點

我以一個不專業的程式開發者的觀點,來敘述對於服務器(Server)而言,除了各種的系統開發外,我們還需要注意的就是服務器本身。

以空間換取時間

在這裡已經是老生常談,有不少人反應Server造成硬碟損壞的情形,我個人也有這種煩惱,而且我單純只開給我自己使用便壞了一顆硬碟,以Windows來說光開機後不執行其他程式便占據1GB記憶體空間,現在的電腦基本配備大約是8GB,如果只用於20人的Server我想是足夠的,當然這部分還要考量你在Server還裝了多少東西。

JAVA本身提供「垃圾收集」機制(Garbage collection,GC),所以我們不需要太過於擔心記憶體 (RAM)不夠用的問題,不過對於開發者而言還得要注意自己寫的程式碼會不會造成記憶體溢位異常(OutOfMemoryError),比如我上一次發布的幾個插件都有reload後無法進行GC的物件,那就是static物件我相信已經有不少人已經將這個問題處理好了,所以當你裝了一堆插件、MOD那你相信這些創作者不會有造成溢位的程式碼?

Server使用RAM較高還有其他原因,其一是執行的效率,以目前的固態硬碟(SSD)與目前RAM來做讀取的比較大約是500:5000 MB/S,也就是RAM讀取效率高,所以大多數Server的做法是將資料放置在RAM中在進行處理,比如Minecraft Server平時是不做儲存等關閉伺服器時才做,而且目前4GB RAM價位在600~700NT,有必要省這筆錢嗎?

RAM Disk 顧名思義就是把RAM拿來當硬碟使用同時提升硬碟的讀取減少硬碟損壞的情形,比如經常需要讀寫的檔案便可放置在裡面,不過對於RAM不夠大的Server就無法負擔了,另外重要的檔案請勿放入,RAM本身在不供電的情況下是無法保存資料的,當然這部分的運用就要一點技術。

以時間節省空間

當然不用我說就是前述的反面了,最有名的就是Windows作業系統內的「虛擬記憶體」(Virtual Memory,VM)了,虛擬記憶體就是為了滿足實體記憶體的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯記憶體,用作虛擬記憶體的磁碟空間被稱為交換空間(Swap Space)。

自然VM讀取效率等同硬碟讀取效率,所以在執行效率也下降了好幾倍,相對的可以打破RAM限制,如果你用SSD(大多數SSD讀取還未滿300MB/S)做這種傻事那你就是瘋了畢竟VM是種毒藥,所有的硬碟都有讀取壽命而VM會加速縮短壽命,危害到伺服器珍貴的資料,當然會使用到VM也是不得已而為之,所以用在VM的硬碟最好與儲存資料的硬碟分開使用。

可以拆開的SSD不免想到USB隨身碟(USB flash drive),而且USB3.0可是號稱可以達到5Gbps(640MB/S,不過市售的都標榜150MB/S),基本上VM也用不到100G以上這麼多的空間,Windows系統還可將隨身碟設定裝置搭配 ReadyBoost 使用,只不過價位上也貴了些。

VM好歸好但是何時會將資料放置在裡面卻不得而知,不如直接做硬碟的存取比如JSON文件,當處理的資料越來越龐大就該採用資料庫(SQL)做法,老套一點是使用文件,利用有規律、計畫的整理方式,雖然雜亂些但是自由度比較大,使用套裝軟體(MySQL、Microsoft SQL、...等)方便簡單,這也是各大遊戲廠商常用的做法,只需要熟悉部分常用的SQL語法就能發揮強大的能力。

平行化處理

對於資料處理如過想要處理越快自然少不了高效能處理器(CPU),問題是在這幾年我們CPU除了提升效能外也增加了處理核心而大多數編寫的程式都是以單核心處理為主,這時我們就浪費了CPU的執行效率,這部分可是Server的重傷,因此需要考慮平行化處理雖然行處理目前不能帶來期待的效率(因為平行處理只能達到1+1>1的效果)在JAVA自身也不斷的改進下平行處理便成為一份重要的工作

平衡思考在平行處理上佔了大部分怎麼說呢想想在非平行處理下的執行便佔據多數資源,導致Server記憶體分配捉襟見肘,這時要是轉為平行處理瞬間大量資源流失下是否能提升效率,還不如穩定資源的分配,因此前面所提兩大方向的處理便顯得特別重要另外進行平行處理並非能平行完成畢竟每顆核心也有各自的工作分配也就是處理的順序會因為工作分配而影響最後的成果,如果需要依序運行便不適合採用

平行化價值在於處理效率,因此屬於結資料非固定的資料結構都不用於平行化

powered by GitbookFile Modify: 2017-07-19 14:28:16

results matching ""

    No results matching ""