不一样的思想~~ http://shop34712791.taobao.com MSN:wins0910@hotmail.com

发布新日志

  • 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/awstats

    4.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 restat

    2.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: yes

    6.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]: &nbsp; Connect :
    LegendO[www]: &nbsp; 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,gauge

    end

    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
    hostname

    vim /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
    hostname

    vim /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
    hostname

    vim /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";
    }
    hostname

    vim /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
    hostname

    end

    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
    hostname

    8.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.cfg

    10.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.lst

    kernel /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.2

    version 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.c

    mod_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% si

    Mem: 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.html

    netstat -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_WAIT

    state[$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 状态

Open Toolbar