Apache DSO 和 MPM

1. Apache DSO

1.1 Apache DSO是什么

  • DSO (Dynamic Shared Object) 動(dòng)態(tài)共享目錄的縮寫, 是類Unix 操作系統(tǒng)中存在的一種動(dòng)態(tài)連接機(jī)制, 在程序運(yùn)行是將需要的部分從外部調(diào)入內(nèi)存執(zhí)行的方法.

  • apache 1.3 版本開(kāi)始支持這種方法, 應(yīng)為早期 apache 一直使用一個(gè)模塊來(lái)擴(kuò)展功能, 并在內(nèi)部使用一個(gè)調(diào)度機(jī)制 來(lái)鏈接擴(kuò)展模塊 到核心模塊.

  • 1.2 Apache DSO 實(shí)現(xiàn)

  • 每個(gè)單個(gè)模塊的動(dòng)態(tài)加載, 都是基于 mod_so 的模塊來(lái)實(shí)現(xiàn)的, 該mod_so 必須被靜態(tài)的編譯 http 服務(wù)器內(nèi)核中, 除了 core 以外的唯一不可以動(dòng)態(tài)方式編譯的模塊, 實(shí)際操作中, apache 模塊在編譯服務(wù)器程序時(shí)通過(guò)單獨(dú)制定其來(lái)編譯為DSO 文件, 應(yīng)當(dāng)在編譯時(shí)制定 --enable-xxx=shared(xxx為模塊名, 如 rewrite), 動(dòng)態(tài)編譯的模塊可以在配置文件中使用 LoadModule 動(dòng)態(tài)加載

  • Apache 模塊(尤其是第三方模塊)的DSO 文件過(guò)程, apache 提供了工具 apxs (Apache eXtenSion) 動(dòng)態(tài)將模塊編譯成 DSO 文件, 對(duì)具體平臺(tái)編譯器設(shè)置一些標(biāo)志, 便于創(chuàng)建DSO 文件.

1.3 DSO 優(yōu)勢(shì)和劣勢(shì)

  • DSO 優(yōu)勢(shì)

      1. 服務(wù)器運(yùn)行時(shí)更加靈活實(shí)際服務(wù)器進(jìn)程可以通過(guò)配置文件動(dòng)態(tài)加載組件, 不需要在編譯時(shí)通過(guò)配合參數(shù)指定,
    • 服務(wù)器可以方便擴(kuò)展第三方模塊.
  • DSO 劣勢(shì)

    • DSO 不是任何平臺(tái)都可以使用, 一些平臺(tái)不支持動(dòng)態(tài)將代碼加載到另一個(gè)程序地址空間中.
    • 服務(wù)器啟動(dòng)時(shí)會(huì)更慢一點(diǎn).

1.4 查看模塊

  • 查看安裝了的模塊: (包含動(dòng)態(tài)加載的)

    • httpd -M
  • 查看靜態(tài)安裝的模塊:

    • httpd -l

2. Apache MPM

2.1 MPM 介紹

  • Apache 2.x開(kāi)始遲滯并行處理模塊, 稱為多路處理模塊(MPM), 在編譯apache 時(shí) 必須選擇且只能選擇一種MPM, 對(duì)于類似Unix系統(tǒng), 有多個(gè)不用的 MPM 可以選擇, 會(huì)影響到apache 速度和可升縮性.

2.2 Apache2.4 支持的MPM

  • apache2.4 支持多種模塊

2.2.1 Prefork MPM:

  • 這個(gè)多路處理模塊(MPM) 實(shí)現(xiàn)了一些非線程, 預(yù)派生的 web 服務(wù)器, 工作方式類似于 Apache1.3, 適合沒(méi)有現(xiàn)成安全庫(kù), 需要避免線程兼容性問(wèn)題影響系統(tǒng). 要求將每個(gè)請(qǐng)求相互獨(dú)立的情況最好的 MPM, 請(qǐng)求出現(xiàn)問(wèn)題就不會(huì)影響其他請(qǐng)求.

  • MPM 具有很強(qiáng)自我調(diào)節(jié)能力, 需要很少的配置指令調(diào)整,

  • 設(shè)置:

<IfModule mpm_prefork_module>
    StartServers            5
    MinSpareServers         5
    MaxSpareServers         10
    MaxRequestWorkers       250
    MaxConnectionsPerChild  0
</IfModule mpm_prefork_module>
-------------
StartServers
    服務(wù)啟動(dòng)時(shí), 啟動(dòng)的進(jìn)程
MinSpareServers
    服務(wù)閑置時(shí), 保留的最小進(jìn)程數(shù)
MaxSpareServers
    服務(wù)閑置時(shí), 保留的最大進(jìn)程數(shù)
MaxRequestWorkers   
    工作時(shí)會(huì)啟動(dòng)的 最多的進(jìn)程數(shù)
MaxConnectionPerChild
    服務(wù)器殺死就進(jìn)程和重啟的頻率, 0表示永不殺死, 設(shè)置100 表示進(jìn)程服務(wù)100次后, 就會(huì)被殺死

2.2.2 Worker MPM

  • 該多路處理模塊(MPM) 使用網(wǎng)絡(luò)服務(wù)器 支持混合的多線程多進(jìn)程, 由于使用線程來(lái)處請(qǐng)求, 所以可以處理海量請(qǐng)求, 系統(tǒng)資源開(kāi)銷小于 基于進(jìn)程的MPM, 但是也是用了很多進(jìn)程, 每個(gè)進(jìn)程有多個(gè)線程, 以獲得基于進(jìn)程的 MPM 穩(wěn)定性.

  • 每個(gè)進(jìn)程可擁有的線程數(shù)量是固定的, 服務(wù)器會(huì)根據(jù)負(fù)載情況增 加或減少進(jìn)程數(shù)量, 一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)子進(jìn)程的建立. 每個(gè)子進(jìn)程可以建立 ThreadPerChild 數(shù)量的服務(wù)線程 和一個(gè)監(jiān)聽(tīng)線程, 該監(jiān)聽(tīng)線程 監(jiān)聽(tīng)接入請(qǐng)求并將其傳入傳遞服務(wù)線程處理和應(yīng)答.

  • 不論Worker 模式或者 Prefork 模式, Apache 總是試圖保持一些備用(spare) 或者空閑子進(jìn)程(空閑的服務(wù)線程池) 用于迎接即將到來(lái)的請(qǐng)求, 客戶端不需要得到自己成產(chǎn)生,

  • 設(shè)置:

<IfModule mpm_worker_module>
    StartServers            3
    MinSpareThreads         75
    MaxSpareThreads         250
    ThreadsPerChild         25
    MaxRequestWorkers       400
    MaxConnectionsPerChild  0
</IfModule mpm_worker_module>
----------------
StartServers
    啟動(dòng)時(shí)啟動(dòng)的進(jìn)程數(shù)
MinSpareThreads 
    保留的最小線程數(shù)    
MaxSpareThreads
    保留的最大 線程數(shù), 
ThreadsPerChild
    每個(gè)子進(jìn)程創(chuàng)建的線程數(shù),
MaxRequestWorkers
    可以啟動(dòng)工作 的最大進(jìn)程數(shù)量
MaxConnectionsPerChild
    工作的繼承在處理指定次連接后 會(huì)被殺死, 0 表示永不殺死

2.2.2 Event MPM

  • Event 處理模塊(MPM), 在以上兩種MPM 非常繁忙的服務(wù)器應(yīng)用下都是有些不足的, HTTP 的 Keepalive 方式能減少TCP 連接數(shù)量和網(wǎng)絡(luò)負(fù)載, 但是 Keepalive 需要和服務(wù) 進(jìn)程/線程 綁定, 就會(huì)導(dǎo)致繁忙的服務(wù)器會(huì)耗光 進(jìn)程/線程.

  • Event MPM 可以解決上面的問(wèn)題, 它把服務(wù)進(jìn)程從連接中分離出來(lái), 在服務(wù)器處理速度很快, 具有很高的點(diǎn)擊率, 可用的線程數(shù)量就是關(guān)鍵的資源限制, 此時(shí) Event MPM 方式是最有效的, Worker MPM 方式工作的 繁忙的服務(wù)器可以承受 10k/s 訪問(wèn).

  • 使用

<IfModule mpm_event_module>
    StartServers        3
    MinSpareThreads     75
    MaxSpareThreads     250
    ThreadPerChild      25
    MaxRequestWorkers   400
    MaxConnectionsPerChild  0
</IfModule mpm_event_module>
------------------------

END

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容