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

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

吞吐量

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

  • 併發用戶數

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

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

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.24、0.52、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 我的個人博客  ——————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章