peng 回復于:2004-10-22 09:12:05 |
問題描述的太籠統了。。
你的web是什么樣子的?靜態頁面還是php or jsp? 還有,不能訪問的時候,apache日值報什么錯誤? 系統性能檢測的時候,是什么伏在狀況??? 還有,你的apache具體的worker模塊的設置參數是什么啊。。 分析一個問題,要多方面的排除啊。。 很少有問題一下就能知道的。。 |
yesright 回復于:2004-10-22 11:55:25 |
我的服務器有一個行業咨訊網站,apache2+php4+mysql4
分前臺和后臺,前臺全部是HTML頁面,后臺是php網站生成系統. 根據不同的頁面,更新為每3秒到幾分鐘不等. 服務器配置為:dell2650/2cpu 2.8G/1G mem 同時在線人數一般為500--2000人不等.流量為3--8M apache日志已經作了日志滾動,每天生成一個日志,大概1.5G左右. 下面附有一張mrtg圖,有標示當時的情況.大概在10月21號23:30左右出現故障. [url]http://www.yesright.com/mrtg.mht[/url] |
peng 回復于:2004-10-22 12:05:04 |
嗯,這么說是用新聞編輯器來生成的。
你的后臺是apache2+mysql+php4,前臺也是放在這個機器上吧。 也就是說,通過虛擬主機來實現不同域名的訪問,來區分前后臺的。 如果是靜態頁面,apache2估計1g的內存是不能支持2000條http的同時訪問的。負載比較嚴重。 還有,你把你的httpd.conf文件關于mpm=worker的那個參數帖出來,我要看看你的參數連接設置是什么,發生這種filter是由于軟限制還是硬限制產生的。。 |
yesright 回復于:2004-10-25 14:41:21 |
謝謝peng,沒錯,我的html和發布系統在同一臺服務器上,現在正準備做負載平衡.
我的httpd.conf中worker.c的配置如下: $ cat /usr/local/apache2/conf/httpd.conf |grep worker.c -A 10 <IfModule worker.c> StartServers 2 MaxClients 3000 ServerLimit 60 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 50 MaxRequestsPerChild 0 </IfModule> 服務器cpu一般負載在70%到95% 我的服務器在高峰期已經達到了apache的MaxClients 3000,從www.yesright.com/onlinehttpd.png可以看到,已經一條直線了. 在最高峰期(在線httpd統計3000時),交換分區會用到1000M左右. 請問我的worker.c能不能加大MaxClients,我有點怕服務器忙不過來,而造成apache死掉. 下面附有一張昨天的內存使用圖和在線人數的mrtg圖 www.yesright.com/mem.png www.yesright.com/onlinehttpd.png |
peng 回復于:2004-10-25 15:21:51 |
你的物理內存是有點小,可以這樣試試。
增大線程,縮小進程看看。。 <IfModule worker.c> StartServers 4 ServerLimit 128 ThreadLimit 256 MaxClients 4096 MinSpareThreads 64 MaxSpareThreads 128 ThreadsPerChild 64 MaxRequestsPerChild 0 </IfModule> 在web的大訪問量期間,要有人守候,因為是生產機,最好監測一下。 如果條件允許,最好能擴大物理內存,不能讓內存使用到100%。還有,swap分區最好是物理內存的3-4倍,防止程序編寫的錯誤。 分析一下日志,看看高峰期的時候,apache的連接ip都是那些,統計一下,有沒有攻擊或者不正常的情況,如果多數是從幾個固定ip連接過來的,就要分析一下了。。 |
yesright 回復于:2004-10-25 16:42:13 |
謝謝你的建議,我會在接下來的一周進行測試. |
yesright 回復于:2004-10-25 17:06:39 |
我想借此機會,請教一下負載均衡的問題(假定以后發展到同時10000人在線).
我的負載均衡僅僅只要求apache的html頁面的負載均衡,因為我服務器的瓶頸在內存上和IO上. 我的初步設想如下: 一臺后臺服務器,專門做html的生成 用兩臺服務器作前臺,提供html訪問 負載均衡采用DNS輪詢 html發布采用nfs.(例如:把兩臺前臺的網站主目錄mount到后臺服務器上,發布時同時復制兩份到前臺) 這只是小弟的初步設想,請大家多多指教. |
peng 回復于:2004-10-25 17:37:28 |
如果想同時支持10000人的話,在普通的pc server上,做負載均衡是必須的了。
我看到你的方案,如果在10000人以上,面臨的三個問題:http的大請求量、硬盤的io負載,還有就是內存了。。 對于你的解決方案,如果用nfs的話,是解決不了io的問題。 其實你可以這樣:apache+squid的。。 1、1臺apache的主機,做新聞發稿器來生成主頁。同時,這個機器提供遠程的nfs的磁盤存貯。 2、前端2臺主機做發布主機,一臺安裝apache+squid,另一臺只安裝squid。 原理:發布的主機接受到用戶的訪問請求,是要訪問后臺的新聞發稿器的磁盤,這樣,每增加一個前端的機器,就是增加一份對io的請求。io的請求是不會降低,而是增高的。所以,同squid做反相代理,來相應用戶的http的請求。訪問后,會在本機的squid的cache中存放數據。當用戶再訪問這個數據時候,squid是讀取本機上的cache,而不是遠程nfs連接的數據,從而大大的降低了硬盤的io讀寫。把io負載充分的分散到前端的兩個主機本身的硬盤上了。而且,你你發布的是新聞,新聞更新的速度不是很快的,就是說,用戶既大多數都在訪問squid的cache,從而更能體現出squid的好處了。 第一主機用apache+squid,其中的apache是起到讀取后臺的硬盤的作用。前端的squid通過80端口來相應用戶請求。另一臺機器也是squid的80端口相應用戶,對于新的請求,連接第一臺機器,讓第一個機器的apache來訪問后臺主機的數據硬盤。 軟件構建就是這樣的: 新聞發稿器(apache+nfs server)--apache主機(第一太主機)--squid(兩個對外相應的機器)。 如果你前端用三臺機器,是最好的選擇。兩個主機裝squid,一個主機就安裝apache。通過dns論許,http請求均勻的發送到三個主機上。統計那個apache主機,乘以3,就是所有的網站pv了。。這里主意一點,就是squid好像軟件請求的極限是3000個httpd相應。 之所以用1個apache +2個squid,是因為squid沒有辦法做訪問統計。 還有,這種結構,隨著你的應用增加,只需要增加你的squid機器就可以了。當前端的apache負擔增大的時候,可以在squid主機上在安裝apache來均分squid請求就ok了。。 大多數的門戶網站都是用了這種apache+squid的配置結構。當然了,很多有錢的公司,直接就買了cache服務器,例如.netapp公司的netcache就是專門干這個的,替代了主機裝squid來做cache。 |
yesright 回復于:2004-10-25 23:47:42 |
謝謝你詳細的建議,做squid代理可能不能適合我的要求
因為我的服務器不是真正的新聞服務器,是一種類行業咨訊提供系統. 就象pconline.com.cn,同步各地區行情,或是足球的賠率網站,實時同步全球頂級聯賽數據,系統時刻在更新,我的首頁每三秒會更新一次,有些幾分鐘更新,是通過調用一個xml(或者說是一個數組),實時性太強了.可能代理方案是行不通的. |
peng 回復于:2004-10-26 09:31:47 |
如果是這樣的話,就要根據實際情況測試一下了。最好后臺的服務器買個sun sparc的。。當然了,如果有條件,建議添加一個小的陣列,這樣來做nfs的存儲空間,能很好的解決磁盤io問題。。 |