讀《構建高性能Web站點》服務器併發處理能力 - 1

一臺Web服務器在單位時間內能處理的請求越多越好,這也成了Web服務器的能力高低所在,它體現了咱們常說的"服務器併發處理能力"。瀏覽器

吞吐量服務器

Web服務器的併發處理能力,通常使用單位時間內服務器處理的請求數來描述其併發能力,習慣稱其爲吞吐率(Throughput),單位是"reqs/s"。多線程

  • 併發用戶數併發

人們經常把併發用戶數和吞吐率混淆,實際上,它們並非一回事,吞吐率是指在必定併發用戶數的狀況下,服務器處理請求能力的量化體現;併發用戶數就是指在某一時刻同時向服務器發送請求的用戶總數。異步

採用多線程的併發對於同一個域名下的URL的併發下載數是有最大限制的,具體限制視瀏覽器的不一樣而不一樣,好比,在HTTP/1.1下,IE7支持兩個併發鏈接,IE8支持6個併發鏈接,Firefox3支持4個併發鏈接。另外一方面,Web服務器通常也會限制同時服務的最多用戶數,好比Apache的MaxClients參數。ide

CPU併發計算函數

服務器之因此能夠同時處理個請求,在於操做系統經過多執行流體系設計使得多個任務能夠輪流使用系統資源,這些資源包括CPU、內存以及I/O等。工具

進程

多執行流的通常實現即是進程。性能

進程的調度有內核來進行,從內核的觀點來看,進程的目的就是擔當分配系統資源的實體。同時,進程也能夠理解爲記錄程序實例當前運行到什麼程度的一組數據,多個進程經過不一樣的進程描述符與這些數據進程關聯。測試

每一個進程都有本身獨立的內存地址和生命週期。進程的建立使用fork()系統調用。

輕量級進程

因爲進程之間相對獨立,沒法共享數據。爲此,在Linux2.0以後,提供了對輕量級進程的支持,它由一個新的系統調用clone()來建立,並由內核直接管理,像普通的進程同樣獨立存在,各自擁有進程的描述符,可是這些進程已經容許共享一些資源。

輕量級進程減小了內存的開銷,併爲多進程應用程序的數據共享提供了直接支持。

線程

POSIX 1003.1c爲Linux定義了現成的接口"pthread"。從內核角度來看,多線程只是一個普通的進程,它是由用戶態經過一些庫函數模擬實現的多執行流,因此多現成的管理徹底在用戶態完成。這種實現方式下線程切換的開銷相比於進程和輕量級進程要少,但它在多處理器的服務器(SMP)表現較差,由於只有內核的進程調度器纔有權分配多個CPU的時間。

POSIX線程的另外一種是現實LinuxThreads,它能夠說是內核級線程(Kernel-Level Threads),由於它經過clone()來建立線程,也就是說,它的實現原理是將線程和輕量級進程一對一關聯,每一個線程實際上就是一個輕量級進程,這樣使得線程徹底由內核的進程調度器來管理,因此他對於SMP的支持較好,但線程切換的開銷要比用戶態線程多一些。

LinuxThreads已經加入了glibc和libc的目前版本。

進程調度器

內核中的進程調度器(Scheduler)維護着各類狀態的進程隊列。在Linux中,進程調度器維護者一個包含全部可運行進程的隊列,稱爲"運行隊列",一集一個包括全部休眠進程和殭屍進程的列表。

進程調度器的一項重要工做就是決定下一個運行的進程,這個執行前後順序經過進程優先級進行處理,進程優先級由進程本身決定,但在進程運行時進程調度器會動態的調整它們的優先級。

Linux中進程的優先級屬性爲Priority,在top結果中用PR表示,而對於進程的動態調總體如今進程的nice屬性,在top結果中用NI表示。

1_20150420090229.jpg

PR所表明的是進程調度器分配給進程的時間片長度,單位是時鐘個數,一個時鐘須要多長時間跟CPU的主頻以及操做系統平臺有關,好比Linux上通常爲10ms,那麼PR值爲20則表示這個進程的時間爲200ms。

Linxu2.6的進程調度器偏心I/O操做密集型的進程,由於這些進程在發起I/O操做後一般都會阻塞(除異步I/O),不會佔用太多CPU時間,。

系統負載

在任什麼時候刻經過 /proc/loadavg,能夠查看系統運行隊列的狀況。

1_20150420132734.jpg

其中6/1564,6表示測試運行隊列中的進程個數,而1564則表示此時的進程總數。最右邊的25689表示到此時爲止,最後建立的一個進程ID。左邊的0.2四、0.5二、0.58三個數值分別表示最近1分鐘、5分鐘、15分鐘的系統負載。

系統負載是在單位時間內運行隊列中就緒等待的進程的平均值,系統負載越高,表明CPU越繁忙。

進程切換

爲了讓全部的進程能夠輪流使用系統資源,進程調度器在必要的時候掛起正在運行的進程,同時恢復之前掛起的某個進程,這種行爲稱爲進程切換,也就是"上下文"。

一個進程被掛起的本質就是將它在CPU寄存器中的數據拿出來暫存在內核態堆棧中,而一個進程恢復工做的本質就是將它的數據從新載入CPU寄存器。

Nmon是一個Linux監視工具,它能夠提供基於服務器終端命令的監視頁面。利用Nmon對服務器某個時刻的抽樣結果以下:

1_20150420134200.jpg

ContextSwitch表示這時上下文切換平均每秒12614.9次,這是操做系統正常運轉所進行的必要工做。

IOWait

IOWait是指CPU空閒而且等待I/O操做完成的時間比例。IOWait每每不能表明I/O操做的性能,它的設計出發點是用來衡量CPU性能的。

1_20150420142106.jpg

IOWait很高的時候,說明當前任務的CPU時間比I/O操做時間比較少,經過Nmon獲得CPU監控數據以下圖:

1_20150420142300.jpg

此時IOWait爲0%,系統不繁忙。


—————————— 本文同步發佈於 ZHANGSR 個人我的博客  ——————————

相關文章
相關標籤/搜索