【寫在前面】飛騰開發者平台是基於飛騰自身強大的技術基礎和開放能力,聚合行業內優秀資源而打造的。該平台覆蓋了操作系統、算法、數據庫、安全、平台工具、虛擬化、存儲、網絡、固件等多個前沿技術領域,包含了應用使能套件、軟件倉庫、軟件支持、軟件適配認證四大板塊,旨在共享尖端技術,為開發者提供一個涵蓋多領域的開發平台和工具套件。點擊這裏開始你的技術升級之旅吧
本文分享至飛騰開發者平台《基於飛騰騰雲S2500的Apache部署及調優指南》
1 軟件介紹
Apache HTTP Server(簡稱Apache)是Apache軟件基金會的一個開放源碼的網頁服務器,可以在大多數計算機操作系統中運行,由於其多平台和安全性被廣泛使用,是最流行的Web服務器端軟件之一。它快速、可靠並且可通過簡單的API擴展,將Perl/
Python等解釋器編譯到服務器中。
Apache源於NCSA httpd服務器,經過多次修改,成為世界上最流行的Web服務器軟件之一。Apache Web服務器擁有以下特性:
1)支持最新的HTTP/1.1通信協議
2)擁有簡單而強有力的基於文件的配置過程
3)支持通用網關接口
4)支持基於IP和基於域名的虛擬主機
5)支持多種方式的HTTP認證
6)集成Perl處理模塊
7)集成代理服務器模塊
8)支持實時監視服務器狀態和定製服務器日誌
9)支持服務器端包含指令(SSI)
10)支持安全Socket層(SSL)
11)提供用户會話過程的跟蹤
12)支持FastCGI
13)通過第三方模塊可以支持JavaServlets
(引用自https://baike.baidu.com/item/Apache/6265?fr=aladdin)
2 環境要求
2.1 硬件配置
| 用途 | 型號 |
|---|---|
| 網絡服務器 | 飛騰騰雲S2500處理器服務器 |
| 客户端 | 飛騰騰雲S2500處理器服務器 |
2.2 軟件版本
| 軟件名 | 對應版本 |
|---|---|
| httpd | 2.4.49 |
| LuaJIT | 2.1 |
| apr | 1.7.0 |
| apr-util | 1.6.1 |
| pcre | 8.45 |
3 應用部署
下面將詳細介紹Web應用Apache的搭建步驟,並對其性能進行驗證,主要包括如下步驟:
第一步,獲取源碼;
第二步,編譯安裝apr;
第三步,編譯安裝apr-util;
第四步,編譯安裝pcre;
第五步,編譯安裝httpd;
第六步,配置httpd端口;
第七步,運行驗證。在運行驗證時,通過網絡服務器啓動Apache服務,在客户端使用ab工具進行性能測試,一般地,模擬200用户共同發起20萬次網絡請求,之後,獲取TPS(Requests per second)值。需要注意的是,網絡服務器和客户端都需要部署Apache環境。
4 應用調優
4.1 調優目的
通過調整Apache配置文件來有效地提高Web應用性能。
4.2 調優方法
4.2.1 物理綁核
使用taskset對apache進程進行綁核,防止進程跨路;操作如下:
taskset -c 0-63 /usr/local/httpd-2.4.49/bin/apachectl start
4.2.2 優化httpd.conf
修改配置文件httpd.conf內容,主要包括:
1、啓動壓縮;
2、啓用重寫;
3、提供文件描述符緩存支持;
4、啓用基於URL鍵的內容動態緩衝(內存或磁盤);
5、啓用基於磁盤的緩衝管理器;
6、基於內存的緩衝管理器;
7、屏蔽所有不必要的模塊;
8、啓動靜態文件緩存;
9、允許apache修改或清除傳遞到cgi或ssi頁面的環境變量;
10、禁止根據客户端請求頭字段設置環境變量;
11、禁止生成描述服務器狀態的頁面;
12、啓用過濾(使用緩存必須啓用過濾模塊)。
4.2.3 配置mpm模式
Apache提供了多處理模塊(MPM),用來綁定到網絡端口上,接受請求以及調度子進程處理請求。
| 模塊名 | 説明 |
|---|---|
| Prefork | 在啓動時會預派生多個子進程,每個子進程只有一個線程。不需要擔心線程安全問題,但是每個進程都佔用系統資源,在處理高併發請求的場景中,會消耗大量的系統資源。 |
| Worker | 每個子進程能生成更多的線程,每個線程都能處理請求。減少了子進程數以及內存使用量,提升了服務器的併發能力,但安全性低,不能與不是線程安全的模塊一起使用。 |
| Event | 基於Worker模塊,但它解決了 keep-alive 場景下,長期被佔用的線程的資源浪費問題。Event模塊會有一個專門的線程管理keep-alive 類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣一個線程就能處理幾個請求,實現異步非阻塞。 |
MPM模塊的加載方式是在httpd.conf中添加下列內容(三者任選其一):
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
如果需要調整MPM模塊進程細節,則需要在httpd.conf中啓用MPM模塊配置文件:
Include conf/extra/httpd-mpm.conf
詳細的MPM模塊配置文件是httpd-mpm.conf,文件中包含以下內容:
Prefork MPM模塊
默認配置:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
其中StartServers代表初始化預派生的子進程數,MinSpareServers代表最小空閒子進程數,MaxSpareServers代表最大空閒子進程數,MaxRequestWorker代表最大請求數(因為在Prefork MPM模塊中一個請求數對應一個子進程,故也可以理解為最大派生子進程數),MaxConnectionsPerChild代表每個進程可處理的請求數(達到目標值後該進程將被殺死,0代表沒有限制)。
Worker MPM模塊
加載方式為在httpd.conf中添加下列內容:
LoadModule mpm_worker_module modules/mod_mpm_worker.so
默認配置:
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
其中StartServer代表初始化預派生的子進程數,另外可以使用ServerLimit來指定最大進程數(默認為16)。MinSpareThr eads代表最小空閒線程數,MaxSpareThreads代表最大空閒線程數,ThreadsPerChild代表每個子進程可創建的線程數,MaxRequestWorkers代表最大請求數(因為在Worker MPM模塊中,一個請求數對應一個線程,故也可以理解為最大線程數。理論上,最大線程數不能超過最大進程數與每個進程可創建的線程數的乘積),MaxConnectionsPerChild代表每個進程可處理的請求數(達到目標值後該進程將被殺死,0代表沒有限制)。
Event MPM模塊
加載方式為在httpd.conf中添加下列內容:
LoadModule mpm_event_module modules/mod_mpm_event.so
默認配置:
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
參數作用與Worker MPM模塊一致。
4.3 調優示例
示例環境為一台飛騰騰雲S2500處理器服務器與一台英特爾X86服務器,Apache同時部署在兩台服務器上,飛騰騰雲S2500處理器服務器作為Apache服務器,X86服務器作為客户端模擬200用户發起20萬次網絡請求,模擬100次後取TPS算平均值。由於Event是明顯優於Worker的,所以優先選擇Event模式,其初始配置如下:
| 初始進程數:3
最大進程數:16 最小空閒線程數:75 最大空閒線程數:400 每進程可創建線程數:25 最大線程數:400 |
下表中的調優記錄均為Event模式下測出,且都基於上述配置進行修改。
| 序號 | 吞吐量 | 調優措施 |
|---|---|---|
| 1 | 62722 | 初始配置 |
| 2 | 57165 | 最大進程數:16-\>8,最大線程數:400-\>200 |
| 3 | 30372 | 最大進程數:16-\>4,最大線程數:400-\>100 |
| 4 | 61362 | 最大進程數:16-\>24,最大線程數:400-\>600 |
| 5 | 64477 | 最大進程數:16-\>40,每進程可創建線程數:25-\>10 |
| 6 | 58884 | 最大進程數:16-\>10,每進程可創建線程數:25-\>40 |
| 7 | 63783 | 最大進程數:16-\>80,每進程可創建線程數:25-\>5 |
| 8 | 98785 | 綁核0-63 |
二次測試以確認調優效果(測試前充分預熱可讓數值整體提升,預熱操作為用ab壓測十次)。
| 序號 | 吞吐量 | 調優措施 |
|---|---|---|
| 1 | 66403 | 初始配置 |
| 2 | 66818 | 最大進程數:16-\>24,最大線程數:400-\>600 |
| 3 | 69565 | 最大進程數:16-\>40,每進程可創建線程數:25-\>10 |
| 4 | 65990 | 最大進程數:16-\>10,每進程可創建線程數:25-\>40 |
| 5 | 68302 | 最大進程數:16-\>80,每進程可創建線程數:25-\>5 |
| 6 | 103228 | 綁核0-63 |
由上表可知,通過綁核以及調整進程數與線程數的搭配可以提升Apache的性能。在飛騰騰雲S2500處理器服務器上,通過設置最大進程數為40,每進程可創建線程數為10且將apache進程綁核0-63可達到最佳性能。
5 常見問題
1)apr-util編譯報錯
如果報錯內容如下圖所示:
則通過安裝expat-devel包可以解決。
2)修改Apache配置後不生效
部分Apache配置修改後需要關閉Apache服務再啓動,直接重啓服務不生效。
# /usr/local/httpd-2.4.49/bin/apachectl stop && sleep 4 && /usr/local/httpd-2.4.49/bin/apachectl start
6 附錄
6.1 示例腳本
預熱:
# for i in {1..10};do ab -c 200 -n 200000 -k http://10.31.72.37:80/index.html;sleep 2;done
壓測:
# rm -f ave.log;for l in {1..20};do rm -f tmp.log;for i in {1..5};do ab -c 200 -n 200000 -k http://10.31.72.37:80/index.html\|grep "Requests per second" \>\> tmp.log;sleep 1;done ;cat tmp.log\|awk -F" " 'BEGIN{sum=0} {sum=sum+\$4} END{print sum/5}' \>\> ave.log;done;cat ave.log \|awk 'BEGIN{sum=0} {sum=sum+\$1} END{print sum/20}'
歡迎廣大開發者來飛騰開發者平台獲取更多前沿技術文檔及資料
如開發者在使用飛騰產品有任何問題可通過在線工單聯繫我們
版權所有。飛騰信息技術有限公司 2023。保留所有權利。
未經本公司同意,任何單位、公司或個人不得擅自複製,翻譯,摘抄本文檔內容的部分或全部,不得以任何方式或途徑進行傳播和宣傳。
商標聲明
Phytium和其他飛騰商標均為飛騰信息技術有限公司的商標。
本文檔提及的其他所有商標或註冊商標,由各自的所有人擁有。
注意
本文檔的內容視為飛騰的保密信息,您應當嚴格遵守保密任務;未經飛騰事先書面同意,您不得向任何第三方披露本文檔內容或提供給任何第三方使用。
由於產品版本升級或其他原因,本文檔內容會不定期進行更新。除非另有約定,本文檔僅作為使用指導,飛騰在現有技術的基礎上盡最大努力提供相應的介紹及操作指引,但飛騰在此明確聲明對本文檔內容的準確性、完整性、適用性、可靠性的等不作任何明示或暗示的保證。
本文檔中所有內容,包括但不限於圖片、架構設計、頁面佈局、文字描述,均由飛騰和/或其關聯公司依法擁有其知識產權,包括但不限於商標權、專利權、著作權等。非經飛騰和/或其關聯公司書面同意,任何人不得擅自使用、修改,複製上述內容。