-
cronolog
2008-05-04 13:32:22
1.cronolog: ./configure & make & install
2.add in httpd.conf of apache
CustomLog "|/usr/local/sbin/cronolog /home/perf/cron_web/logs/%Y/%m/%d/access.log" combined
3.vim /home/perf/mindy/cron_log.sh
#!/bin/sh
#backup old log
/bin/mv -f /home/perf/cron_web/logs/`date -d yesterday +%w`/access_log /usr/local/apache2/logsbackup#remove old log
/usr/bin/find /home/perf/cron_web/logs -name access_log -mtime +6 -exec rm -rf {}\;#analysis with awstats
/usr/local/sbin/awstats4.crontab -e
5 0 * * * /home/perf/mindy/cron_log.sh
-
mrtg
2008-05-04 13:21:54
preconditions:
install zlib\gd\libpng
check:perl\gcc\sysstat\iostat\httpd(apache)\net-snmp
mrtg:./configure & make & make install(default path:/usr/local/mrtg)
1.vi /etc/snmp/snmpd.conf
把下面的#号去掉
#view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc #在89行
把下面的语句#在62行
access notConfigGroup "" any noauth exact systemview none none
改为:
access notConfigGroup "" any noauth exact mib2 none none
改完重启一下snmp
Service snmpd restat2.mkdir /usr/local/apache2/www/mrtg
3.cp /usr/local/mrtg/* /usr/local/apache2/www/mrtg
4. /usr/local/mrtg/bin/cfgmaker –output=/usr/local/apache2/www/mrtg/mrtg.cfg public@192.168.98.129
5.vim /usr/local/apache2/www/mrtg/mrtg.cfg
add & modify:WorkDir: /usr/local/apache2/www/mrtg
enable:Options[_]: growright, bits
add:Language:Chinese
为了使网络流量图可以每5分钟自动更新一次,我们还需要在
###Global Config Options的下一行加入一条命令:
RunAsDaemon: yes6.or add: /etc/profile :
LC_ALL=C
LANGUAGE=on. /etc/profile
7.add scrīpts into mrtg.cfg:
LoadMIBs: /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt
############################# Memory #################################
#Target[memory]: 1.3.6.1.4.1.9600.1.1.2.1.0&1.3.6.1.4.1.9600.1.1.2.4.0:public@10.5.13.17:::::2 / 1024
Target[memory]: `/home/perf/mindy/mrtg_monitor/mrtg_mem.sh`
MaxBytes[memory]: 512000
Title[memory]:Memory Usages
ShortLegend[memory]: &
kmg[memory]:MB,kB --也可k,M,G,T,P,X
kilo[memory]:1024#ShortLegend[memory]: bytes
YLegend[memory]: Memory Usage :
Legend1[memory]: Total Memory :
Legend2[memory]: Used Memory :
LegendI[memory]: Total Memory :
LegendO[memory]: Used Memory :
Options[memory]: growright,gauge,nopercent
PageTop[memory]:<H1>Memory Usages</H1>######################################################################
########################### CPU ######################################(注:我的服务器是双CPU的,如果你只有单CPU,把hrProcessorLoad.1&hrProcessorLoad.2 改成 hrProcessorLoad.1&hrProcessorLoad.1)
#Target[cpu]: hrProcessorLoad.1&hrProcessorLoad.2:public@xx.xx.xx.xx
#RouterUptime[cpu]: public@xx.xx.xx.xx
Target[cpu]:`/home/perf/mindy/mrtg_monitor/mrtg_cpu.sh`
MaxBytes[cpu]:12500000
Title[cpu]: CPU -- XMNLINUXTEST02
Options[cpu]: gauge,nopercent,growright
YLegend[cpu]: CPU loading (%)
ShortLegend[cpu]:%
LegendO[cpu]: & CPU SYSTEM;
LegendI[cpu]: & CPU USER;
PageTop[cpu]: <H1>;CPU -- XMNLINUXTEST02</H1>;######################################################################
########################### SWAP #####################################
Target[swap]:`/home/perf/mindy/mrtg_monitor/mrtg_swap.sh`
Unscaled[swap]: dwym
MaxBytes[swap]: 1024000
Title[swap]:Memory State of Server
ShortLegend[swap]: &
kmg[swap]:kB,MB
kilo[swap]:1024
YLegend[swap]: Swap Usage
Legend1[swap]: Total Swap
Legend2[swap]: Used Swap
LegendI[swap]: Total Swap
LegendO[swap]: Used Swap
Options[swap]: growright,gauge,nopercent
PageTop[swap]:<H1>;Swap-------XMNLINUXTEST02</H1>;######################################################################
########################### Disk Space ###############################
Target[disk]: `/home/perf/mindy/mrtg_monitor/mrtg_df.pl`
Title[disk]: Disk Space ----XMNLINUXTEST02
Unscaled[disk]: dwym
MaxBytes[disk]: 7369794
kmg[disk]: KB,MB,GB
LegendI[disk]: Total Disk Space
LegendO[disk]: Used Disk Space
Legend1[disk]: Total Disk Space
Legend2[disk]: Used Disk Space
YLegend[disk]: Megabytes
ShortLegend[disk]: &
Options[disk]: growright,gauge,nopercent
PageTop[disk]: <H1>;Disk Space --------XMNLINUXTEST02</H1>;######################################################################
############################ Disk I/O ################################
Target[diskIO]: `/home/perf/mindy/mrtg_monitor/mrtg_diskio.sh`
Title[diskIO]: Disk HDA I/O Utilization Report
Unscaled[diskIO]: dwym
MaxBytes[diskIO]: 100
PageTop[diskIO]: <H1>;Disk I/O Utilization Report</H1>;
kmg[diskIO]: KB,MB,GB
LegendI[diskIO]: Disk I/O KBread/sec
LegendO[diskIO]: Disk I/O KBwrite/sec
Legend1[diskIO]: Disk I/O KBread/sec
Legend2[diskIO]: Disk I/O KBwrite/sec
YLegend[diskIO]: Megabytes
ShortLegend[diskIO]: &
Options[diskIO]: growright,gauge,nopercent######################################################################
Target[www]: `/opt/mrtg/mrtg.www`
MaxBytes[www]: 500
Options[www]: nopercent, growright
YLegend[www]: Online Users
ShortLegend[www]: %
LegendI[www]: Connect :
LegendO[www]: Online :
Title[www]: WWW Connect
PageTop[www]: <H1> WWW Connect </H1>######################################################################
Target[process]: hrSystemProcesses.0&hrSystemNumUsers.0:public@10.5.13.17
RouterUptime[process]: public@10.5.13.17
MaxBytes[process]: 150
Title[process]: Processes and Users
PageTop[process]: <br /><H1>Processes and Users</H1>
Unscaled[process]: ymwd
ShortLegend[process]:.
YLegend[process]: Numbers
Legend1[process]: Process Numbers
Legend2[process]: System Users
LegendI[process]: Process Numbers
LegendO[process]: System Users
Options[process]: growright,nopercent,gaugeend
8.vim /home/perf/mindy/mrtg_monitor/mrtg_mem.sh
totalmem=`/usr/bin/free -m|grep Mem|awk '{print $2}'`
usedmem=`/usr/bin/free -m |grep "buffers/cache"|awk '{print $3}'`
UPtime=`/usr/bin/uptime |awk '{print $3" "$4" "$5}'`
echo "totalmem: "$totalmem
echo "usedmem: "$usedmem
echo "UPtime: "$UPtime
hostnamevim /home/perf/mindy/mrtg_monitor/mrtg_swap.sh
#!/bin/bash
# This scrīpt to monitor the swap usage.
totalswap=`/usr/bin/free -m|grep Swap |awk '{print $2}'`
usedswap=`/usr/bin/free -m|grep Swap |awk '{print $3}'`
UPtime=`/usr/bin/uptime |awk '{print $3" "$4" "$5}'`
echo "totalswap: "$totalswap
echo "usedswap: "$usedswap
echo "UPtime: "$UPtime
hostnamevim /home/perf/mindy/mrtg_monior/mrtg_cpu.sh
#!/bin/bash
cpuusr=`/usr/bin/sar -u 1 3 |grep Average|awk '{print $3}'`
cpusys=`/usr/bin/sar -u 1 3 |grep Average|awk '{print $5}'`
UPtime=`/usr/bin/uptime|awk '{print $3" "$4" "$5}'`
echo "cpusys: "$cpusys
echo "cpuusr: "$cpuusr
echo "UPtime: "$UPtime
hostnamevim /home/perf/mindy/mrtg_monitor/mrtg_df.pl
foreach $filesystem (`df -ml | grep -v "Filesystem"`)
{
@df = split(/\s+/,$filesystem);
$total += $df[1];
$usage += $df[2];print "total_df: $total\n";
print "usage_df: $usage\n";
}
hostnamevim /home/perf/mindy/mrtg_monitor/mrtg_diskio.sh
hd=sda
disk=/dev/$hd
KBread_sec=`iostat -x $disk|grep $hd |awk '{print $8}'`
KBwrite_sec=`iostat -x $disk|grep $hd |awk '{print $9}'`
UPtime=`/usr/bin/uptime |awk '{print $3" "$4" "$5}'`
echo "KBread/sec on sda: "$KBread_sec
echo "KBwrite/sec on sda: "$KBwrite_sec
echo "UPtime: "$UPtime
hostnameend
vim /home/perf/mindy/mrtg_monitor/mrtg_connectins.sh
#!/bin/bash
all=`netstat -a | grep www|awk '{print $5}'|sort | wc -l|awk '{print$1 - 1}'`
user=`netstat -a | grep www|awk '{print $5}'|cut -d":" -f1|sort| uniq |wc -l | awk '{print $1 - 1}'`
if [ "$all" = "-1" ]; then
echo 0
else
echo $all
fi
if [ "$user" = "-1" ]; then
echo 0
else
echo $user
fi
UPtime=`/usr/bin/uptime | awk '{print $3 " " $4 " " $5}'`
echo $UPtime
hostname8.add httpd.conf in apache: Alias /mrtg/ "/usr/local/apache2/www/mrtg/"
9.vim /home/perf/mindy/mrtg_monitor.sh
env LANG=C /usr/local/mrtg-2/bin/mrtg /usr/local/apache2/www/mrtg/mrtg.cfg
env LANG=C /usr/local/mrtg-2/bin/indexmaker --output=/usr/local/apache2/www/mrtg/index.html --title="Monitor 129" /usr/local/apache2/www/mrtg/mrtg.cfg10.crontab -e
*/5 * * * * /home/perf/mindy/mrtg_monitor.sh
11.curl http://192.168.98.129:8080/mrtg/index.html
addition:
mrtg.cfg 里面几个参数的意思.
Target:有两种定义方法
从snmp获取信息:2: public@192.168.1.2 <--2表示从snmp获得的设备号标识,后面是community认证信息和服务器地址
从脚本获取信息:指定要执行的脚本路径,使用“`”号分割。
Target:是要执行的脚本
Xsize:生成图表的横向宽度(最大600)
Ysize:生成图表的纵向高度(最大200)
Title:标题
kMG: Change the default multiplier prefixes
Ytics:纵向划分为几个块(格子)
MaxBytes:图表纵向数值的最大上限
PageTop:页面上面的提示
kilo:一般是写1024,如果需要的话,是1000在计算机里的单位
LegendI:从SHELL返回的数据中的第一个
LegendO:从SHELL返回的数据中的第二个
Options: growright,表示图表向右延展Options: 一些可用参数
growright:将数据随时间变化的顺序以右而左绘图;
bits:数据单位为 bits;
nopercent:在图下方的说明文字中,不显示百分比;
gauge:图表的上限固定。
常见:
Options[192.168.228.153_2]: growright, bits (用在网络流量中)
Options[192.168.228.153_3]: growright, nopercent, gauge (用在 CPU 负载中)------------------------------
make & make install mod_watch4
vim apache2 httpd.conf:
<IfModule mod_watch.c>
# Allows the URL used to query virtual host data:
#
# http://www.snert.com/watch-info
#
<Location /watch-info>
SetHandler watch-info
</Location>
# Intended for debugging and analysis of shared memory
# hash table and weenie files:
#
# http://www.snert.com/watch-table
#
<Location /watch-table>
SetHandler watch-table
</Location>
# 注意,为了安全,请关闭watch-table选项,或者加以IP限制,以免别人查看你SERVER所放的站点资源,引起不必要的麻烦。
Order deny,allow
Deny from all
Allow from 127.0.0.1
</IfModule>check : /usr/local/sbin/apachectl configtest
restart:/usr/local/sbin/apachectl restart
就可以从某个虚拟主机的watch-info文件读出某些数据了,比如:
http://freebsd.onlinecq.com/watch-info
freebsd.onlinecq.com 2 760 858 2 1 1 0.000 675269920 3217025432
apache2mrtg.pl /usr/local/etc/apache2/httpd.conf
and copy some segments such as:
vi /usr/local/etc/apache2/mod_watch.cfg
WorkDir:/home/onlinecq.com/mrtg/
Options[_]: growright,bits
#Language: gb2312
#Title[^]: Traffic Analysis for
PageTop[^]: <H1>Traffic Stats for Online</H1><HR>
#PageTop[$]: Contact<HR>
PageFoot[^]: xxx------------------------------------------
mrtg 远程设置,哈,以上是对本机的监控设置,随着配置的深入,越来越发现以上已经不够用了。下面摘抄中我结合了自己的一些心得和关键点,相信还是有点用的:〉
cfgmaker --global "WorkDir: /var/www/html/mrtg"
--global "Options[_]: growright,bits"
--ifref=descr
--ifdesc=alias
public@router1.place.xyz
public@router2.place.xyz
--global "Options[_]: growright"
--ifref=name
--ifdesc=descr
public@switch1.place.xyz
--ifdesc=name
public@switch2.place.xyz > mrtg.cfg那个是针对router和switch配置监控,因为router等可能需要通过alias来识别。详见以下注释。自己的配置:
cfgmaker --global "WorkDir: /var/www/html/mrtg" -可去掉,通过改生成后的mrtg.cfg就可以了。
--global "Options[_]: growright,bits" -同上
--ifref=ip -用IP
--ifdesc=alias -去掉
public@router1.place.xyz -公共访问名@目标主机
public@router2.place.xyz -以上global到此均有效
> mrtg.cfg这里指示监控四个设备:router1.place.xyz、router2.place.xyz、switch1.place.xyz 和switch2.place.xyz,所有的设备都采用共同体名public来进行监控。并且两个路由器采用descr来作为设备的描述信息,而两个交换机则采用alias作为设备描述(这两者是不同的,例如对于cisco路由器来说,对于descr来说设备描述为"Serial0",而对于aliasl来说则为"Link to HQ")。
执行之后,生成的mrtg.cfg中会有一大堆对每个ethx网卡接口地址信息描述。对号入座就行了。
执行并测试远程snmpd:
snmpwalk -c public -v 1 ip(远程主机) .1.3.6.1.4.1.2021:53
编写追加远程主机/etc/snmp/snmpd.conf并重启:
exec .1.3.6.1.4.1.2021.53 usrcpu /bin/sh /xx/xx/cpu.sh
如果遇到执行输出中/bin/sh /xx/xx/cpu.sh permission denied
就需要进入vim /etc/selinux/config
更改为:SELINUX=disabled
再:vi /boot/grub/menu.lstkernel /boot/vmlinuz-2.6.9 ro root=/dev/hda1 rhgb selinux=0
----------------
[root@Mindy mindy]# rpm -qa|grep snmp
net-snmp-5.1.2-11.2
net-snmp-perl-5.1.2-11.2
net-snmp-libs-5.1.2-11.2
net-snmp-utils-5.1.2-11.2
net-snmp-devel-5.1.2-11.2version mrtg:2.13.2
然后:sync; reboot -
不摘抄能咋办?至少我思考了!
2008-04-03 23:21:21
netstat -an | grep 61.143.210.228.80 | grep "WA" | wc -l
---------------------------
换多少个*httpd都没有用
你的问题明显是mysql联接数过多引起的
十之八九是应用层的dos还是赶快先查清楚是不是单个ip过来的吧,
这种问题居然还讨论半天....
---------------------------
mmcache配置
---------------------------
ps -U apache -u apache u我们可以认为RSS数字的一半是httpd线程真正使用的内存数,这可能还有点保守,但是
离我们的目的已经非常接近了
对于php脚本来说,把这个参数设置的小一些是有好处的,可以避免程序使用的内存持
续增长对apache带来的压力:让这个参数定期释放内存,因为php是在脚本执行完毕后
,自动释放只用的资源(内存)的。
比如设置为50?如果太小的话,重新产生一个apache进程也是要消耗资源的,这是一个
平衡问题。
---------------------------
在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢?先看看理论分析。
打 开 KeepAlive 后,意味着每次用户完成全部访问后,都要保持一定时间后才关
闭会关闭 TCP 连接,那么在关闭连接之前,必然会有一个 Apache 进程对应于该用户
而不能处理其他用户,假设 KeepAlive 的超时时间为 10 秒种,服务器每秒处理 50
个独立用户访问,那么系统中 Apache 的总进程数就是 10 * 50 = 500 个,如果一个
进程占用 4M 内存,那么总共会消耗 2G 内存,所以可以看出,在这种配置中,相当消
耗内存,但好处是系统只处理了 50次 TCP 的握手和关闭操作。
如 果关闭 KeepAlive,如果还是每秒50个用户访问,如果用户每次连续的请求数为3个,那么 Apache 的总进程数就是 50 * 3 = 150 个,如果还是每个进程占用 4M
内存,那么总的内存消耗为 600M,这种配置能节省大量内存,但是,系统处理了 150
次 TCP 的握手和关闭的操作,因此又会多消耗一些 CPU 资源。
在看看实践的观察。
我 在一组大量处理动态网页内容的服务器中,起初打开 KeepAlive 功能,经常观
察到用户访问量大时Apache进程数也非常多,系统频繁使用交换内存,系统不稳定,有
时负载会出现较大波动。关闭了 KeepAlive 功能后,看到明显的变化是: Apache 的
进程数减少了,空闲内存增加了,用于文件系统Cache的内存也增加了,CPU 的开销增
加了,但是服务更稳定了,系统负载也比较稳定,很少有负载大范围波动的情况,负载
有一定程度的降低;变化不明显的是:访问量较少的时候,系统平均 负载没有明显变
化。
总结一下:
在内存非常充足的服务器上,不管是否关闭 KeepAlive 功能,服务器性能不会有明显变化;
如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭 KeepAlive 后可以节省很多内存,而节省出来的内存用于文件系统
Cache,可以提高文件系统访问的性能,并且系统会更加稳定。
补充:
关于是否应该关闭 KeepAlive 选项,我觉得可以基于下面的一个公式来判断。-----------------------------
在理想的网络连接状况下,系统的 Apache 进程数和内存使用可以用如下公式表达
:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
换成中文:
总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求
Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数需要特别说明的是:
[平 均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当 KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参
与乘的运算从上面的公式看,如果 [每秒用户请求] 多,[KeepAliveTimeout] 的值大
,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当
[平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。
基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout时,关闭 KeepAlive 选项是划算的,否则就可以考虑打开。
---------------------
最近发现一个比较奇怪的现象,某台以prefork模式工作的服务器的内存使用率在每次重启apache之后会不停的上涨,直到swap用完,直到死机。后来查出来是因为
apache使用的某一些脚本存在内存泄露的代码段。而apache启动的调用这些代码段的进
程的处理请求数被设置为无穷。也就是说这些进程只有在apache重启(stop-start模式
)或者服务器(指的是机器)重启的情况下才会被kill,否则将一直运行下去,直到耗
尽系统的最后一点资源(主要是内存)。
问题貌似已经解决了。但是,还有点不对,就是为什么有将近4G的可用空间(
内存2G加上swap2G,除去操作系统部分),资源还是很快就耗尽了?虽然进程在每处理
一个请求的情况下都会吃掉一点内存,但是在看了内存泄露的那段代码后发现每次处理
泄露的内存也不过2K左右。要消耗掉3G的空间,需要至少15.7w次请求。但是目前的手
机统计平台上一天的点击量也不过5w。其实top命令下就能看出来,每个httpd进程的内
存使用率有2.4%,3.2%等等。对于一个2G内存的服务器,一个进程2%就等于是40M。仅
仅一个普通的请求,没有post参数的,没有大规模数据库查询的,怎么会用这么多内存
?httpd的进程在被apache的主控进程创建的时候,会预先加载一些包,这些包是在
apache配置文件里设置的。然后发现在apache加载的包目录下,有一个很大的包,是用
来根据手机号查找手机卡的信息的。去掉这个包之后,每个httpd的进程使用内存就正
常了。
总结有两点:
1、MaxRequestsPerChild不能设置为0,最好设置为一个相对不大的数字,防止
httpd进程有意外的内存泄露(当然,也不建议设置为1,否则apache就会不停的fork新
的进程了,cpu的资源也就过多消耗了);
2、不要加载过多的包,尤其是比较大的包。如果费用不可,最好能够用数据库
来存储包里的一些静态信息。
----------------------
计算httpd占用内存的平均数:
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。
服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那
么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368
约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他
的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)
控制最大连接数的MaxClients ,因此可以尝试配置为:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
</IfModule>实时检测HTTPD连接数:
watch -n 1 -d "pgrep httpd|wc -l"----------------------
工具:cronolog安装:http://www.cronolog.org----------------------
一般说来,可以不需要的模块包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule statuserials_module libexec/mod_status.so
#server side include已经过时了
#LoadModule includeserials_module libexec/mod_include.so
#不需要将没有缺省index文件的目录下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#尽量不使用CGI:一直是APACHE安全问题最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asiserials_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全校验可以大大提高访问速度
#LoadModule accesserials_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件应用的关联
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so可用可不用的有:
#比如:需要在~/username/下调试php可以将
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要将以前的URL进行转向或者需要使用CGI scrīpt-alias
LoadModule aliaserials_module libexec/mod_alias.so
常用的模块:
最常用的可能就是php和JAVA WEB应用的wrapper,此外,从性能上讲:mod_gzip可以减少40%左右的流量,从而减少机器用于传输的负载,而mod_expires可以减少10%左右的
重复请求,让重复的用户请求CACHE在本地,根本不向服务器发出请求。
一般将具体的resin设置放在另外一个文件中:
<IfModule mod_caucho.c>
CauchoConfigFile /path/to/apache/conf/resin.conf
</IfModule>mod_expires的安装配置:
<IfModule mod_expires.c>
ExpiresActive on
#所有的.gif文件1个月以后过期
ExpiresByType image/gif "access plus 1 month"
#所有的文件缺省1天以后过期
ExpiresDefault "now plus 1 day"
</IfModule>mod_gzip的安装:
/path/to/apache/bin/apxs -i -a -c mod_gzip.cmod_gzip和PHP在一起的配置
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_minimum_file_size 1000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file .htm$
mod_gzip_item_include file .html$
mod_gzip_item_include file .php$
mod_gzip_item_include file .php3$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
#不要让mod_gzip和php的session使用同一个临时目录:php_session需要通过php.ini设置session.save_path = /tmp/php_sess
mod_gzip_temp_dir /tmp/mod_gzip
mod_gzip_dechunk Yes
mod_gzip_keep_workfiles No
</IfModule>mod_gzip和mod_php的配合:不要让mod_gzip和mod_php使用同一个临时目录;
mod_gzip和RESIN配合:要让mod_gzip在mod_caucho后LOAD,否则mod_gzip不起作用
...othr modules
AddModule mod_so.c
AddModule mod_caucho.c
#notice: mod_gzip must load after mod_caucho
AddModule mod_gzip.c
AddModule mod_expires.c
...<IFModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk yes
mod_gzip_keep_workfiles No
mod_gzip_minimum_file_size 3000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file .html$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
mod_gzip_item_include handler 'caucho-request'
</IFModule>日志轮循工具cronolog的安装和设置:cronolog可以非常整齐的将日志按天轮循存储
缺省编译安装到/usr/local/bin/下,只需要将配置改成:CustomLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%
w/accesserials_log" combined
日志将按天截断并存放在以weekday为目录名的目录下:比如:log/1是周一,log/5是
周五, log/0是周日
Apache安装后,缺省根目录下没有但很有用的2个文件:
favicon.ico: favicon.ico是一个16x16的站点图标文件,如果浏览器发现有这个文件
,在地址栏中会用这个图标替换调浏览器的网页图标。IE6和MOZILLA等主流浏览器都支
持这个功能。
robots.txt: 用于告诉搜索引擎的爬虫程序(spider)网站那些页面可以被索引,那些不可以。具体说明请参考:
http://www.robotstxt.org/wc/robots.html
-
Web站点崩溃的原因总结(还是摘抄)
2008-04-03 23:18:07
Web站点崩溃的原因总结
有许多种原因可能导致Web站点无法正常工作,这使得系统地检查所有问题变得很困难。下面将集中分析总结导致Web站点崩溃的最常见的问题。如果可以解决这些常规问题,那么也将有能力对付出现的一些意外情况。
磁盘已满
导致系统无法正常运行的最可能的原因是磁盘已满。一个好的网络管理员会密切关注磁盘的使用情况,隔一定的时间,就需要将磁盘上的一些负载转存到备份存储介质中(例如磁带)。
日志文件会很快用光所有的磁盘空间。Web服务器的日志文件、SQL*Net的日志文件、JDBC日志文件,以及应用程序服务器日志文件均与内存泄漏有同等的危害。可以采取措施将日志文件保存在与操作系统不同的文件系统中。日志文件系统空间已满时Web服务器也会被挂起,但机器自身被挂起的几率已大大减低。
C指针错误
用C或C++编写的程序,如Web服务器API模块,有可能导致系统的崩溃,因为只要间接引用指针(即,访问指向的内存)中出现一个错误,就会导致操作系统终止所有程序。另外,使用了糟糕的C指针的Java模拟量(analog)将访问一个空的对象引用。Java中的空引用通常不会导致立刻退出JVM,但是前提是程序员能够使用异常处理方法恰当地处理错误。在这方面,Java无需过多的关注,但使用Java对可靠性进行额外的度量则会对性能产生一些负面影响。
内存泄漏
C/C++程序还可能产生另一个指针问题:丢失对已分配内存的引用。当内存是在子程序中被分配时,通常会出现这种问题,其结果是程序从子程序中返回时不会释放内存。如此一来,对已分配的内存的引用就会丢失,只要操作系统还在运行中,则进程就会一直使用该内存。这样的结果是,曾占用更多的内存的程序会降低系统性能,直到机器完全停止工作,才会完全清空内存。
解决方案之一是使用代码分析工具(如Purify)对代码进行仔细分析,以找出可能出现的泄漏问题。但这种方法无法找到由其他原因引起的库中的泄漏,因为库的源代码是不可用的。另一种方法是每隔一段时间,就清除并重启进程。Apache的Web服务器就会因这个原因创建和清除子进程。
虽然Java本身并无指针,但总的说来,与C程序相比,Java程序使用内存的情况更加糟糕。在Java中,对象被频繁创建,而直到所有到对象的引用都消失时,垃圾回收程序才会释放内存。即使运行了垃圾回收程序,也只会将内存还给虚拟机VM,而不是还给操作系统。结果是:Java程序会用光给它们的所有堆,从不释放。由于要保存实时(Just In Time,JIT)编译器产生的代码,Java程序的大小有时可能会膨胀为最大堆的数倍之巨。
还有一个问题,情况与此类似。从连接池分配一个数据库连接,而无法将已分配的连接还回给连接池。一些连接池有活动计时器,在维持一段时间的静止状态之后,计时器会释放掉数据库连接,但这不足以缓解糟糕的代码快速泄漏数据库连接所造成的资源浪费。
进程缺乏文件描述符
如果已为一台Web服务器或其他关键进程分配了文件描述符,但它却需要更多的文件描述符,则服务器或进程会被挂起或报错,直至得到了所需的文件描述符为止。文件描述符用来保持对开放文件和开放套接字的跟踪记录,开放文件和开放套接字是Web服务器很关键的组成部分,其任务是将文件复制到网络连接。默认时,大多数shell有64个文件描述符,这意味着每个从shell启动的进程可以同时打开64个文件和网络连接。大多数shell都有一个内嵌的ulimit命令可以增加文件描述符的数目。
线程死锁
由多线程带来的性能改善是以可靠性为代价的,主要是因为这样有可能产生线程死锁。线程死锁时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源。我们来想像这样一种情形:在人行道上两个人迎面相遇,为了给对方让道,两人同时向一侧迈出一步,双方无法通过,又同时向另一侧迈出一步,这样还是无法通过。双方都以同样的迈步方式堵住了对方的去路。假设这种情况一直持续下去,这样就不难理解为何会发生死锁现象了。
解决死锁没有简单的方法,这是因为使线程产生这种问题是很具体的情况,而且往往有很高的负载。大多数软件测试产生不了足够多的负载,所以不可能暴露所有的线程错误。在每一种使用线程的语言中都存在线程死锁问题。由于使用Java进行线程编程比使用C容易,所以Java程序员中使用线程的人数更多,线程死锁也就越来越普遍了。可以在Java代码中增加同步关键字的使用,这样可以减少死锁,但这样做也会影响性能。如果负载过重,数据库内部也有可能发生死锁。
如果程序使用了永久锁,比如锁文件,而且程序结束时没有解除锁状态,则其他进程可能无法使用这种类型的锁,既不能上锁,也不能解除锁。这会进一步导致系统不能正常工作。这时必须手动地解锁。
服务器超载
Netscape Web服务器的每个连接都使用一个线程。Netscape Enterprise Web服务器会在线程用完后挂起,而不为已存在的连接提供任何服务。如果有一种负载分布机制可以检测到服务器没有响应,则该服务器上的负载就可以分布到其它的Web服务器上,这可能会致使这些服务器一个接一个地用光所有的线程。这样一来,整个服务器组都会被挂起。操作系统级别可能还在不断地接收新的连接,而应用程序(Web服务器)却无法为这些连接提供服务。用户可以在浏览器状态行上看到connected(已连接)的提示消息,但这以后什么也不会发生。
解决问题的一种方法是将obj.conf参数RqThrottle的值设置为线程数目之下的某个数值,这样如果越过RqThrottle的值,就不会接收新的连接。那些不能连接的服务器将会停止工作,而连接上的服务器的响应速度则会变慢,但至少已连接的服务器不会被挂起。这时,文件描述符至少应当被设置为与线程的数目相同的数值,否则,文件描述符将成为一个瓶颈。
数据库中的临时表不够用
许多数据库的临时表(cursor)数目都是固定的,临时表即保留查询结果的内存区域。在临时表中的数据都被读取后,临时表便会被释放,但大量同时进行的查询可能耗尽数目固定的所有临时表。这时,其他的查询就需要列队等候,直到有临时表被释放时才能再继续运行。
这是一个不容易被程序员发觉的问题,但会在负载测试时显露出来。但可能对于数据库管理员(DataBase Administrator,DBA)来说,这个问题十分明显。
此外,还存在一些其他问题:设置的表空间不够用、序号限制太低,这些都会导致表溢出错误。这些问题表明了一个好的DBA对用于生产的数据库设置和性能进行定期检查的重要性。而且,大多数数据库厂商也提供了监控和建模工具以帮助解决这些问题。
另外,还有许多因素也极有可能导致Web站点无法工作。如:相关性、子网流量超载、糟糕的设备驱动程序、硬件故障、包括错误文件的通配符、无意间锁住了关键的表。 -
too many sleep connections to handle (二)
2008-04-02 22:41:42
摘抄:
在项目应用部署中却频繁出现的问题。
这些问题都有很多比较明显的共同点,也大多集中在如下情况中:
(1)连接池和数据库服务器,表现为大量sleeping connection未释放
(2)应用程序获取的连接为stale connection(无效连接)
(3)数据库服务器重起后,应用服务器也需要重起
在应用部署过程中,为了在获取尽可能高效的数据库连接处理,采用应用服务器的连接池,这是个正确的选择。几乎所有的项目组都会这么做,而且配置和应用也都没有什么难度。—— 但是很不幸运,正是很多人所寄予厚望的应用服务器连接池,却很容易忽悠大家,在系统运行运行一段时间后,会毫无情面的抛出获取连接超时、失败,或者报告这是一个无效的连接······等等匪夷所思的问题。
正是 连接池的“池缓存”的功能,让数据库连接能够高效的利用;但也正是“池缓存”的功能,让这些问题不断的暴露出来,正所谓“成也萧何,败也萧何”。
因为在池中缓冲的那些“Connection”,有很多是刚刚被Client端释放,但是连接池本身来却没有去close它们,而是依然“维持”连接,以期等待后续其他Client的请求。—— 但是就是这么一段可能并不长的时间,却有着很多潜在的危险:此时网络有一定的不稳定,池中原本与数据库保持连接的Connection,却因此而中断了通讯——但是此时连接池依然以为这个一个有效的Connection返回给了Client······结果大家可想而知。
真实的原因可能比这更加复杂,也更多种情况,也因此就造成了上面那些种异常的发生。
其实,解决这些异常,本身不是很难,而且几乎当前所有的应用服务器连接池都提供了支持,甚至包括很多开源的连接池组件,比如Apache DBCP。
解决诸如此类连接池异常问题,把握如下两个关键点即可:
(1)打开应用服务器连接池的“续连接支持开关”,就是说,在把池中的Connection对象返给Client端的时候(或从Client端回收的时候)做一次有效性验证,以确定这是一个有效连接。
(2)打开连接池的无效连接定期回收机制,就是说,让连接池每经过一段时间,就对连接池中的那些已经无效的连接进行回收。(但切记,这样的回收操作尽量不要过于频繁)
下面就拿Weblogic和WebShpere两款应用服务来说明,如何设置它们连接池的“续连接”和“回收”机制
(一)WebLogic Application Server
(1)weblogic的连接验证设置:
WLS里设置连接的检查,一个是获取连接的时候检查该连接是否有效,另外一个就是释放连接的时候检查。这两个检查在配置连接池的时候都是可以设置的。
TestConnectionsOnReserve 从连接池获取连接后是否进行有效性测试 True/false
RefreshMinutes parameter 设定connection pool的刷新时间 刷新的时间间隔
Test Table Name 测试的表名,也可以指定SQL 表名或者是SQL
(2)weblogic的无效连接回收时间设置:
通过设置weblogic-ra.xml中的inactive-connection-timeout-seconds,weblogic连接池会根据设置,主动关闭那些超时idle的connection。关于weblogic-ra.xm的文档如下:
http://e-docs.bea.com/wls/docs81/jconnector/dtdappen.html#1031211
(二)Webshpere Application Server
(1)首先需要通过修改配置文件来启动预连接测试功能。主要是修改$WAS_HOME/properties/j2c.properties 配置文件,修改后重新启动服务器。
修改advanced-connection-properties 元素,jdbc/DataSource应替换为用户的数据源的JNDI名称。
testConnection必须设为true,以表明用户启动预连接测试功能。
testConnectionRetryInterval为预连接测试失败后重试间隔的秒数。
(2)其次需要配置预连接测试语句:
WebSphere的管理控制台,定位Resources > JDBC_provider > Data Sources > data_source > Custom Properties 。
新建一个用户属性,指定 preTestSQLString (大小写敏感) 作为属性名,指定要测试的SQL语句作为属性值。
注:这条SQL语句是用来检查连接是否有效的,必须用有效的SQL语句,并且需要执行速度最快,占用资源最少。每次用户发出数据库连接请求时WebSphere会先调用这条语句做连接尝试。DB2数据库用户可以选择SELECT 1 FROM SYSIBM.SYSDUMMY1 。Oracle用户可以选择SELECT USER FROM DUAL作为测试连接语句。
但是,在应用过程中,不代表所有的应用连接池部署都需要开启“续连接”或“回收”,这是因为,续连接回造成每次获取连接的时间会无形的增加,而“回收”操作则会比较占用资源,如果过于频繁,则影响了系统响应效率。
所以,这两项连接池的服务,是否一定需要开启,则要根据应用特点来分别对待了。 -
TOP详解(摘抄)
2008-04-02 22:11:20
01:06:48当前时间
up 1:22系统运行时间,格式为时:分
1 user当前登录用户数
load average: 0.06, 0.60, 0.48系统负载,即任务队列的平均长度。
三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。Tasks: 29 total进程总数
1 running正在运行的进程数
28 sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数(stop模式:与sleep进程应区别,sleep会主动放弃cpu,而stop是被动放弃cpu ,例单步跟踪,stop(暂停)的进程是无法自己回到运行状态的)
Cpu(s): 0.3% us用户空间占用CPU百分比
1.0% sy内核空间占用CPU百分比
0.0% ni用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id空闲CPU百分比
0.0% wa等待输入输出的CPU时间百分比
0.0% hi
0.0% siMem: 191272k total物理内存总量
173656k used使用的物理内存总量
17616k free空闲内存总量
22052k buffers用作内核缓存的内存量
Swap: 192772k total交换区总量
0k used使用的交换区总量
192772k free空闲交换区总量
123988k cached缓冲的交换区总量。
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小。
相应的内存再次被换出时可不必再对交换区写入。序号列名含义
aPID进程id
bPPID父进程id
cRUSERReal user name
dUID进程所有者的用户id
eUSER进程所有者的用户名
fGROUP进程所有者的组名
gTTY启动进程的终端名。不是从终端启动的进程则显示为 ?
hPR优先级
iNInice值。负值表示高优先级,正值表示低优先级
jP最后使用的CPU,仅在多CPU环境下有意义
k%CPU上次更新到现在的CPU时间占用百分比
lTIME进程使用的CPU时间总计,单位秒
mTIME+进程使用的CPU时间总计,单位1/100秒
n%MEM进程使用的物理内存百分比
oVIRT进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
pSWAP进程使用的虚拟内存中,被换出的大小,单位kb。
qRES进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
rCODE可执行代码占用的物理内存大小,单位kb
sDATA可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
tSHR共享内存大小,单位kb
unFLT页面错误次数
vnDRT最后一次写入到现在,被修改过的页面数。
wS进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
xCOMMAND命令名/命令行
yWCHAN若该进程在睡眠,则显示睡眠中的系统函数名
zFlags任务标志,参考 sched.h -
too many sleep connection in mysql
2008-04-01 22:58:30
结合netstat和awk命令来统计网络连接数
From: http://hi.baidu.com/thinkinginlamp/blog/item/afbcab64b1ad81f3f6365453.htmlnetstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
会得到类似下面的结果,具体数字会有所不同:
LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
下面解释一下为啥要这样写:
一个简单的管道符连接了netstat和awk命令。
------------------------------------------------------------------
先来看看netstat:
netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
------------------------------------------------------------------
再来看看awk:
/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。state[]
相当于定义了一个名叫state的数组NF
表示记录的字段数,如上所示的记录,NF等于6$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAITstate[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一END
表示在最后阶段要执行的命令for(key in state)
遍历数组print key,"\t",state[key]
打印数组的键和值,中间用\t制表符分割,美化一下。如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vim /etc/sysctl.conf
编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行/sbin/sysctl -p
让参数生效。net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间下面附上TIME_WAIT状态的意义:
客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。TIME_WAIT 并不会占用很大资源的,除非受到攻击。
还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态
标题搜索
我的存档
数据统计
- 访问量: 59762
- 日志数: 56
- 建立时间: 2007-07-31
- 更新时间: 2012-12-18