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问题。。 |