淺談服務(wù)器性能測(cè)試的全生命周期——從測(cè)試、結(jié)果分析到優(yōu)化策略

遇事不決先拜服務(wù)器

作者:Micheal,騰訊資深后臺(tái)開(kāi)發(fā)工程師。

WeTest導(dǎo)讀
服務(wù)器性能測(cè)試是一項(xiàng)非常重要而且必要的工作,本文是作者M(jìn)icheal在對(duì)服務(wù)器進(jìn)行性能測(cè)試的過(guò)程中不斷摸索出來(lái)的一些實(shí)用策略,通過(guò)定位問(wèn)題,分析原因以及解決問(wèn)題,實(shí)現(xiàn)對(duì)服務(wù)器進(jìn)行更有針對(duì)性的優(yōu)化,提升服務(wù)器的性能。

1.服務(wù)器性能測(cè)試小結(jié)

講到服務(wù)器性能大部分人會(huì)想到這個(gè)服務(wù)器的架構(gòu)是什么樣子的,用的什么epoll,select,spring,tornado之類的。其實(shí)從本質(zhì)上來(lái)看的話目前大部分的服務(wù)器主要包括邏輯層以及DB層,我們采用的各種框架組件處于邏輯服務(wù)器中,如下圖所示。


服務(wù)器架構(gòu)本質(zhì)
服務(wù)器性能測(cè)試是一項(xiàng)比較繁瑣的事情,作為沒(méi)有做過(guò)性能測(cè)試的同學(xué)可能需要理清楚以下幾個(gè)事情。

1.1. 協(xié)議分析
首先是協(xié)議分析,性能測(cè)試本質(zhì)上是我們用代碼來(lái)模擬真實(shí)的用戶請(qǐng)求,所以我們必須要知道發(fā)送出去的請(qǐng)求內(nèi)容才能模擬。在典型的CS服務(wù)器中很多使用了protobuf,thrift,tdr(騰訊自研)來(lái)序列化以及反序列號(hào)請(qǐng)求內(nèi)容。
序列化之后一方面可以對(duì)數(shù)據(jù)進(jìn)行壓縮處理,另一方面也避免請(qǐng)求內(nèi)容明文傳輸造成被抓包·泄漏數(shù)據(jù)的危險(xiǎn)。之前有過(guò)服務(wù)器傳輸數(shù)據(jù)的時(shí)候使用的是明文直接發(fā)送,而且這個(gè)數(shù)據(jù)是一些敏感的sql語(yǔ)句,這樣首先暴露了數(shù)據(jù)庫(kù)的表結(jié)構(gòu),同時(shí)不法分子可以通過(guò)模擬發(fā)包造成“脫褲”甚至是數(shù)據(jù)被清空。

1.1.1. Protobuf
谷歌出品,必屬精品。Protobuf使用起來(lái)很方便,學(xué)習(xí)成本非常低,而且序列化和反序列號(hào)的接口很容易使用。同時(shí)它相對(duì)于xml以及json,極大的的減小了數(shù)據(jù)占用的空間,減少了傳輸成本。目前支持包括C++,java以及python等多個(gè)語(yǔ)言。Protobuf目前用的比較多,打解包也很方便,比較推薦使用。

1.1.2. Thrift
Thrift是一個(gè)跨語(yǔ)言的輕量級(jí)rpc消息和數(shù)據(jù)交換框架。Thrift支持幾乎絕大部分主流的語(yǔ)言,包括C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml,雖然大部分我都沒(méi)有用過(guò)。相對(duì)于protobuf,thrift提供了全套R(shí)PC解決方案,包括序列化機(jī)制、傳輸層、并發(fā)處理框架等,也因?yàn)槿绱藅hrift的學(xué)習(xí)成本比較高。

1.1.3. 騰訊自研協(xié)議tdr
Tdr是騰訊自研跨平臺(tái)多語(yǔ)言數(shù)據(jù)表示組件,主要用于基于數(shù)據(jù)的序列化反序列化(支持二進(jìn)制方式和XML文本方式)以及ORM數(shù)據(jù)存儲(chǔ)。廣泛用于互娛自研游戲和部分代理游戲。在性能上基本和protobuf差不多,主要應(yīng)用在C++程序中。
在做服務(wù)器性能測(cè)試之前,我們需要了解它的協(xié)議是怎么定義的。

1.2. 機(jī)器人管理
本質(zhì)上機(jī)器人管理就是一個(gè)調(diào)度控制器,在獲取需要發(fā)送的請(qǐng)求協(xié)議之后,需要有一個(gè)框架來(lái)管理所有的機(jī)器人,控制機(jī)器人的啟動(dòng),發(fā)送請(qǐng)求以及停止的動(dòng)作。框架的選擇需要根據(jù)服務(wù)器的實(shí)際情況來(lái),不同的業(yè)務(wù)場(chǎng)景,使用不同的框架產(chǎn)生的壓力上限也會(huì)不一樣。

機(jī)器人管理框架
以一個(gè)簡(jiǎn)單的多線程框架為例,主線程負(fù)責(zé)控制邏輯,管理所有的機(jī)器人狀態(tài)信息。子線程執(zhí)行每個(gè)機(jī)器人的任務(wù),包括連接服務(wù)器,發(fā)送數(shù)據(jù),接收數(shù)據(jù),斷開(kāi)連接等。

1.3. 結(jié)果統(tǒng)計(jì)
機(jī)器人發(fā)送請(qǐng)求包之后,一般是要等待服務(wù)器的響應(yīng)回包。服務(wù)器那邊可以計(jì)算本次壓測(cè)過(guò)程中各項(xiàng)業(yè)務(wù)數(shù)據(jù),包括TPS,總的收發(fā)包量等。
不可能在測(cè)試過(guò)程中一直盯著各個(gè)數(shù)據(jù)看,我們需要把每項(xiàng)數(shù)據(jù)記錄下來(lái),后續(xù)綜合各項(xiàng)結(jié)果進(jìn)行分析。
這里的結(jié)果統(tǒng)計(jì)除了需要統(tǒng)計(jì)每個(gè)機(jī)器人收到回包的結(jié)果,還需要統(tǒng)計(jì)服務(wù)器在壓測(cè)過(guò)程中的各項(xiàng)性能數(shù)據(jù)變化。一旦客戶端的壓力上到一定值時(shí),服務(wù)器某項(xiàng)資源支撐不了的話,說(shuō)明這個(gè)資源可能存在短板,存在可以優(yōu)化的空間。

  1. 性能結(jié)果分析

性能結(jié)果分析是一個(gè)比較復(fù)雜的過(guò)程。需要綜合硬件、操作系統(tǒng)、應(yīng)用程序等多方面來(lái)定位。

2.1. 硬件的影響
硬件對(duì)服務(wù)器性能影響還是蠻大的,如果是土豪的話,可以直接買(mǎi)最好的。我們分析硬件主要是希望選擇合適的配置,節(jié)約資源,避免出現(xiàn)高射炮打蚊子的情況。

2.1.1. CPU
在資金的充足下,一般來(lái)說(shuō)CPU的數(shù)量越多,主頻越高,那么服務(wù)器的性能也就會(huì)越好。在實(shí)際測(cè)試過(guò)程中,如果在大壓力下持續(xù)觀察CPU的使用率很低,那么CPU的資源基本上是可以滿足服務(wù)器要求的。這樣的情況其實(shí)是有點(diǎn)浪費(fèi)CPU資源的,比較理想的情況是壓力不大的時(shí)候CPU利用率比較低,壓力上來(lái)之后CPU利用率保持在60%-70%。
大部分的CPU在同一時(shí)間內(nèi)只能運(yùn)行一個(gè)線程,但是超線程的處理器可以在同一個(gè)時(shí)間運(yùn)行多個(gè)線程,我們可以利用處理前超線程特性提高系統(tǒng)性能。雖然采用超線程技術(shù)能同時(shí)執(zhí)行兩個(gè)線程,但它并不象兩個(gè)真正的CPU那樣,每個(gè)CPU都具有獨(dú)立的資源。當(dāng)兩個(gè)線程都同時(shí)需要某一個(gè)資源時(shí),其中一個(gè)要暫時(shí)停止,并讓出資源,直到這些資源閑置后才能繼續(xù)。因此超線程的性能并不等于兩顆CPU的性能。

2.1.2. 內(nèi)存
內(nèi)存的大小也是影響服務(wù)器性能的一個(gè)重要因素。內(nèi)存太小,系統(tǒng)進(jìn)程要被阻塞,應(yīng)用程序會(huì)變得緩慢,甚至是失去響應(yīng);如果太大的話,也是造成一種浪費(fèi)。Linux系統(tǒng)中采用物理內(nèi)存和虛擬內(nèi)存兩種方式,使用虛擬內(nèi)存可以緩解物理內(nèi)存的不足,但是如果占用過(guò)多的虛擬內(nèi)存的話,應(yīng)用程序的性能會(huì)明顯的下降。

2.1.3. 網(wǎng)絡(luò)帶寬
網(wǎng)絡(luò)帶寬的大小限制了客戶端與服務(wù)器交互的流量,相對(duì)其他硬件資源,網(wǎng)絡(luò)帶寬在價(jià)格上更貴。這需要我們合理預(yù)估服務(wù)器的可服務(wù)器能力,需要占用的帶寬資源。

2.1.4. 磁盤(pán)IO
目前磁盤(pán)都是機(jī)械方式運(yùn)作的,主要體現(xiàn)在磁盤(pán)讀寫(xiě)前尋找磁道的過(guò)程。磁盤(pán)自帶的讀寫(xiě)緩存大小,對(duì)于磁盤(pán)讀寫(xiě)速度至關(guān)重要。讀寫(xiě)速度快的磁盤(pán),通常都帶有較大的讀寫(xiě)緩存。磁盤(pán)的尋道過(guò)程是機(jī)械方式,決定了其隨機(jī)讀寫(xiě)速度將明顯低于順序讀寫(xiě)。在我們做系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)時(shí),需要考慮到磁盤(pán)的這一特性。

2.2. 操作系統(tǒng)及軟件
2.2.1. 版本
不同的操作系統(tǒng)在內(nèi)核實(shí)現(xiàn)上可能各不相同,因而對(duì)運(yùn)行在上面的應(yīng)用程序來(lái)說(shuō)可能影響比較大。
筆者并沒(méi)有做過(guò)分析不同操作系統(tǒng)對(duì)服務(wù)器性能的影響,因?yàn)橹挥眠^(guò)Linux開(kāi)發(fā)服務(wù)器程序。Linux操作系統(tǒng)在這十幾年發(fā)展的異常迅猛,目前大部分的服務(wù)器都是運(yùn)行在Linux操作系統(tǒng)上的。Linux目前具有最好的生態(tài)系統(tǒng),服務(wù)器端的各種軟件都為它而設(shè)計(jì),默認(rèn)都認(rèn)為你是在 Linux 上跑,你要是整一個(gè)非 Linux 的服務(wù)器,你得有足夠的心理準(zhǔn)備,因?yàn)槌霈F(xiàn)任何問(wèn)題,你可能未必能找到能幫你解決問(wèn)題的人。

2.2.2. 參數(shù)配置
先說(shuō)一個(gè)小故事。福特公司一套重要設(shè)備出現(xiàn)故障,找了很多人來(lái)維修,結(jié)果都沒(méi)有維修好,沒(méi)辦法了,就在購(gòu)買(mǎi)設(shè)備的英國(guó)公司高價(jià)聘請(qǐng)一位工程師過(guò)來(lái)維修,工程師來(lái)到之后,反復(fù)查找原因,最后在一個(gè)小零件上劃了一條線,然后對(duì)旁邊福特公司的人說(shuō),在劃線的地方切掉就好了,果不其然,切掉之后故障真的解除了,按照合約,福特公司應(yīng)支付公司一萬(wàn)美元,周圍的人都唏噓不已,感嘆一條線就可以價(jià)值一萬(wàn)美元,工程師回答到:那條線只值一美元,而怎樣找到那條線值9999美元。
我們?cè)跍y(cè)試服務(wù)器的過(guò)程中,經(jīng)常會(huì)遇到性能上不去。查看CPU,網(wǎng)絡(luò),IO消耗都挺低的,就是定位不到問(wèn)題的原因。有經(jīng)驗(yàn)的程序員可能會(huì)告訴你你把某個(gè)參數(shù)修改一下,立馬性能噌噌噌上去了。比如mysql相關(guān)設(shè)置,系統(tǒng)文件描述符,緩沖區(qū)大小,time_wait快速回收設(shè)置等,甚至是線程池配置的線程個(gè)數(shù)也會(huì)對(duì)服務(wù)器的性能產(chǎn)生較大的影響。
關(guān)于數(shù)據(jù)庫(kù)參數(shù)的設(shè)置,比如mysql的配置文件my.cnf文件中,修改不同的配置(比如innodb_flush_log_at_trx_commit 設(shè)置為0,1還是2 )可能會(huì)對(duì)數(shù)據(jù)庫(kù)的讀寫(xiě)性能影響很大。

2.2.3. 應(yīng)用程序本身實(shí)現(xiàn)
比如程序中需要頻繁申請(qǐng)內(nèi)存,使用bzero和memset對(duì)服務(wù)器性能影響差距可能會(huì)很大。
另外程序中的一些查詢操作,采用不同的數(shù)據(jù)結(jié)構(gòu),可以實(shí)現(xiàn)時(shí)間和空間上的相互轉(zhuǎn)化,從而影響服務(wù)器的性能。

  1. Linux下的數(shù)據(jù)監(jiān)控工具

3.1. Vmstat
Vmstat,virtual memmory statistics(虛擬內(nèi)存統(tǒng)計(jì)),主要是對(duì)操作系統(tǒng)的內(nèi)存信息、進(jìn)程狀態(tài)、cpu活動(dòng)等進(jìn)行監(jiān)視,但是它不能對(duì)某個(gè)進(jìn)程進(jìn)行深入的分析。

Procs中r列表示運(yùn)行和等待CPU時(shí)間片的進(jìn)程數(shù),如果r值長(zhǎng)期大于CPU個(gè)數(shù),說(shuō)明CPU資源不夠用啦,可以適當(dāng)增加CPU數(shù)量。
Procs中b列表示當(dāng)前等待資源的進(jìn)程數(shù),包括等待I/O,內(nèi)存等。
Swpd列表示切換到內(nèi)存交換區(qū)的KB數(shù),一般si,so為0的話基本不影響系統(tǒng)的性能。
Cache是page cache的內(nèi)存數(shù)量,Linux會(huì)把空閑的物理內(nèi)存的一部分拿來(lái)做文件和目錄的緩存,以便提高程序執(zhí)行的性能。如果cache的值較大的話,說(shuō)明緩存了太多的文件,如果bi值小的話,說(shuō)明文件系統(tǒng)效率比較高。
Si是每秒從磁盤(pán)讀入虛擬內(nèi)存的大小,如果這個(gè)值一直大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,需要查找耗內(nèi)存進(jìn)程解決掉。
Bi,bo是表示從塊設(shè)備讀入數(shù)據(jù)的總量以及寫(xiě)到塊設(shè)備的數(shù)據(jù)總量。如果bi+bo值比較大,而且wa值也比較大的話,說(shuō)明系統(tǒng)磁盤(pán)I/O可能有問(wèn)題,性能不高。
In和cs是每秒鐘的設(shè)備中斷數(shù)以及上下文切換數(shù)。它們很大的話,表面內(nèi)核消耗的CPU時(shí)間較多。

3.2. Top
Top是一個(gè)動(dòng)態(tài)顯示過(guò)程,即可以通過(guò)用戶按鍵來(lái)不斷刷新當(dāng)前狀態(tài)。它可以按照系統(tǒng)中當(dāng)前進(jìn)程的CPU利用率以及占用的內(nèi)存大小進(jìn)行排序,可以比較快速定位出系統(tǒng)響應(yīng)遲鈍的原因。如果在前臺(tái)執(zhí)行該命令,它將獨(dú)占前臺(tái),直到用戶終止該程序?yàn)橹埂?/p>

top是一個(gè)顯示數(shù)據(jù)較多的工具,第一行顯示的是系統(tǒng)的開(kāi)機(jī)運(yùn)行時(shí)間,機(jī)器的CPU負(fù)載信息;第二行顯示當(dāng)前系統(tǒng)任務(wù)的總數(shù),以及各個(gè)狀態(tài)的進(jìn)程數(shù);第三行顯示的是CPU資源的使用情況總覽;第四行顯示內(nèi)存的使用情況總覽;第五行顯示的是內(nèi)存交換區(qū)的使用情況總覽;后面開(kāi)始是每個(gè)進(jìn)程對(duì)資源使用的情況。

3.3. Nmon
Nmon提供對(duì)CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤(pán)等系統(tǒng)資源占用情況分析,相比其他Linux命令獲取到的數(shù)據(jù),nmon的功能更為集中、配置性更強(qiáng)。通過(guò)nmon采集到數(shù)據(jù)之后可以在windows系統(tǒng)中使用nmon_analyser做數(shù)據(jù)的展示以及分析工作,可視化效果比較好。
由于一般Linux系統(tǒng)都不自帶nmon,使用之前需要下載安裝。

3.4. Uptime
Uptime命令顯示系統(tǒng)已經(jīng)運(yùn)行了多長(zhǎng)時(shí)間,它依次顯示當(dāng)前時(shí)間、系統(tǒng)已經(jīng)運(yùn)行了多長(zhǎng)時(shí)間、目前有多少登陸用戶、系統(tǒng)在過(guò)去的1分鐘、5分鐘和15分鐘內(nèi)的平均負(fù)載。
關(guān)于系統(tǒng)平均負(fù)載,它表示在特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列中的平均進(jìn)程數(shù)。如果一個(gè)進(jìn)程滿足以下條件則其就會(huì)位于運(yùn)行隊(duì)列中:沒(méi)有在等待I/O操作的結(jié)果;沒(méi)有主動(dòng)進(jìn)入等待狀態(tài);沒(méi)有被停止。

3.5. Netstat
Netstat命令可以顯示本機(jī)的網(wǎng)絡(luò)連接情況,監(jiān)聽(tīng)端口以及路由表等各種網(wǎng)絡(luò)相關(guān)信息。Netstat用于顯示與IP、TCP、UDP和ICMP協(xié)議相關(guān)的統(tǒng)計(jì)數(shù)據(jù),一般用于檢驗(yàn)本機(jī)各端口的網(wǎng)絡(luò)連接情況。
比較常用的可以用次命令查看當(dāng)前開(kāi)啟監(jiān)聽(tīng)的服務(wù)器進(jìn)程信息以及端口信息。


3.6. Free
Free是監(jiān)控Linux使用情況最常用的命令。

“Free -m”可以查看以M為單位的使用情況,這里主要觀察free和cached兩列。
一般來(lái)說(shuō),如果應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存>70%時(shí),表明目前系統(tǒng)內(nèi)存資源比較充足,不影響系統(tǒng)性能;如果應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<20%時(shí),表明目前系統(tǒng)內(nèi)存資源比較緊缺,需要釋放其他程序內(nèi)存或者增加內(nèi)存;如果應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存在20%-70%之間,表明目前系統(tǒng)的內(nèi)存資源基本滿足應(yīng)用需求,暫時(shí)不影響系統(tǒng)的性能。

3.7. Sar
Sar也是一個(gè)強(qiáng)大的分析系統(tǒng)性能的工具,它可以比較全面的獲取系統(tǒng)的CPU,運(yùn)行隊(duì)列,磁盤(pán)IO,分頁(yè),內(nèi)存,CPU中斷,網(wǎng)絡(luò)等多項(xiàng)數(shù)據(jù)。

上圖是使用sar獲取系統(tǒng)CPU的整體負(fù)責(zé)情況,每隔1秒統(tǒng)計(jì)一次,統(tǒng)計(jì)3次,最后會(huì)給出3次的平均值。需要查看其他的數(shù)據(jù)可以查看手冊(cè)使用。

3.8. Iostat
Iostat是I/O statistics的縮寫(xiě),主要功能是對(duì)系統(tǒng)的磁盤(pán)I/O操作進(jìn)行監(jiān)控。它的輸出主要顯示磁盤(pán)讀寫(xiě)操作的統(tǒng)計(jì)信息,同時(shí)也會(huì)給出CPU的使用情況。

這里顯示的是查看CPU和磁盤(pán)的信息,統(tǒng)計(jì)間隔2秒,共3次。

3.9. Valgrind
Valgrind是一款廣泛用于監(jiān)控程序運(yùn)行過(guò)程進(jìn)行內(nèi)存調(diào)試、內(nèi)存泄漏檢測(cè)以及性能分析的工具。它會(huì)給出內(nèi)存泄漏的統(tǒng)計(jì),包括definitely lost,indirectly lost,possibly lost,still reachable ,suppressed等,我們可以使用valgrind來(lái)測(cè)試程序中內(nèi)存不規(guī)范使用的部分。同時(shí)對(duì)于地址越界問(wèn)題也可以通過(guò)valgrind掃出來(lái),它會(huì)統(tǒng)計(jì)invalid write的情況。

  1. 服務(wù)器的性能優(yōu)化

在優(yōu)化之前,先要搞清楚服務(wù)器的具體業(yè)務(wù)需求是什么,據(jù)此來(lái)優(yōu)化其中的短板。

4.1. 存儲(chǔ)的優(yōu)化
IO相對(duì)來(lái)說(shuō)比較耗時(shí),我們都知道越靠近CPU的存儲(chǔ),其訪問(wèn)速度越快,但是其價(jià)格越貴。下圖來(lái)展示了不同存儲(chǔ)的容量以及訪問(wèn)時(shí)間。
目前很多同學(xué)在優(yōu)化服務(wù)器性能的時(shí)候都會(huì)從存儲(chǔ)這方面入手。


儲(chǔ)存的容量以及訪問(wèn)時(shí)間

4.1.1. 用內(nèi)存換時(shí)間
4.1.1.1. 增加緩存
很多web應(yīng)用是有大量的靜態(tài)內(nèi)容,這些靜態(tài)內(nèi)容主要都是一些小文件,并且會(huì)被頻繁的讀,采用Apache以及nginx作為web服務(wù)器。在web訪問(wèn)量不大的時(shí)候,這兩個(gè)http服務(wù)器可以說(shuō)是非常的迅速和高效,如果負(fù)載量很大的時(shí)候,我們可以采用在前端搭建cache服務(wù)器,將服務(wù)器中的靜態(tài)資源文件緩存到操作系統(tǒng)內(nèi)存中直接進(jìn)行讀操作,因?yàn)橹苯訌膬?nèi)存讀取數(shù)據(jù)的速度要遠(yuǎn)大于從硬盤(pán)讀取。這個(gè)其實(shí)也是增加內(nèi)存的成本來(lái)降低訪問(wèn)磁盤(pán)帶來(lái)的時(shí)間消耗。

4.1.1.2. 內(nèi)存數(shù)據(jù)庫(kù)
內(nèi)存數(shù)據(jù)庫(kù),其實(shí)就是將數(shù)據(jù)放在內(nèi)存中直接操作的數(shù)據(jù)庫(kù)。相對(duì)于磁盤(pán),內(nèi)存的數(shù)據(jù)讀寫(xiě)速度要高出幾個(gè)數(shù)量級(jí),將數(shù)據(jù)保存在內(nèi)存中相比從磁盤(pán)上訪問(wèn)能夠極大地提高應(yīng)用的性能。內(nèi)存數(shù)據(jù)庫(kù)拋棄了磁盤(pán)數(shù)據(jù)管理的傳統(tǒng)方式,基于全部數(shù)據(jù)都在內(nèi)存中重新設(shè)計(jì)了體系結(jié)構(gòu),并且在數(shù)據(jù)緩存、快速算法、并行操作方面也進(jìn)行了相應(yīng)的改進(jìn),所以數(shù)據(jù)處理速度比傳統(tǒng)數(shù)據(jù)庫(kù)的數(shù)據(jù)處理速度要快很多。
但是安全性的問(wèn)題可以說(shuō)是內(nèi)存數(shù)據(jù)庫(kù)最大的硬傷。因?yàn)閮?nèi)存本身有掉電丟失的天然缺陷,因此我們?cè)谑褂脙?nèi)存數(shù)據(jù)庫(kù)的時(shí)候,通常需要,提前對(duì)內(nèi)存上的數(shù)據(jù)采取一些保護(hù)機(jī)制,比如備份,記錄日志,熱備或集群,與磁盤(pán)數(shù)據(jù)庫(kù)同步等方式。
對(duì)于一些重要性不高但是又想要快速響應(yīng)用戶請(qǐng)求的部分?jǐn)?shù)據(jù)可以考慮內(nèi)存數(shù)據(jù)庫(kù)來(lái)存儲(chǔ),同時(shí)可以定期把數(shù)據(jù)固化到磁盤(pán)。

4.1.1.3. RDD
這里圖個(gè)新鮮,說(shuō)說(shuō)內(nèi)存換時(shí)間在大數(shù)據(jù)云計(jì)算相關(guān)領(lǐng)域的一些應(yīng)用。Spark最近很火,它的核心要數(shù)RDD了,RDD最早來(lái)源與Berkeley實(shí)驗(yàn)室的一篇論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。現(xiàn)有的數(shù)據(jù)流系統(tǒng)對(duì)兩種應(yīng)用的處理并不高效:一是迭代式算法,這在圖應(yīng)用和機(jī)器學(xué)習(xí)領(lǐng)域很常見(jiàn);二是交互式數(shù)據(jù)挖掘工具。這兩種情況下,將數(shù)據(jù)保存在內(nèi)存中能夠極大地提高性能。這里不詳細(xì)說(shuō)RDD了,只是想說(shuō)程序員一直是覬覦內(nèi)存的讀取速度的。

4.1.2. 使用SSD等
除了對(duì)內(nèi)存方面的優(yōu)化,還可以對(duì)磁盤(pán)這邊進(jìn)行優(yōu)化。跟傳統(tǒng)機(jī)械硬盤(pán)相比,固態(tài)硬盤(pán)具有快速讀寫(xiě)、質(zhì)量輕、能耗低以及體積小等特點(diǎn)。但是ssd的價(jià)格相比傳統(tǒng)機(jī)械硬盤(pán)要貴,有條件的可以使用ssd來(lái)代替機(jī)械硬盤(pán)。

4.2. 數(shù)據(jù)庫(kù)優(yōu)化
大部分的服務(wù)器請(qǐng)求最終都是要落到數(shù)據(jù)庫(kù)中,隨著數(shù)據(jù)量的增加,數(shù)據(jù)庫(kù)的訪問(wèn)速度也會(huì)越來(lái)越慢。想要提升請(qǐng)求處理速度,必須要對(duì)原來(lái)的單表進(jìn)行動(dòng)刀了。目前主流的Linux服務(wù)器使用的數(shù)據(jù)庫(kù)要屬mysql了,如果我們使用mysql存儲(chǔ)的數(shù)據(jù)單個(gè)表的記錄達(dá)到千萬(wàn)級(jí)別的話,查詢速度會(huì)很慢的。
根據(jù)業(yè)務(wù)上合適的規(guī)則對(duì)數(shù)據(jù)庫(kù)進(jìn)行分區(qū)分表,可以有效提高數(shù)據(jù)庫(kù)的訪問(wèn)速度,提升服務(wù)器的整體性能。
另外對(duì)于業(yè)務(wù)上查詢請(qǐng)求,在建表的時(shí)候可以根據(jù)相關(guān)需求設(shè)置索引等,以提高查詢速度。

4.3. 利用多核優(yōu)勢(shì)
現(xiàn)在運(yùn)行服務(wù)器的主流機(jī)器配置都是多核CPU的,我們?cè)谠O(shè)計(jì)服務(wù)器的時(shí)候可以利用多核心的特點(diǎn),采用多進(jìn)程或者多線程的框架。
關(guān)于選擇多線程還是多進(jìn)程可以根據(jù)實(shí)際的需求,結(jié)合各自的優(yōu)缺點(diǎn)進(jìn)行選擇。
對(duì)于多線程的使用,特別是使用線程池的時(shí)候可以通過(guò)測(cè)試不同線程池服務(wù)器的性能來(lái)設(shè)置合適的線程池。

4.4. 選擇合適的IO模型
《UNIX網(wǎng)絡(luò)編程卷1:套接字聯(lián)網(wǎng)API》中有一幅圖比較經(jīng)典。

IO模型
阻塞I/O模型:數(shù)據(jù)沒(méi)到達(dá)之前,I/O一直阻塞,如果數(shù)據(jù)到達(dá),則會(huì)返回。典型的是recvfrom,一般的默認(rèn)都是阻塞的。非阻塞的I/O模型:和阻塞相反,只要不能得到結(jié)果的時(shí)候,I/O立刻返回。不會(huì)阻塞當(dāng)前線程。
IO復(fù)用模型:也就是自己要學(xué)習(xí)的部分。多路復(fù)用的意思是,將多路信號(hào)合并到一路上進(jìn)行處理,類似多個(gè)管道匯集到一個(gè)管道,與之相反的是多路分解。
IO復(fù)用模型主要是select,poll,epoll;對(duì)一個(gè)IO端口,兩次調(diào)用,兩次返回,比阻塞IO并沒(méi)有什么優(yōu)越性;關(guān)鍵是能實(shí)現(xiàn)同時(shí)對(duì)多個(gè)IO端口進(jìn)行監(jiān)聽(tīng);函數(shù)也會(huì)使進(jìn)程阻塞,但是和阻塞I/O所不同的的,這兩個(gè)函數(shù)可以同時(shí)阻塞多個(gè)I/O操作。而且可以同時(shí)對(duì)多個(gè)讀操作,多個(gè)寫(xiě)操作的I/O函數(shù)進(jìn)行檢測(cè),直到有數(shù)據(jù)可讀或可寫(xiě)時(shí),才真正調(diào)用I/O操作函數(shù)。
信號(hào)驅(qū)動(dòng):首先開(kāi)啟套接口信號(hào)驅(qū)動(dòng)I/O功能,并通過(guò)系統(tǒng)調(diào)用sigaction安裝一個(gè)信號(hào)處理函數(shù)。當(dāng)數(shù)據(jù)報(bào)準(zhǔn)備好被讀時(shí),就為該進(jìn)程生成一個(gè)SIGIO信號(hào)。隨即可以在信號(hào)處理程序中調(diào)用recvfrom來(lái)讀數(shù)據(jù)報(bào),井通知主循環(huán)數(shù)據(jù)已準(zhǔn)備好被處理中。也可以通知主循環(huán),讓它來(lái)讀數(shù)據(jù)報(bào)。
異步的IO模型:告知內(nèi)核啟動(dòng)某個(gè)操作,并讓內(nèi)核在整個(gè)操作完成后(包括將數(shù)據(jù)從內(nèi)核拷貝到用戶自己的緩沖區(qū))通知我們。
這里并不是說(shuō)一定要用某個(gè)模型,epoll也并不是在所有情況下都比select性能要好的,在選擇的時(shí)候還是要結(jié)合業(yè)務(wù)需求來(lái)。

4.5. 分布式部署程序
當(dāng)單機(jī)服務(wù)器已經(jīng)找不到合適的優(yōu)化點(diǎn)時(shí),我們可以通過(guò)分布式部署來(lái)提高服務(wù)器的響應(yīng)能力。優(yōu)秀的服務(wù)器開(kāi)發(fā)都會(huì)為自己的服務(wù)器的擴(kuò)容,容災(zāi)提出一些解決方案。個(gè)人覺(jué)得服務(wù)器設(shè)計(jì)的時(shí)候簡(jiǎn)單點(diǎn)比較好,這樣后期擴(kuò)容的時(shí)候會(huì)很方便。

總結(jié)
服務(wù)器性能測(cè)試是一項(xiàng)比較繁瑣的事情,作為沒(méi)有做過(guò)性能測(cè)試的同學(xué)需要事先了解服務(wù)器的協(xié)議是如何定義的,建立框架管理機(jī)器人、統(tǒng)計(jì)測(cè)試中機(jī)器人收到回包的結(jié)果以及壓測(cè)過(guò)程中各項(xiàng)性能數(shù)據(jù)的變化。在完成了測(cè)試的過(guò)程后,可以從硬件、操作系統(tǒng)以及應(yīng)用程序等多個(gè)方面進(jìn)行對(duì)性能結(jié)果進(jìn)行定位。最后在明確業(yè)務(wù)需求的前提下,通過(guò)存儲(chǔ)優(yōu)化、數(shù)據(jù)庫(kù)優(yōu)化以及分布式部署程序等手段完成服務(wù)器的性能優(yōu)化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評(píng)論 3 428
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,823評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,604評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,339評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,713評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評(píng)論 3 445
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,893評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,201評(píng)論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,397評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,631評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,033評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,321評(píng)論 1 293
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,128評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,347評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容