服務器進程:如何提高服務器并發(fā)處理能力
【小編提示】文章內(nèi)容僅供參考,海外服務器租用\托管方案,請咨詢YINGSOO客服,24小時免費電話400-630-3752
【熱搜產(chǎn)品】俄羅斯物理服務器價格 | 越南物理服務器價格 | 菲律賓云服務器價格 | 越南云服務器價格
【推薦閱讀】YINGSOO云日本云服務器好在哪? | YINGSOO云服務器優(yōu)惠活動都在這里!

什么是服務器并發(fā)處理能力
一臺服務器在單位時間里能處理的請求越多,服務器的能力越高,也就是服務器并發(fā)處理能力越強
有什么方法衡量服務器并發(fā)處理能力
1. 吞吐率
吞吐率,單位時間里服務器處理的最大請求數(shù),單位req/s。
從服務器角度,實際并發(fā)用戶數(shù)的可以理解為服務器當前維護的代表不同用戶的文件描述符總數(shù),也就是并發(fā)連接數(shù)。服務器一般會限制同時服務的最多用戶數(shù),比如apache的maxclents參數(shù)。
這里再深入一下,對于服務器來說,服務器希望支持高吞吐率,對于用戶來說,用戶只希望等待最少的時間,顯然,雙方不能滿足,所以雙方利益的平衡點,就是我們希望的最大并發(fā)用戶數(shù)。
2. 壓力測試
有一個原理一定要先搞清楚,假如100個用戶同時向服務器分別進行10個請求,與1個用戶向服務器連續(xù)進行1000次請求,對服務器的壓力是一樣嗎?實際上是不一樣的,因?qū)γ恳粋€用戶,連續(xù)發(fā)送請求實際上是指發(fā)送一個請求并接收到響應數(shù)據(jù)后再發(fā)送下一個請求。這樣對于1個用戶向服務器連續(xù)進行1000次請求, 任何時刻服務器的網(wǎng)卡接收緩沖區(qū)中只有1個請求,而對于100個用戶同時向服務器分別進行10個請求,服務器的網(wǎng)卡接收緩沖區(qū)最多有100個等待處理的請求,顯然這時的服務器壓力更大。
壓力測試前提考慮的條件
并發(fā)用戶數(shù): 指在某一時刻同時向服務器發(fā)送請求的用戶總數(shù)(Httpwatch)
總請求數(shù) 請求資源描述 請求等待時間(用戶等待時間) 用戶平均請求的等待時間 服務器平均請求處理的時間 硬件環(huán)境壓力測試中關心的時間又細分以下2種:
用戶平均請求等待時間(這里暫不把數(shù)據(jù)在網(wǎng)絡的傳輸時間,還有用戶pc本地的計算時間計算入內(nèi)) 服務器平均請求處理時間用戶平均請求等待時間主要用于衡量服務器在一定并發(fā)用戶數(shù)下,單個用戶的服務質(zhì)量;而服務器平均請求處理時間就是吞吐率的倒數(shù),一般來說,用戶平均請求等待時間 = 服務器平均請求處理時間 * 并發(fā)用戶數(shù)
怎么提高服務器的并發(fā)處理能力
1. 提高cpU并發(fā)計算能力
服務器之所以可以同時處理多個請求,在于操作系統(tǒng)通過多執(zhí)行流體系設計使得多個任務可以輪流使用系統(tǒng)資源,這些資源包括cpU,內(nèi)存以及i/o. 這里的i/o主要指磁盤i/o, 和網(wǎng)絡i/o。
多進程 & 多線程
多執(zhí)行流的一般實現(xiàn)便是進程,多進程的好處可以對cpU時間的輪流使用,對cpU計算和io操作重疊利用。這里的io主要是指磁盤io和網(wǎng)絡io,相對cpU而言,它們慢的可憐。
而實際上,大多數(shù)進程的時間主要消耗在i/o操作上。現(xiàn)代計算機的dmA技術(shù)可以讓cpU不參與i/o操作的全過程,比如進程通過系統(tǒng)調(diào)用,使得cpU向網(wǎng)卡或者磁盤等i/o設備發(fā)出指令,然后進程被掛起,釋放出cpU資源,等待i/o設備完成工作后通過中斷來通知進程重新就緒。對于單任務而言,cpU大部分時間空閑,這時候多進程的作用尤為重要。
多進程不僅能夠提高cpU的并發(fā)度。其優(yōu)越性還體現(xiàn)在獨立的內(nèi)存地址空間和生命周期所帶來的穩(wěn)定性和健壯性,其中一個進程崩潰不會影響到另一個進程。
但是進程也有如下缺點:
fork()系統(tǒng)調(diào)用開銷很大: prefork 進程間調(diào)度和上下文切換成本: 減少進程數(shù)量 龐大的內(nèi)存重復:共享內(nèi)存 ipc編程相對比較麻煩減少進程切換
當硬件上下文頻繁裝入和移出時,所消耗的時間是非??捎^的??捎胣mon工具監(jiān)視服務器每秒的上下文切換次數(shù)。為了盡量減少上下文切換次數(shù),最簡單的做法就是減少進程數(shù),盡量使用線程并配合其它i/o模型來設計并發(fā)策略。
還可以考慮使用進程綁定cpU技術(shù),增加cpU緩存的命中率。若進程不斷在各cpU上切換,這樣舊的cpU緩存就會失效。
減少使用不必要的鎖
服務器處理大量并發(fā)請求時,多個請求處理任務時存在一些資源搶占競爭,這時一般采用“鎖”機制來控制資源的占用,當一個任務占用資源時,我們鎖住資源,這時其它任務都在等待鎖的釋放,這個現(xiàn)象稱為鎖競爭。
通過鎖競爭的本質(zhì),我們要意識到盡量減少并發(fā)請求對于共享資源的競爭。比如在允許情況下關閉服務器訪問日志,這可以大大減少在鎖等待時的延遲時間。要最大程度減少無辜的等待時間。
這里說下無鎖編程,就是由內(nèi)核完成這個鎖機制,主要是使用原子操作替代鎖來實現(xiàn)對共享資源的訪問保護 ,使用原子操作時,在進行實際的寫操作時,使用了lock指令,這樣就可以阻止其他任務寫這塊內(nèi)存,避免出現(xiàn)數(shù)據(jù)競爭現(xiàn)象。原子操作速度比鎖快,一般要快一倍以上。
例如fwrite(), fopen(),其是使用append方式寫文件,其原理就是使用了無鎖編程,無鎖編程的復雜度高,但是效率快,而且發(fā)生死鎖概率低。
考慮進程優(yōu)先級
進程調(diào)度器會動態(tài)調(diào)整運行隊列中進程的優(yōu)先級,通過top觀察進程的pR值
考慮系統(tǒng)負載
可在任何時刻查看/proc/loadavg, top中的load average也可看出
考慮cpU使用率
除了用戶空間和內(nèi)核空間的cpU使用率以外,還要關注i/o wait,它是指cpU空閑并且等待i/o操作完成的時間比例(top中查看wa的值)。
2. 考慮減少內(nèi)存分配和釋放
服務器的工作過程中,需要大量的內(nèi)存,使得內(nèi)存的分配和釋放工作尤為重要??梢酝ㄟ^改善數(shù)據(jù)結(jié)構(gòu)和算法復制度來適當減少中間臨時變量的內(nèi)存分配及數(shù)據(jù)復制時間,而服務器本身也使用了各自的策略來提高效率。
例如Apache,在運行開始時一次申請大片的內(nèi)存作為內(nèi)存池,若隨后需要時就在內(nèi)存池中直接獲取,不需要再次分配,避免了頻繁的內(nèi)存分配和釋放引起的內(nèi)存整理時間。
再如nginx使用多線程來處理請求,使得多個線程之間可以共享內(nèi)存資源,從而令它的內(nèi)存總體使用量大大減少,另外,nginx分階段的內(nèi)存分配策略,按需分配,及時釋放,使得內(nèi)存使用量保持在很小的數(shù)量范圍。
另外,還可以考慮共享內(nèi)存。共享內(nèi)存指在多處理器的計算機系統(tǒng)中,可以被不同中央處理器(cpU)訪問的大容量內(nèi)存,也可以由不同進程共享,是非??斓倪M程通信方式。
但是使用共享內(nèi)存也有不好的地方,就是對于多機器時數(shù)據(jù)不好統(tǒng)一。
shell命令ipcs可用來顯示系統(tǒng)下共享內(nèi)存的狀態(tài),函數(shù)shmget可以創(chuàng)建或打開一塊共享內(nèi)存區(qū),函數(shù)shmat將一個存在的共享內(nèi)存段連接到本進程空間, 函數(shù)shmctl可以對共享內(nèi)存段進行多種操作,函數(shù)shmdt函數(shù)分離該共享內(nèi)存。
3. 考慮使用持久連接
[服務器高防]持久連接也為長連接,它本身是tcp通信的一種普通方式,即在一次tcp連接中持續(xù)發(fā)送多分數(shù)據(jù)而不斷開連接,與它相反的方式稱為短連接,也就是建立連接后發(fā)送一份數(shù)據(jù)就斷開,然后再次建立連接發(fā)送下一份數(shù)據(jù), 周而復始。是否采用持久連接,完全取決于應用特點。
從性能角度看,建立tcp連接的操作本身是一項不小的開銷,在允許的情況下,連接次數(shù)越少,越有利于性能的提升; 尤其對于密集型的圖片或網(wǎng)頁等小數(shù)據(jù)請求處理有明顯的加速所用。
Http長連接需要瀏覽器和web服務器的共同協(xié)作,目前瀏覽器普遍支持長連接,表現(xiàn)在其發(fā)出的Http請求數(shù)據(jù)頭中包含關于長連接的聲明,如下: connection: Keep-Alive,主流的web服務器都支持長連接,比如apache中,可以用KeepAlive off關閉長連接。
對于長連接的有效使用,還有關鍵一點在于長連接超時時間的設置,即長連接在什么時候關閉嗎? Apache的默認設置為5s, 若這個時間設置過長,則可能導致資源無效占有,維持大量空閑進程,影響服務器性能。
4. 改進i/o 模型
i/o操作根據(jù)設備的不同分為很多類型,比如內(nèi)存i/o, 網(wǎng)絡i/o, 磁盤i/o. 對于網(wǎng)絡i/o和磁盤i/o, 它們的速度要慢很多,盡管使用RAid磁盤陣列可通過并行磁盤磁盤來加快磁盤i/o速度,購買大連獨享網(wǎng)絡帶寬以及使用高帶寬網(wǎng)絡適配器可以提高網(wǎng)絡i/o的速度。
但這些i/o操作需要內(nèi)核系統(tǒng)調(diào)用來完成,這些需要cpU來調(diào)度,這使得cpU不得不浪費寶貴的時間來等待慢速i/o操作。我們希望讓cpU足夠少的時間在i/o操作的調(diào)度上,如何讓高速的cpU和慢速的i/o設備更好地協(xié)調(diào)工作,是現(xiàn)代計算機一直探討的話題。各種i/o模型的本質(zhì)區(qū)別在于cpU的參與方式。
1. dmA技術(shù)
i/o設備和內(nèi)存之間的數(shù)據(jù)傳輸方式由dmA控制器完成。在dmA模式下,cpU只需向dmA下達命令,讓dmA控制器來處理數(shù)據(jù)的傳送,這樣可以大大節(jié)省系統(tǒng)資源。
2. 異步i/o
異步i/o指主動請求數(shù)據(jù)后便可以繼續(xù)處理其它任務,隨后等待i/o操作的通知,這樣進程在數(shù)據(jù)讀寫時不發(fā)生阻塞。
異步i/o是非阻塞的,當函數(shù)返回時,真正的i/o傳輸已經(jīng)完成,這讓cpU處理和i/o操作達到很好的重疊。
3. i/o多路復用
epoll服務器同時處理大量的文件描述符是必不可少的,若采用同步非阻塞i/o模型,若同時接收tcp連接的數(shù)據(jù),就必須輪流對每個socket調(diào)用接收數(shù)據(jù)的方法,不管這些socket有沒有可接收的數(shù)據(jù),都要詢問一次。
假如大部分socket并沒有數(shù)據(jù)可以接收,那么進程便會浪費很多cpU時間用于檢查這些socket有沒有可以接收的數(shù)據(jù)。多路i/o就緒通知的出現(xiàn),提供了對大量文件描述符就緒檢查的高性能方案,它允許進程通過一種方法同時監(jiān)視所有文件描述符,并可以快速獲得所有就緒的文件描述符,然后只針對這些文件描述符進行數(shù)據(jù)訪問。
epoll可以同時支持水平觸發(fā)和邊緣觸發(fā),理論上邊緣觸發(fā)性能更高,但是代碼實現(xiàn)復雜,因為任何意外的丟失事件都會造成請求處理錯誤。
epoll主要有2大改進:
epoll只告知就緒的文件描述符,而且當調(diào)用epoll_wait()獲得文件描述符時,返回并不是實際的描述符,而是一個代表就緒描述符數(shù)量的值,然后只需去epoll指定的一個數(shù)組中依次取得相應數(shù)量的文件描述符即可,這里使用了內(nèi)存映射(mmap)技術(shù),這樣徹底省掉了這些文件描述符在系統(tǒng)調(diào)用時復制的開銷。
epoll采用基于事件的就緒通知方式。其事先通過epoll_ctrl()注冊每一個文件描述符,一旦某個文件描述符就緒時,內(nèi)核會采用類似callback的回調(diào)機制,當進程調(diào)用epoll_wait()時得到通知
關于io模型,可以參考前面寫的相關文章Java nio.2; 關于epoll,可以參考前面寫的文章select、poll和epoll簡介。
4. sendfile
大多數(shù)時候,我們都向服務器請求靜態(tài)文件,比如圖片,樣式表等,在處理這些請求時,磁盤文件的數(shù)據(jù)先經(jīng)過內(nèi)核緩沖區(qū),然后到用戶內(nèi)存空間,不需經(jīng)過任何處理,其又被送到網(wǎng)卡對應的內(nèi)核緩沖區(qū),接著再被送入網(wǎng)卡進行發(fā)送。
Linux提供sendfile()系統(tǒng)調(diào)用,可以講磁盤文件的特定部分直接傳送到代表客戶端的socket描述符,加快了靜態(tài)文件的請求速度,同時減少cpU和內(nèi)存的開銷。
適用場景: 對于請求較小的靜態(tài)文件,sendfile發(fā)揮的作用不那么明顯,因發(fā)送數(shù)據(jù)的環(huán)節(jié)在整個過程中所占時間的比例相比于大文件請求時小很多。
5. 內(nèi)存映射
Linux內(nèi)核提供一種訪問磁盤文件的特殊方式,它可以將內(nèi)存中某塊地址空間和我們指定的磁盤文件相關聯(lián),從而對這塊內(nèi)存的訪問轉(zhuǎn)換為對磁盤文件的訪問。這種技術(shù)稱為內(nèi)存映射。
多數(shù)情況下,內(nèi)存映射可以提高磁盤i/o的性能,無須使用read()或write()等系統(tǒng)調(diào)用來訪問文件,而是通過mmap()系統(tǒng)調(diào)用來建立內(nèi)存和磁盤文件的關聯(lián),然后像訪問內(nèi)存一樣自由訪問文件。
缺點:在處理較大文件時,內(nèi)存映射會導致較大的內(nèi)存開銷,得不償失。
6. 直接i/o
在linux 2.6中,內(nèi)存映射和直接訪問文件沒有本質(zhì)差異,因為數(shù)據(jù)需要經(jīng)過2次復制,即在磁盤與內(nèi)核緩沖區(qū)之間以及在內(nèi)核緩沖區(qū)與用戶態(tài)內(nèi)存空間。
引入內(nèi)核緩沖區(qū)的目的在于提高磁盤文件的訪問性能,然而對于一些復雜的應用,比如數(shù)據(jù)庫服務器,它們?yōu)榱诉M一步提高性能,希望繞過內(nèi)核緩沖區(qū),由自己在用戶態(tài)空間實現(xiàn)并管理i/o緩沖區(qū),比如數(shù)據(jù)庫可根據(jù)更加合理的策略來提高查詢緩存命中率。另一方面,繞過內(nèi)核緩沖區(qū)也可以減少系統(tǒng)內(nèi)存的開銷,因內(nèi)核緩沖區(qū)本身就在使用系統(tǒng)內(nèi)存。
Linux在open()系統(tǒng)調(diào)用中增加參數(shù)選項o_diRect,即可繞過內(nèi)核緩沖區(qū)直接訪問文件,實現(xiàn)直接i/o。
在mysql中,對于innodb存儲引擎,自身進行數(shù)據(jù)和索引的緩存管理,可在my.cnf配置中分配raw分區(qū)跳過內(nèi)核緩沖區(qū),實現(xiàn)直接i/o。
改進服務器并發(fā)策略
服務器并發(fā)策略的目的,是讓i/o操作和cpU計算盡量重疊進行,一方面讓cpU在i/o等待時不要空閑,另一方面讓cpU在i/o調(diào)度上盡量花最少的時間。
一個進程處理一個連接,非阻塞i/o
這樣會存在多個并發(fā)請求同時到達時,服務器必然要準備多個進程來處理請求。其進程的開銷限制了它的并發(fā)連接數(shù)。但從穩(wěn)定性和兼容性的角度,則其相對安全,任何一個子進程的崩潰不會影響服務器本身,父進程可以創(chuàng)建新的子進程;這種策略典型的例子就是Apache的fork和prefork模式。對于并發(fā)數(shù)不高(如150以內(nèi))的站點同時依賴Apache其它功能時的應用選擇Apache還是可以的。
一個線程處理一個連接,非阻塞io
這種方式允許在一個進程中通過多個線程來處理多個連接,一個線程處理一個連接。Apache的worker模式就是這種典型例子,使其可支持更多的并發(fā)連接。不過這種模式的總體性能還不如prefork,所以一般不選用worker模式。
一個進程處理多個連接,異步i/o
一個線程同時處理多個連接,潛在的前提條件就是使用io多路復用就緒通知。這種情況下,將處理多個連接的進程叫做worker進程或服務進程。worker的數(shù)量可以配置,如nginx中的worker_processes 4。
一個線程處理多個連接,異步io
即使有高性能的io多路復用就緒通知,但磁盤io的等待還是無法避免的。更加高效的方法是對磁盤文件使用異步io,目前很少有web服務器真正意義上支持這種異步io。
6. 改進硬件環(huán)境
還有一點要提及的是硬件環(huán)境,服務器的硬件配置對應用程序的性能提升往往是最直接,也是最簡單的方式,這就是所謂的scale up。這里不做論述。
本公司在全球超過120個國家部署數(shù)據(jù)中心,提供海外全球多個國家服務器租用,所有服務器[網(wǎng)絡服務器租賃]均可根據(jù)需求配置大帶寬大流量,美國g口獨享大帶寬服務器,從此告別網(wǎng)絡擁堵;
用虛擬主機能夠做什么
基于SEO的小流量站點
這類網(wǎng)站一般指個人博客,單頁面淘寶客等營銷型的網(wǎng)站,這類網(wǎng)站的日訪問量一般不會超過5000,而且需要的主要是定向流量,所以在主機的選擇上,應該首選獨立IP的虛擬主機或者是VPS。至于其他方面[免費試用]沒有過多的要求,最基本的就是安全,穩(wěn)定。
地方社區(qū)、大中型論壇、門戶網(wǎng)站
如果是運營這種網(wǎng)站,那么在主機的投入上就絕對不能吝嗇。獨立服務器無疑是最佳的選擇。但是對于精通于網(wǎng)站運營的站長們,多數(shù)對服務器技術(shù)并不是很了解,當然可以找專人維護。不過但凡交給個人的任務總會出現(xiàn)很多問題,如技術(shù)不過關,時間無法調(diào)節(jié)等。所以,建議站長們?nèi)绻且龅胤?sup>[越南物理服務器]社區(qū)或者門戶網(wǎng)站,選擇一家優(yōu)秀的IDC服務商進行獨立服務器的租賃是非常明智的。
需要快速建站的站點
這類站點類型非常多,相信大部分新手站長都接觸過這類站點,比如中文小說,在線視頻,視訊CPS等,這類網(wǎng)站必須選擇國外服務器。同時,由于備案工作日漸繁瑣,許多站長對于建站要求過急,也應該選擇國外的虛擬主機或者VPS。
學習研究
如果是抱著學習研究的目的,那么空間最重要的就是功能要全面,但是對于負載要求等幾乎不做限制。100M左右?guī)?0M數(shù)據(jù)庫的全能虛擬主機就足夠進行程序調(diào)試和代碼研究了。全能是什么意思呢,就是指能滿足你的大部分要求,而并不是所有的東西都支持,如果你想同時學習和調(diào)試asp和php的程序,那么首選肯定是windows+iis的帶access+mysql數(shù)據(jù)庫的主機。如果僅僅是想研究php,則推薦linux+apache。且主機必須支持zend和偽靜態(tài)等。
YINGSOO免費熱線:4006_303_752
熱門文章:【使用代理服務器】【大數(shù)據(jù)營銷】【美國sk機房服務器的穩(wěn)定性怎么樣】【單路視頻服務器】【美國vps服務器選的好就是萬能】【高防服務器租用問題】【服務器怎么防攻擊】【美國服務器為什么仿牌網(wǎng)站服務器首選】【服務器數(shù)據(jù)庫】【香港站群服務器優(yōu)勢】【國內(nèi)高防服務器機房好的表現(xiàn)有哪些】【游戲分發(fā)服務器】【免費云服務器永久使用】【游戲服務器被攻擊】【登錄器服務器】【vps美國云服務器】【網(wǎng)絡攻擊原理】【佛山服務器】【高防IP價格】【香港云主機】【在線商城需要這樣的海外云服務器】【5M帶寬云服務器價格】【永久免費vps】【自己的服務器】【服務器數(shù)據(jù)庫備份】【服務器做什么】【國內(nèi)托管服務器】【德陽高防服務器】【服務器速度】【美國kt服務器租用】
香港云服務器租用商,YINGSOO香港云服務器3天試用,免備案,CN2直達,速度更快,香港云服務器租用商,5分鐘交付,7
http://maisonbaluchon.cn/products/cloud-hk.html
香港云服務器服務商,YINGSOO香港云服務器3天試用,免備案,CN2直達,速度更快,香港云服務器服務商,5分鐘交付,7
http://maisonbaluchon.cn/products/cloud-hk.html
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關注官方微信