LAMP 系统性能调优:第2 部分: 优化Apache 和PHP-学习笔记
二 配置MPM?
Apache 是模塊化的,因?yàn)榭梢暂p松添加和移除特性。在Apache 的核心,多處理模塊(Multi-Processing Module,MPM )提供了這種模塊化功能性—— 管理網(wǎng)絡(luò)連接、調(diào)度請求。MPM 使您能夠使用線程,甚至能夠?qū)pache 遷移到另外一個(gè)操作系統(tǒng)。
每次只能有一個(gè)MPM 是活動的,必須使用 --with-mpm=(worker|prefork|event) 靜態(tài)編譯。
每個(gè)請求使用一個(gè)進(jìn)程的傳統(tǒng)模型稱為 prefork 。較新的線程化模型稱為 ?worker,它使用多個(gè)進(jìn)程,每個(gè)進(jìn)程又有多個(gè)線程,這樣就能以較低的開銷獲得更好的性能。最新的 ?eventMPM 是一種實(shí)驗(yàn)性的模型,為不同的任務(wù)使用單獨(dú)的線程池。要確定當(dāng)前使用的是
哪種MPM ,可執(zhí)行 httpd -l。例如:
[root@localhost conf]# httpd -l
Compiled in modules:
? core.c
? prefork.c
? http_core.c
? mod_so.c
選擇使用何種MPM 取決于許多因素。在event MPM 脫離實(shí)驗(yàn)狀態(tài)之前,不應(yīng)考慮這種模型,而是在使用線程和不使用線程之間作出
選擇。表面上看來,如果所有底層模塊(包括PHP 使用的所有庫)都是線程安全的,線程要優(yōu)于分叉(forking)。
而Prefork 是較為安全的選擇;如果選擇了worker,則應(yīng)該謹(jǐn)慎測試。性能收益還取決于您的發(fā)布版所附帶的庫及硬件無論選擇了哪種MPM ,都必須恰當(dāng)?shù)嘏渲盟R话愣?#xff0c;配置MPM 包括告知Apache 怎樣去控制有多少worker 正在運(yùn)行,它們是
線程還是進(jìn)程。prefork MPM 的重要配置選項(xiàng)如清單1 所示。編輯http.conf 主配置文件可以看到:
StartServers 50 ? ? #預(yù)先啟動進(jìn)程
MinSpareServers 15 ?#最小空閑進(jìn)程
MaxSpareServers 30 ?#最大空閑進(jìn)程
MaxClients 225 ? ? ?#允許連接數(shù)
MaxRequestsPerChild 4000
prefork 模型會為每個(gè)請求創(chuàng)建一個(gè)新進(jìn)程。多余的進(jìn)程保持空閑,以
處理傳入的請求,這縮短了啟動延遲。只要Web 服務(wù)器出現(xiàn),預(yù)先完
成的配置就會立即啟動50 個(gè)進(jìn)程,并盡力保持10 到20 個(gè)空閑服務(wù)器
運(yùn)行。進(jìn)程數(shù)的硬性限制由 MaxClients 指定。盡管一個(gè)進(jìn)程能夠處
理許多相繼的請求,Apache 還是會取消連接數(shù)超過4,000 以后的進(jìn)
程,這降低了內(nèi)存泄漏的風(fēng)險(xiǎn)。
配置線程化MPM 與之類似,不同之處只是必須確定使用多少線程和進(jìn)
程。Apache 文檔解釋了所有必要的參數(shù)和計(jì)算。
prefork 模型會為每個(gè)請求創(chuàng)建一個(gè)新進(jìn)程。多余的進(jìn)程保持空閑,以
處理傳入的請求,這縮短了啟動延遲。只要Web 服務(wù)器出現(xiàn),預(yù)先完
成的配置就會立即啟動50 個(gè)進(jìn)程,并盡力保持10 到20 個(gè)空閑服務(wù)器
運(yùn)行。進(jìn)程數(shù)的硬性限制由 MaxClients 指定。盡管一個(gè)進(jìn)程能夠處
理許多相繼的請求,Apache 還是會取消連接數(shù)超過4,000 以后的進(jìn)
程,這降低了內(nèi)存泄漏的風(fēng)險(xiǎn)
配置線程化MPM 與之類似,不同之處只是必須確定使用多少線程和進(jìn)
程。Apache 文檔解釋了所有必要的參數(shù)和計(jì)算。要經(jīng)過幾次嘗試和出錯(cuò)之后才能選好要使用的值。最重要的值是MaxClients。目標(biāo)在于允許足夠多的workder 進(jìn)程或線程運(yùn)行,同時(shí)又不會導(dǎo)致服務(wù)器進(jìn)行過度的交換。如果傳入的請求超出處理能力,那么至少滿足此值的那些請求會得到服務(wù),其他請求被阻塞。
如果 MaxClients 過高,那么所有客戶機(jī)都將體驗(yàn)到糟糕的服務(wù),因?yàn)閃eb 服務(wù)器會試圖換出一個(gè)進(jìn)程,以使另一個(gè)進(jìn)程能夠運(yùn)行。而設(shè)得過低意味著可能會不必要地拒絕服務(wù)。查看高負(fù)載下運(yùn)行的進(jìn)程數(shù)量和所有Apache 進(jìn)程所導(dǎo)致的內(nèi)存占用情況對設(shè)置這個(gè)值很有幫助。如果 MaxClients 的值超過256,必須將 ServerLimit 也設(shè)為同樣的數(shù)值。
Apache 處理的每個(gè)請求都要履行一套復(fù)雜的規(guī)則,這些規(guī)則指明了Web 服務(wù)器必須遵循的約束或特殊指令。對文件夾的訪問可能按
IP 地址約束為某個(gè)特定文件夾,也可配置用戶名和密碼。這些選項(xiàng)還包含處理特定文件,例如,如果提供了一個(gè)目錄列表,該如何處
理的文件,或輸出結(jié)果是否應(yīng)壓縮。
這些配置以httpd.conf 中容器的形式出現(xiàn),例如<Directory>,以便指定所用配置引用的是磁盤上的一個(gè)位置;再如<Location>,表
示引用是URL 中的路徑。清單2 展示了一個(gè)實(shí)際的Directory 容器。
php.ini
PHP 的配置是在php.ini 中完成的。四個(gè)重要的設(shè)置控制PHP 可使用多少系統(tǒng)資源,如表1 所列。
表1. php.ini 中與資源相關(guān)的設(shè)置
設(shè)置 描述 建議值
max_execution_time 一個(gè)腳本可使用多少CPU 秒 30
max_input_time 一個(gè)腳本等待輸入數(shù)據(jù)的時(shí)間有多長(秒) 60
memory_limit 在被取消之前,一個(gè)腳本可使用多少內(nèi)存(字節(jié)) 32M
output_buffering 數(shù)據(jù)發(fā)送給客戶機(jī)之前,有多少數(shù)據(jù)(字節(jié))需要緩存 4096
具體數(shù)字主要取決于您的應(yīng)用程序。如果要從用戶處接收大文件,那么 max_input_time 可能必須增加,可以在php.ini 中修改,也
可以通過代碼重寫它。與之類似,CPU 或內(nèi)存占用較多的程序也可能需要更大的設(shè)置值。目標(biāo)就是緩解超標(biāo)程序的影響,因此不建
議全局禁用這些設(shè)置。關(guān)于 max_execution_time,還有一點(diǎn)需要注意:它表示進(jìn)程的CPU 時(shí)間,而不是絕對時(shí)間。因此一個(gè)進(jìn)
行大量I/O 和少量計(jì)算的程序的運(yùn)行時(shí)間可能遠(yuǎn)遠(yuǎn)超過 max_execution_time。這也是 max_input_time 可以大于
max_execution_time 的原因所在。
PHP 可執(zhí)行的日志記錄數(shù)是可配置的。在生產(chǎn)環(huán)境中,禁用除最重要的日志以外的一切日志記錄能夠減少磁盤寫操作。如果需要使用
日志來排除問題,那么可以按需啟用日志記錄。error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR 將啟用足夠
的日志記錄,使您發(fā)現(xiàn)問題,同時(shí)從腳本中消除大量無用的內(nèi)容。
回頁首
轉(zhuǎn)載于:https://blog.51cto.com/rex9527/1557401
總結(jié)
以上是生活随笔為你收集整理的LAMP 系统性能调优:第2 部分: 优化Apache 和PHP-学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCv实现两幅图像的拼接
- 下一篇: IIS8 使用FastCGI配置PHP环