Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          今天遠(yuǎn)程支持同事在Windows環(huán)境調(diào)優(yōu)Apache服務(wù)器性能,記錄在此,供需要的朋友參考。

          Java EE應(yīng)用,同時(shí)部署在兩個(gè)Tomcat(5.5.27)實(shí)例上,前面放了個(gè)Apache(httpd-2.2.19-win32-x86-no_ssl),通過mod_jk(1.2.32)做負(fù)載均衡,同一臺(tái)物理服務(wù)器,操作系統(tǒng)為64位的Windows Server 2003 SP2。現(xiàn)象是60+客戶端,平均每個(gè)客戶端每秒請(qǐng)求數(shù)2次,單個(gè)請(qǐng)求正常響應(yīng)時(shí)間在500ms以內(nèi),即每秒沖進(jìn)來120個(gè)請(qǐng)求,并發(fā)量最多在60上下,Apache就已不堪"重"負(fù),靜態(tài)資源響應(yīng)時(shí)間都超過10s,同時(shí)Tomcat和數(shù)據(jù)庫服務(wù)器均正常。憑我的經(jīng)驗(yàn),同樣的壓力直接壓到Tomcat也不至于這么難看。看來問題出在Apache。

          首先修改httpd.conf配置文件,打開status模塊:

          LoadModule status_module modules/mod_status.so
          <Location /status>
            SetHandler server-status
            Order deny,allow
            Deny from all
            Allow from 127.0.0.1 #需要的話也可放開為all
          </Location>

          這樣我們就能通過/status頁面查看服務(wù)器當(dāng)前的狀態(tài)信息,結(jié)果觀察到worker(即線程)數(shù)僅為64!坑爹啊!難怪撐不住。我記得以前Windows下面的Apache默認(rèn)線程數(shù)沒這么小的。找準(zhǔn)問題,接下來就好辦了:

          <IfModule mpm_winnt.c>
            ThreadsPerChild 300
            MaxRequestsPerChild 0
          </IfModule>

          稍微解釋一下:mpm_winnt.c是Apache為Windows NT提供的MPM (Multi-Processing Module),對(duì)應(yīng)到Linux環(huán)境下,則有prefork.c(多進(jìn)程/每進(jìn)程1個(gè)線程)和worker.c(多進(jìn)程+多線程)兩種MPM可選。Windows下面只會(huì)有父與子兩個(gè)進(jìn)程,因此單個(gè)子進(jìn)程能同時(shí)起多少線程(ThreadsPerChild)就成了調(diào)優(yōu)的關(guān)鍵。另一個(gè)參數(shù)MaxRequestsPerChild的含義是單個(gè)子進(jìn)程累計(jì)最多處理到少個(gè)請(qǐng)求,超過該值則退出重啟,這是出于防止內(nèi)存泄露慢慢拖垮整個(gè)服務(wù)器而做的防御性措施,0表示不做此限制。

          新配置上線后,客戶端數(shù)量順利沖上200+。Case closed.

          主站蜘蛛池模板: 自贡市| 贵定县| 林甸县| 商河县| 安平县| 凤冈县| 鲁山县| 咸丰县| 垣曲县| 龙南县| 宜都市| 贺兰县| 上栗县| 武义县| 大田县| 朝阳市| 渑池县| 西充县| 嘉祥县| 揭阳市| 兴义市| 安顺市| 吉首市| 杭锦后旗| 阳信县| 株洲市| 沙洋县| 涞水县| 拉萨市| 依安县| 灵寿县| 贡嘎县| 辉县市| 天津市| 息烽县| 任丘市| 凉城县| 托克逊县| 连江县| 新乡市| 临泉县|