Linux下的Apache性能參數(shù)在線調節(jié)系統(tǒng)
在Linux 2.6.9平臺下,針對Apache Web Server實現(xiàn)了關鍵性能參數(shù)的在線調節(jié),使得網(wǎng)絡管理員能在服務繁忙的情況下,不用重起服務就能調節(jié)服務器的性能參數(shù),減少因為重起服務引起的經(jīng)濟損失。關鍵詞Web服務器 Apache 共享內存 在線調節(jié) Abstract:Thispaper designs and implements an online parameter-tuning system for Apache web server under Linux 2.6.9 platform. This system enables the web administrator to tuning the performance parameters of server without restarting the web service, hence reduces the cost caused by restarting the web service. Keywords:Web Server Apache shared memory online tuning 1 引言 Apache是如今Internet上最流行的web服務器。Netcraft的調查表明,世界上超過60%的網(wǎng)絡Web服務器都使用Apache作為Web服務軟件。Apache是一個開放源代碼(Open Source)軟件,它健壯、高效、模塊化、響應速度快,并且可靠穩(wěn)定。 Web管理員可以通過調節(jié)Apache配置文件中的性能參數(shù)來調節(jié)和優(yōu)化服務器的性能,然而這種方法只能實現(xiàn)靜態(tài)調節(jié),一旦服務器啟動,對配置文件中的任何參數(shù)修改只有在重新啟動服務器的情況下才能起作用。在網(wǎng)絡服務繁忙的情況下重新啟動服務器需要付出代價,因為在重起的過程中會拒絕某些服務,在電子商務中拒絕服務往往會引起經(jīng)濟損失。該文闡述在Linux平臺下如何實現(xiàn)Apache參數(shù)在線調節(jié),使得管理員可以根據(jù)負載情況動態(tài)調節(jié)服務器的性能參數(shù)以提高web服務的性能,避免重新啟動服務帶來的損失。 2 Apache服務器簡介本文使用的是Apache2.0.52版本,相對于Apache 1.3版本來說,Apache 2.0更容易移植,更加可靠,它完全基于模塊。Apache 2.0的多道處理模塊(mpm)的引入使得用戶可以根據(jù)不同站點的特點和需求來選擇安裝不同的mpm來實現(xiàn)不同的運行方式。Apache2.0.52中的mpm模塊有: 1. 預先派生(prefork) 2. 工作者(worker) 3. WinNT 4. beos 5. os2 6. netware 7. 獨立子進程(perchild) 8. 領導者(leader) 9. 線程池(threadpool) 其中后三個是試驗模塊,而前六個已經(jīng)比較成熟穩(wěn)定,3,4,5,6這四個mpm主要是針對對應的操作系統(tǒng)設計的。prefork模塊是多進程預先派生模塊,而工作者(worker)模塊以多進程多線程的方式工作。本文中使用的是prefork模塊。 3 Apache配置參數(shù)簡介在apache的配置文件httpd.conf中提供了很多可供web管理員配置的性能參數(shù),其中最大子進程數(shù)(MaxClients)和KeepAliveTimeout(保持連接超時)是對服務器性能影響最大的兩個參數(shù)。 MaxClients如果設的過小,則在連接多的情況下,客戶就得排隊等候,造成了系統(tǒng)資源沒有充分利用。而MaxClients如果設的過大,服務器就會超負載運行,從而使得整體性能下降。 KeepAliveTimeout是主要是針對http1.1連接請求所設置的參數(shù)。它設置了在兩次連接請求之間所等待的時間,如果兩次連接請求之間間隔超過KeepAliveTimeout,服務器就斷開本次連接。 KeepAliveTimeout如果設的過小的話,保持連接的優(yōu)勢無法發(fā)揮。而KeepAliveTimeout如果設的過大,由于一個子進程一次只能處理一個連接,造成了子進程被綁在某個連接上,從而造成資源浪費,并且在負載重的情況下,造成很多用戶需要排隊等候,而CPU卻空閑的現(xiàn)象。 4 在線參數(shù)調節(jié)系統(tǒng)的實現(xiàn) 4.1 Apache服務器的工作方式要實現(xiàn)Apache的在線參數(shù)調節(jié),首先要了解Apache的工作方式。本文使用的mpm是prefork,因此著重介紹prefork的工作方式。 prefork模塊是多進程模塊,啟動時,由父進程派生出多個子進程,父進程是管理進程,它按照配置文件的配置參數(shù)來控制子進程數(shù),處理異常退出的子進程并向日志中記錄出錯情況,維護服務器的正常運轉,它并不直接處理連接請求。服務器的連接請求是由派生出來的子進程進行處理的。父進程和子進程間通過記分板(scoreboard)進行通信。記分板實際上是一段共享內存,它記錄了一些全局的信息例如進程數(shù)上限(server_limit)和線程數(shù)上限(thread_limit),并且它還維護著每個工作子進程或線程的情況如進程號(pid),線程號(thread_num)以及進程或線程所處的狀態(tài)(status)等。要從外部程序在線修改apache的性能參數(shù),需要通過讀寫共享內存記分板來實現(xiàn)。一般需要在共享內存記分板添加各性能參數(shù)對應的變量,通過動態(tài)修改記分板中的變量來動態(tài)調整apache的性能參數(shù)。 4.2 讀寫Apache服務器的共享內存要從外部程序讀寫Apache的記分板,首先要了解是操作系統(tǒng)的共享內存機制的以及Apache共享內存中的具體內容。Apache API函數(shù)庫中有六個宏,可以通過測試這幾個宏的值來了解操作系統(tǒng)的共享內存機制,這幾個宏是: 1. APR_USE_SHMEM_MMAP_ZERO 2. APR_USE_SHMEM_MMAP_ANON 3. APR_USE_SHMEM_SHMGET_ANON 4. APR_USE_SHMEM_MMAP_TMP 5. APR_USE_SHMEM_MMAP_SHM 6. APR_USE_SHMEM_SHMGET 其中前三個是匿名共享內存的創(chuàng)建方式,后三個是有名共享內存的創(chuàng)建方式,其中1,2,4,5這四個宏是Posix共享內存方式,而3,6是System V共享內存方式。通過測試,Linux2.6.9系統(tǒng)上所使用的是APR_USE_SHMEM_MMAP_ANON和APR_USE_SHMEM_SHMGET。 通過設置配置文件中的ScoreboardFile選項使服務器使用有名共享內存,即System V的共享內存機制。這樣apache所使用的共享內存shmid可以通過在root權限下執(zhí)行ipcs命令獲得。 至于共享內存的內容,Apache源代碼中有一個名為記分板的數(shù)據(jù)結構,其結構如下: typedef struct{ global_score *global; process_score *parent; worker_score **servers; }scoreboard; 而共享內存記分板中的內容如圖1所示,在共享內存的起始處有一 圖1 .Apache共享內存記分板的內容因此讀取記分板內容首地址的偽代碼如下(如果采用Posix有名共享內存機制的話): { Char* m; m=shmat(shmid,NULL,0); } 從而我們可以通過獲取的共享內存首地址m對共享內存進行讀寫訪問,有目的地修改記分板的內容。 4.3 Apache源代碼的修改我們只介紹maxclients參數(shù)的在線調節(jié)的實現(xiàn)。首先在global_score結構中增加一個變量my_daemons_limit,該結構存在于記分板頭文件scoreboard.h中,該文件類似地定義了與記分板內容有關的結構變量如process_score,worker_score等。在scoreboard.c中將my_daemons_limit的初始值設置為配置文件中配置的maxclients參數(shù)值,這主要通過ap_mpm_query函數(shù)來實現(xiàn),代碼為: Ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED,& my_daemons_limit) 為了使其它程序訪問到真實的最大子進程數(shù)即記分板中的my_daemons_limit值,在ap_mpm.h中添加一個宏AP_MPMQ_MY_MAX_DAEMON_USED,并且在prefork.c的ap_mpm_query函數(shù)的適當位置添加以下代碼: Case AP_MPMQ_MY_MAX_DAEMON_USED: *result=ap_scoreboard_image->global->my_daemons_limit; return APR_SUCCESS; 同時將其它文件中調用Ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED,…)函數(shù)的地方改為Ap_mpm_query(AP_MPMQ_MY_MAX_DAEMON_USED,…). 改動較大的是在prefork.c中,除了ap_mpm_query和set_max_clients函數(shù)中的ap_daemons_limit保持不變外,其它地方的ap_daemons_linit應相應改為ap_scoreboard_image->global->my_daemons_limit,比較特別的一處是在perform_idle_server_maintainance中應改為server_limit因為該循環(huán)是查詢記分板中的各個進程狀態(tài)并設置相應的計數(shù)值,而外部程序設置的最大子進程數(shù)可能比初始值大也可能比初始值小。在perform_idle_server_maintainance中還應該修改相應的代碼以控制
關鍵字:Linux Apache 性能 參數(shù) 調節(jié) 系統(tǒng)
新文章:
- CentOS7下圖形配置網(wǎng)絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認iptable規(guī)則詳解