構建高性能WEB站點筆記二

構建高性能WEB站點筆記

由於是跳着看的,後面看到有提到啥epoll模型,那就補充下前面的知識。web

第三章 服務器併發處理能力

3.2 CPU併發計算

  • 進程
    • 好處:cpu 時間的輪流使用、對CPU計算和I/O操做進行很好的重疊利用。
    • 進程的調度有內核進行。從內核的觀點看,進程的目的就是擔任分配系統資源的實體。同時,進程也能夠理解爲記錄程序實例當前運行到什麼程度的一組數據。多個程序經過不一樣的進程描述符與這些數據進行關聯。
    • 每一個進程都有本身的獨立內存空間和生命週期。當子進程被父進程建立後,便將父進程地址空間的全部數據都複製到本身的地址空間。徹底繼承父進程的全部上下文信息,它們之間能夠通訊,可是不互相依賴,也無權干涉彼此的地址空間。
    • 進程的建立使用fork()系統調用。
  • 輕量級進程
    • 因爲進程之間相對獨立,它們之間各自維護龐大的地址空間和上下文信息,沒法很好地低成本共享數據,因此採用大量進程的Web服務器(好比Apache的prefork模型)在處理大量併發請求時,內存的大量消耗會成爲性能提高的制約因素。可是,進程的優越性有時候偏偏體如今其相互獨立所帶來的穩定性和健壯性方面。
    • clone()建立輕量級進程,由內核直接管理,像普通的進程同樣獨立存在,各自擁有進程描述符,可是這些進程已經容許共享一些資源,好比地址空間、打開的文件等。輕量級進程減小了內存開銷,併爲多進程應用程序的數據共享提供了直接支持,但上下文切換的開銷仍是在所不免。
  • 線程
    • 多線程的管理徹底在用戶態。可是某些系統中, 內核線程也被支持,線程管理由內核進行。
  • 系統負載
    • 在進程調度器維護的運行隊列中,任什麼時候刻都至少存在一個進程,那就是正在進行的進程。cat /proc/loadavg查看運行隊列的狀況。
    • 定義:單位時間內運行隊列中就緒等待的進程數平均值。
  • IOWait
    • 定義:CPU空閒而且等待I/O操做完成的時間比例。數組

      3.3 系統調用

      進程有兩個運行模式:用戶態和內核態,進程一般運行在用戶態,這時候可使用CPU和內存來完成一些任務,而當進程須要對硬件外設進行操做的時候(讀磁盤文件、發送網絡數據),就必須切換到內核態。瀏覽器

  • 減小沒必要需要的系統調用,優化Web服務器性能。緩存

    3.5 持久鏈接

    在Web應用層通訊,因爲HTTP的無狀態特性,使得HTTP通訊絕不依賴於TCP長鏈接,長久以來習慣了「一次性」的HTTP通訊,即一次TCP鏈接處理一個HTTP請求。服務器

HTTP長鏈接須要瀏覽器和Web服務器的共同協做。一方面,瀏覽器須要保持一個TCP鏈接並重複利用,不斷髮送多個請求,另外一方面,服務器不能過早的主動關閉鏈接。網絡

Apache中,經過httpd.conf中的以下參數進行配置:
KeepAliveTimeout 30瀏覽器的設置能夠經過修改註冊表修改超時時間。數據結構

動機:儘可能減小鏈接次數,儘可能重用鏈接通道。多線程

3.6 I/O模型

  • PIO 與 DMA
    • PIO 磁盤和內存之間的數據傳輸經過CPU控制。數據通過CPU存儲轉發。
    • DMA 不通過CPU而直接進行磁盤和內存的數據交換。在DMA模式下,CPU只須要向DMA控制器下達命令,讓DMA控制器來處理數據的傳送便可。DMA控制器經過系統總線來傳輸數據,傳輸完畢再通知CPU,這樣在很大程度下降了CPU佔有率,大大節省了系統資源。
  • 同步阻塞I/O
    • 同步阻塞I/O是指當進程調用某些涉及I/O操做的系統調用或庫函數時,好比accept()、send()、recv()等,進程便暫停下來,等待I/O操做完再繼續運行。
  • 同步非阻塞I/O
    • 同步阻塞I/O中,進程實際上等待的時候可能包括兩部分,一個是等待數據的就緒,另外一個是等待數據的複製。對網絡I/O來講,前者的時間可能要更長一些。
    • 不一樣的是,同步非阻塞I/O不會等待數據就緒,若是數據不可寫或者不可讀,它會當即告訴進程,好比咱們使用非阻塞recv()接收網絡的時候,若是網卡緩衝區沒有可接受的數據,函數就及時返回,告訴進程沒有數據刻度。
    • 進程執行屢次輪詢來看數據是否就緒,這花費大量CPU時間,使得進程處於忙碌等待狀態。
    • 非阻塞I/O通常只針對網絡I/O有效。咱們只要在socket選項設置中使用O_NONBLOCK便可,這樣對於該socket的send()或者recv()便採用非阻塞方式。值得注意的是,對於磁盤I/O,非阻塞I/O並不產生效果。
  • 多路I/O就緒通知
    • 提供了對大量文件描述符就緒檢查的高性能方案,容許進程經過一種方法來同時監視全部文件描述符,並能夠快速獲取全部就緒的文件描述符,而後只針對這些文件描述符進行數據訪問。
    • I/O就緒通知只是幫助咱們快速得到就緒的文件描述符,當得知數據就緒之後,就訪問數據自己而言,仍然須要選擇阻塞或者費組設的訪問方式,通常咱們選擇非阻塞方式,以防止任何意外的等待阻塞阻塞整個進程。好比有時候就緒通知只是表明一個內核的提示,也許此時未見描述符還沒有真正準備好或者已經被客戶端關閉鏈接。

瞭解如下幾種UNIX:併發

  • select 經過一個select()系統調用來監視包含多個文件描述符的數組,當select()返回之後,該數組中就緒的文件描述符便會被內核修改標誌位,使的進程能夠得到文件描述符從而進行後續的讀寫操做。
    • 優:擴平臺支持
    • 缺:單個進程可以監視的文件描述符的數量存在最大限制。
    • select()所維護的存儲大量文件描述符的數據結構,隨着文件描述符數量的增大,其複製的開銷也線性增加。
  • poll 本質上和select差異不大,可是沒有最大文件描述符的限制。
  • epoll 被公認爲Linux2.6下性能最好的多路I/O就緒通知方法。同時支持水平觸發和邊緣觸發。
    • 水平觸發:select()和poll()將就緒的文件描述符告訴進程後,若是進程對其沒有進行I/O操做,那下次調用select()和poll()再次報告這些文件描述符,因此它們通常不會丟失就緒的消息。
    • 邊緣觸發:SIGIO是告訴咱們哪些文件描述符剛剛變成就緒狀態,它只說一遍,若是咱們沒有采起行動,那麼它將不會再次告知。
  • 內存映射

定義:Linux提供一種訪問磁盤文件的特殊方式,它能夠將內存中某塊地址空間和咱們要指定的磁盤文件相關聯,從而把咱們隊這塊內存的訪問轉換爲對磁盤文件的訪問。
* 大多數狀況下,使用內存映射能夠提升磁盤I/O的性能,它無須使用read()或者write()等系統調用來訪問文件,而是經過mmap()系統調用來創建內存和磁盤文件的關聯,而後像訪問內存同樣自由地訪問文件。異步

直接IO

  • 在MySQL中,對應Innodb存儲引擎,其自身能夠進行數據和索引的緩存管理,因此它對於內核緩衝區的依賴不是那麼重要。MySQL提供了一種實現直接I/O的方法,在my.cof配置中,在分配Innodb數據空間文件的時候,使用raw分區跳過內核緩衝區,直接I/O。
    sendfile

  • 大多數時候,咱們向web服務器請求靜態文件,這個處理請求的過程,磁盤的數據要先通過內核緩衝區,而後到達用戶內存空間,由於是不須要任何處理的靜態數據,因此它們又被送到網卡對應的內核緩衝區,接着再被送入網卡進行發送。
  • Linux中,sendfile將磁盤文件的特定部門直接傳送到客戶端的socket描述符,加快了靜態文件的請求速度。

異步I/O

  • 阻塞和非阻塞IO是指當進程訪問的數據若是還沒有就緒,進程是否須要等待,簡單說至關於函數內部的實現區別,即還沒有就緒時是直接返回仍是就緒等待;
  • 同步和異步是指數據訪問的機制,同步通常指主動請求並等待I/O操做完畢的方式,當數據就緒後在讀寫的時候必須阻塞。異步是指主動請求數據後即可以繼續處理其餘任務,隨後等待I/O操做完畢的通知,這可使進程在數據讀寫時也不發生阻塞。

    3.7 服務器併發策略

    本質上講,全部到達服務器的請求都封裝在IP包中,位於網卡的接收緩存區中,這時候Web服務器軟件要作的是不斷地讀取這些請求,而後進行處理,並將結果寫到發送緩衝區,這其中包含了一些列I/O操做和CPU計算, 而設計一個併發策略的目的,就是讓I/O操做和CPU計算儘可能重疊進行,一方面要讓CPU在I/O等待時不要空閒,另外一方面讓CPU在I/O調度上儘可能花費最少的時間。

相關文章
相關標籤/搜索