发布新日志

  • chrome 最小的字体

    2011-02-16 11:11:58

    chrome 下的字体不能小于12

    所以

    设置小于12大小的字体不起作用

    导致页面错乱

  • Httpload小解

    2011-02-05 19:37:07

    测试网站每秒所能承受的平均访问量(吞吐量)
    http_load -parallel 5 -fetches 1000 urls.txt
    这段命令行是同时使用5个进程,随机访问urls.txt中的网址列表,总共访问1000次。运行之后的结果:
    1000 fetches, 5 max parallel, 6e+06 bytes, in 58.1026 seconds
    6000 mean bytes/connection
    17.2109 fetches/sec, 103266 bytes/sec
    msecs/connect: 0.403263 mean, 68.603 max, 0.194 min
    msecs/first-response: 284.133 mean, 5410.13 max, 55.735 min
    HTTP response codes:
    code 200 — 1000
    从上面的运行结果来看,目标网站仅仅能够承受每秒17次访问,不够强壮。
    测试网站是否能承受住预期的访问压力(
    http_load -rate 2 -seconds 300 urls.txt
    在300秒内保持一定的频率访问目标url。
    注:
    urls.txt保存要访问的url列表,每行一个
    不要测试上线之后的网站,压垮了可不好玩
    例如:
    1.http_load -parallel 5 -fetches 1000 urls.txt
    2.http_load -rate 2 -seconds 300 urls.txt
    3. http_load -p 30 -s 60 urllist.txt
    4. http_load -parallel 50 -s 10 urls.txt
    这段命令行是同时使用50个进程,随机访问urls.txt中的网址列表,总共访问10秒。

    参数说明:
    -parallel 简写-p :含义是并发的用户进程数。
    -fetches 简写-f :含义是总计的访问次数
    -rate 简写-r :含义是每秒的访问频率
    -seconds简写-s :含义是总计的访问时间
    参数是可以自由组合的,参数之间的选择并没有什么限制。
    urls.txt保存要访问的url列表,
    url 是你要访问的网址名,参数可以是单个的网址也可以是包含网址的文件。 文件格式是每行一个URL,URL最好超过50-100个测试效果比较好. 文件格式如下
    http://iceskysl.1sters.com/?action=show&id=336
    http://iceskysl.1sters.com/?action=show&id=335
    http://iceskysl.1sters.com/?action=show&id=332
    http://iceskysl.1sters.com/?action=show&id=32
    参数了解了,我们来运行一条命令, 来看看它的返回结果
    命令:% ./http_load -rate 5 -seconds 10 urls
    命令解释: 执行一个持续时间为10秒的测试,每秒的访问频率为5次。
    49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
    5916 mean bytes/connection
    4.89274 fetches/sec, 28945.5 bytes/sec (重要性能指标吞吐量)
    msecs/connect: 28.8932 mean, 44.243 max, 24.488 min(重要指标响应时间)
    msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
    HTTP response codes:
    code 200 — 49
    结果分析:
    1.49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
    说明在上面的测试中运行了49个请求,最大的并发进程数是2,总计传输的数据是289884bytes,运行的时间是10.0148秒
    2.5916 mean bytes/connection
    说明每一连接平均传输的数据量289884/49=5916
    3.4.89274 fetches/sec, 28945.5 bytes/sec (吞吐量: 单位时间完成请求数)
    说明每秒的响应请求为4.89274,每秒传递的数据为28945.5 bytes/sec
    这个值得是根据 49 fetches / 10.0148 seconds 秒计算出来的
    4.msecs/connect: 28.8932 mean, 44.243 max, 24.488 min (响应时间: 每次请求需要的时间, 平均, 最大, 最小)
    说明每连接的平均响应时间是28.8932 msecs,最大的响应时间44.243 msecs,最小的响应时间24.488 msecs
    5.msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
    6、HTTP response codes: code 200 — 49
    说明打开响应页面的类型,如果403的类型过多,那可能要注意是否系统遇到了瓶颈。
    特殊说明:这里,我们一般会关注到的指标是fetches/sec、msecs/connect
    他们分别对应的常用性能指标参数
    Qpt-每秒响应用户数和response time,每连接响应用户时间。
    测试的结果主要也是看这两个值。
    当 然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的cpu、memory进行分析,才能得出结论,另外,测试结果中主要的指标是 fetches/sec 这个选项,即服务器每秒能够响应的查询次数,用这个指标来衡量性能。似乎比 apache的ab准确率要高一些,也更有说服力一些。

    http_load测试参数比较
    ./http_load -parallel 200 -seconds 10 urls
    按照固定时间来结束测试,这样可以比较相同时间内被测服务器的响应速度.
    ./http_load -parallel 200 -fetches 1000 urls
    按照固定申请数来测试,这样可以比较相同访问量下返回的响应速度.
    虽然两者都可以获取到服务器的响应速度
    但是使用fetches更容易让被测服务器收到压力
    由于seconds控制测试时间,很有可能在短时间内测试客户端并没有发起足够数量的请求
    而服务端在收到足够压力之前,测试就已经结束了.
    有一些情况,诸如内存泄漏以及资源回收不利或者对后面的响应速度越来越慢等情况
    在这种测试条件下不容易发生
    而使用fetchs,能够让客户端保证确定请求数的全部处理.
    使用时间作为控制参数
    会由于测试人员不够耐心而人为将seconds参数设置过小
    导致测试结果失去意义
    所以,最后建议使用fetches作为测试参数.用以作为基准进行比较
  • 没有深究带来的恶果

    2011-01-18 10:46:10

    现象是在IE下,字显示为白色

    原因是

    代码没有闭合

    我的那个天啊

    其实之前是看到这个现象了,只是有时能出现,有时又出现不了

    都是我的错

    每次都这样大呼呼的



    +                      </span>

  • ping all links

    2010-12-15 10:46:43

    这个问题我真不该犯啊

    测试中还用这个工具检查了一下呢

    可是上线就出问题了

    这是不该啊

    ----

    开发说是笔误

    可是,我能怨人家么

    不能

    ======

    回归测试还是蛮重要的撒。


    555555555555555555


    ping all links 是ff下的检测页面链接的快速工具,可以有效的检测页面多链接的地址是否正确,起码不报404.!

    要是由于页面多,而忘掉一部分的话,更应该列个表格出来。画个对号。

  • 分布式查询

    2010-12-03 18:14:22

    pkill -9 -f mail_sender.php

    senderid=0
    while [ $senderid -lt 10 ]
    do
    php mail_sender.php -c 10 -i $senderid &
    echo $senderid
    sleep 3
    senderid=$(( $senderid + 1 ))
    done


    ---start.sh
  • 联表查询

    2010-11-29 17:44:10

    select a.* from t_usergroup as a,t_mapping_user_usergroup as b where a.pk_usergroup=b.fk_usergroup and b.fk_user = 2828818;

    适用于user多种身份的查询

  • CMMI3

    2010-03-25 11:18:53

    这以下五个方面做保证:
    1、 执行约定:组织保证过程得以建立和继续起作用所必须采取的行动。包含制定组织的方针和规定管理者的支持。
    2、 执行能力:为了能实施软件过程,项目或组织中必须存在的先决条件。一般包括资源、组织结构、培训。
    3、 执行的活动:为实现一个关键过程域所必须的角色和规程。包括制定计划和规程,执行和跟踪,并在需要时采取纠正措施。
    4、 测量和分析:对过程进行测量和对过程测量结果进行分析的需要。一般包括为了确定所执行活动的状态和有效性所能采用的测量的例子。
    5、 验证实施:能保证遵照已建立的过程进行活动的措施。一般包括管理和软件质量保证部门所作的过程审计和评审。
  • mysql 导出导入数据库

    2010-01-01 13:24:13

  • 用Shell脚本获取CPU拓扑关系

    2009-12-17 17:46:54

     准确说这不是一个问题,因为地球人都知道cat /proc/cpuinfo获取CPU信息。但是,你能从那一大片输出里面立马看出来是多个物理CPU呢,还是多核呢,还是超线程之类的东东么?

            本文给出一个脚本,通过分析proc来给出一个清晰的答案,本人写的脚本通用性可能比较差,大家根据情况进行修改,基本上在偶这里没啥问题。

    先说点基础:
    /proc/cpuinfo里面:
    processor表示逻辑CPU号(核或线程)
    core id表示CPU核号
    physical id表示物理CPU号

    脚本如下:


    cpu_p=`cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
    cpu_c=`cat /proc/cpuinfo | grep "core id" | uniq | wc -l`
    cpu_l=`cat /proc/cpuinfo | grep "processor" | wc -l`

    c_p=`expr $cpu_c / $cpu_p`
    l_p=`expr $cpu_l / $cpu_p`
    t_c=`expr $cpu_l / $cpu_c`

    echo "Physical CPU Count: $cpu_p"
    echo "CPU Core Count   : $cpu_c"
    echo "Logical CPU Count: $cpu_l"

    echo "$c_p cores per physical CPU"
    echo "$l_p logical CPUs per physical CPU"
    echo "$t_c threads per core"

    if [ $c_p -eq 1 ]; then
      echo "Your CPU is unicore"
    else
      echo "Your CPU is multicore"
    fi

    if [ $t_c -eq 1 ]; then
      echo "Your CPU isn't of HT"
    else
      echo "Your CPU is of HT"
    fi

    echo "You have $cpu_p CPUs, each CPU has $c_p cores, each core has $t_c threads. In summary $cpu_c cores, $cpu_l threads."


    运行结果:

    ./cpu
    Physical CPU Count: 1
    CPU Core Count   : 2
    Logical CPU Count: 2
    2 cores per physical CPU
    2 logical CPUs per physical CPU
    1 threads per core
    Your CPU is multicore
    Your CPU isn't of HT
    You have 1 CPUs, each CPU has 2 cores, each core has 1 threads. In summary 2 cores, 2 threads


  • PHP初级程序员面试题及答案

    2009-12-05 01:51:22

    面试题1
    1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21
    2、echo(),print(),print_r()的区别
    3、能够使HTML和PHP分离开使用的模板
    4、如何实现PHP、JSP交互?
    5、使用哪些工具进行版本控制?
    6、如何实现字符串翻转?
    7、优化MYSQL数据库的方法。
    8、谈谈事务处理
    9、apache+mysql+php实现最大负载的方法
    10、实现中文字串截取无乱码的方法。

    答案:

    1.echo date('Y-m-d H:i:s', strtotime('-1 day'));

    2.echo是语言结构,无返回值;print功能和echo基本相同,不同的是print是函数,有返回值;print_r是递归打印,用于输出数组对象

    3.so much,其实PHP本身就是一种模版引擎,我用过的是smarty,常见的还有PHPLib,FastTemplate,Savant这里有个模板引擎列表:http://www.sitepoint.com/forums/showthread.php?t=123769

    4.题目有点含糊不清,SOAP,XML_RPC,Socket function,CURL都可以实现这些,如果是考PHP和Java的整合,PHP内置了这种机制(如果考PHP和.NET的整合,也可以这么回答),例如$foo = new Java('java.lang.System');

    5.CVS和SVN,SVN号称下一代CVS,功能强大,不过CVS是老牌,市占率很高.我一直用SVN,题目是问用什么工具,呃,这个可能需要这么回答:CVS Server on Apache作服务端,WinCVS作客户端;Subversion on Apache/DAV 做服务端,TortoiseSVN做客户端,或者Subclipse做客户端.

    6.用strrev函数呗,不准用PHP内置的就自己写:
    function strrev($str)
    {
    $len=strlen($str);
    $newstr = '';
    for($i=$len;$i>=0;$i--)
    {
    $newstr .= $str{$i};
    }
    return $newstr;
    }

    7.高考政治题,把你知道的知识点都写上吧.我的答案:
    (1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率
    (2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master
    (3).(1)和(2)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引
    (4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句
    (5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) ... where article_id = ? 就可以了,不要先select * ... where article_id = ?然后msql_num_rows.
    只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update ... set title = ? where article_id = ?不要set content = ?(大文本)
    (6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度.

    8.如同是个编程语言都会有答应Hello World的例子一样,是本数据库的教材都会讲A给B的账户转账50美元的例子,回答这个就好了.不过据我所知,用MySQL的企业,很少用MySQL来实现事务处理.何况现在Oracle收购了InnoDB的公司.

    9.参见第七题的答案,那个地方搞好了这个问题就迎刃而解了.

    10.哈哈哈,我猜出题的人是不是被substr的中文处理问题烦恼很久了,是不是还用了网上流传的用正则匹配中文字符然后截取的函数,其实,有非常简单的解决方法:mb_substr()


    附一位PHPer读后感:
    1. 这题嘛,查PHP手册时间函数的用法 (面试官赞许的点点头)
    2. 这个是基本函数, 确实是要会的. 主要是ECHO效率比PRINT高, 因为PRINT要返回值, ECHO不用.
    3. 这个是要会的, 至少要在思想上理解. 倒不一定非要会SMARTY. (可笑当初我面试时还在大谈如何如何不喜欢SMARTY, SMARTY如何如何不好, 面试官问我说如果我必须要用SMARTY怎么办, 吓得我连忙说那我会努力学)
    4. 没被问到过.
    5. 这个也是要了解的, 至少知道个名字.
    6. 这个如果真的问到那我多半是要自己写了. (我个人一直很反感考PHP的函数, 我要都能记得住, 那还要PHP手册和GOOGLE来有什么用.)
    7. 这个,,,这个, 要我写论文还是写书啊...
    8. 没什么好谈的.
    9. 缓存, 数据库优化, LOAD BALANCE (这个中文是叫负载均衡吧.)
    10. 不在中国, 不用考虑.

  • linux下的计划任务--crontab命令简介

    2009-12-05 00:52:51

    简介
    crontab-操作每个用户的守护程序和该执行的时间表。
    作者 Matthew Dillon .
    部分参数说明
    crontab file [-u user]-用指定的文件替代目前的crontab。
    crontab-[-u user]-用标准输入替代目前的crontab.
    crontab-1[user]-列出用户目前的crontab.
    crontab-e[user]-编辑用户目前的crontab.
    crontab-d[user]-删除用户目前的crontab.
    crontab-c dir- 指定crontab的目录。
    crontab文件的格式:M H D m d cmd.
    M: 分钟(0-59)。
    H:小时(0-23)。
    D:天(1-31)。
    m: 月(1-12)。
    d: 一星期内的天(0~6,0为星期天)。
    cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量。
    下面是一个例子文件:
    #MIN HOUR DAY MONTH DAYOFWEEK COMMAND
    #每天早上6点
    106* * * date

    #每两个小时
    0*/2* * * date

    #晚上11点到早上8点之间每两个小时,早上部点
    0 23-7/2,8* * * date

    #每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
    0 11 4* mon-wed date

    #1月份日早上4点
    0 4 1 jan* date
    范例
    lark:~>crontab-1 列出用户目前的crontab.
    #MIN HOUR DAY MONTH DAYOFWEEK COMMAND
    10 6* * * date
    0*/2* * * date
    0 23-7/2,8 * * * date
  • 内存快照--vmstat和iostat的具体用法

    2009-12-04 23:45:02

    此文讲解vmstat和iostat的具体用法,以及通过这个用法如果快速诊断系统故障,进而优化系统 

    正文:

    用vmstat监视内存使用情况

      vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

      vmstat的语法如下:


      vmstat [-V] [-n] [delay [count]]


      其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。

      用iostat监视I/O子系统情况

      iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

      iostat的语法如下:


    iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]


      其中,-c为汇报CPU的使用情况;-d为汇报磁盘的使用情况;-k表示每秒按kilobytes字节显示数据;-t为打印汇报的时间;-v表示打印出版本信息和用法;-x device指定要统计的设备名称,默认为所有的设备;interval指每次统计间隔的时间;count指按照这个时间间隔统计的次数。

      iostat一般的输出格式如下:

    Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日

    avg-cpu: %user %nice %sys %idle
    4.81 0.01 1.03 94.15

    Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    dev3-0 30.31 1117.68 846.52 16104536 12197374
    dev3-1 7.06 229.61 40.40 3308486 582080
    对于输出中各字段的含义,iostat的帮助中有详细的说明。

    vmstat 命令报告虚拟内存统计信息和CPU负荷:页面调度,交换,任务交换,CPU利用率。命令的语法是:
    vmstat [-cisS] [d1 d2 d3 d4] [interval [count]]
    当不用选项时,vmstat显示一条曲线表示自从系统启动后活动的信息。如果指定interval(时间间隔),接下来的线是重复显示最后的interval期间活动的情况,直到用户中断命令执行。当同时提供计数器时,统计信息按时间计数来显示。
    如果指定了一个磁盘名(如d1,d2,等等。),这些磁盘得到优先显示。通常,系统上的前4个磁盘设备是显示的,因为只有四个设备能在一线条上显示,这个选项允许性能分析员修改缺省显示选项。(*磁盘名通常随id,sd,xd,或xy (取决于类型和I/0界面)加一个数字,如id0,sd2,xd1等等命名而定。),vmstat 命令显示若干字段信息:

    procs 报表下面三种状态的进程数:
    r--在运行队列中等候运行
    b--被资源阻塞(I/0,页面调度,等等.)
    w--可运行但是被换出的
    memory 报告虚拟内存和实存信息:
    swap--以千字节为单位的当前可用交换空间的数量
    free--以千字节为单位的页自由表大小
    page 报告每秒页面调度活动数量的信息:
    re-从自由表回收页
    mf--次要的错误;地址空间或硬件地址转换错误
    pi--页入的千字节数
    po -页出的千字节数
    fr- 释放的千字节数
    de--以千字节为单位的可接受的短期内存不足数
    sr--页由时钟算法扫描
    disk 可以为四个磁盘报告每秒磁盘I/O的数量

    faults 报告每秒系统软件中断和硬件中断的速率
    in-设备中断,不包括系统时钟中断
    sy-系统调用
    cs-CPU任务(上下文)交换
    cpu-- CPU故障时间的百分比,在多处理器系统上,这是全部处理器的平均值:
    us- 用户时间
    sy-- 系统时间
    id-- 闲置时间

    vmstat命令有四个可选标志可供使用。如果机器有虚拟地址缓存-c标志就改变输出报告缓存刷新统计数据。报告包括自从系统启动后每种缓存刷新全部总量。六个缓存类型是用户,上下文,区域,段,页,部分页。
    -i标志 使输出变为报告中断的数量。如果给出设备名,如d1,d2等,监控将在设备级*执行,(*注,参阅第十二章有关打开设备级监控的信息。)并报告每个给定设备的统计信息。

    修改"普通"报告来显示交换而非页面调度活动的信息。这选项改变显示的两个字段:si(换入)和so(换出)替代了re和mf字段。

    值得注意是,interval 和count选项对-i或-s选项是非法的。


    vmstat 参数详解

    procs:

    r-->在运行队列中等待的进程数
    b-->在等待io的进程数
    w-->可以进入运行队列但被替换的进程

    memoy

    swap-->现时可用的交换内存(k表示)
    free-->空闲的内存(k表示)


    pages

    re--》回收的页面
    mf--》非严重错误的页面
    pi--》进入页面数(k表示)
    po--》出页面数(k表示)
    fr--》空余的页面数(k表示)
    de--》提前读入的页面中的未命中数
    sr--》通过时钟算法扫描的页面

    disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号

    fault 显示每秒的中断数
    in--》设备中断
    sy--》系统中断
    cy--》cpu交换

    cpu 表示cpu的使用状态

    cs--》用户进程使用的时间
    sy--》系统进程使用的时间
    id--》cpu空闲的时间


    FIELD DESCRIPTIONS
    Procs
    r: The number of processes waiting for run time.
    b: The number of processes in uninterruptable sleep.
    w: The number of processes swapped out but otherwise runnable.

    Thisfield is calculated, but Linux never desperation swaps.

    Memory
    swpd: the amount of virtual memory used (kB).
    free: the amount of idle memory (kB).
    buff: the amount of memory used as buffers (kB).

    Swap
    si: Amount of memory swapped in from disk (kB/s). 虚拟内存的页导入(从SWAP DISK导入RAM)
    so: Amount of memory swapped to disk (kB/s). 虚拟内存的页导出.
    (从RAM到SWAP DISK)

    IO
    bi: Blocks sent to a block device (blocks/s).写入
    bo: Blocks received from a block device (blocks/s).写出

    System
    in: The number of interrupts per second, including the clock.
    cs: The number of context switches per second.
    : CPU
    These are percentages of total CPU time.
    us: user time
    sy: system time
    id: idle time


    如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
    如果pi,po 长期不等于0,表示内存不足。
    如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。


    由vmstat看服务器


    说明:由于STATSPACK并不能获取全面分析性能问题所需要的所有信息,所以需要扩展其收集服务器的统计信息。

    VMSTAT介绍

    通过STATSPACK收集服务器信息,主要通过收集VMSTAT的信息来展现服务器状况。VMSTAT工具是最常见的UNIX监控工具,可以展现给定时间间隔的服务器的状态值。

    一般VMSTAT工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。如:
    [oracle@brucelau oracle]$ vmstat 1 2
    procs memory swap io system  CPU
    r b w swpd free buff cache  si so bi bo in cs us sy id
    1 0 0 0 271844 186052 255852 0 0 2 6 102 10 0 0 100
    0 0 0 0 271844 186052 255852 0 0 0 0 104 11 0 0 100

    (注:目前系统几乎空闲,并且不同操作系统VMSTAT输出内容有所不同)

    目前说来,对于服务器监控有用处的度量主要有:

    r(运行队列)
    pi(页导入)
    us(用户CPU)
    sy(系统CPU)
    id(空闲)

    通过VMSTAT识别CPU瓶颈

    r(运行队列)展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了。
    获得CPU个数的命令(LINUX环境):
    cat /proc/cpuinfo|grep processor|wc –l
    当r值超过了CPU个数,就会出现CPU瓶颈,解决办法大体几种:
    1. 最简单的就是增加CPU个数
    2. 通过调整任务执行时间,如大任务放到系统不繁忙的情况下进行执行,进尔平衡系统任务
    3. 调整已有任务的优先级

    通过VMSTAT识别CPU满负荷

    首先需要声明一点的是,vmstat中CPU的度量是百分比的。当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。但要注意的是,CPU满负荷工作并不能说明什么,UNIX总是试图要CPU尽可能的繁忙,使得任务的吞吐量最大化。唯一能够确定CPU瓶颈的还是r(运行队列)的值。

    通过VMSTAT识别RAM瓶颈

    数据库服务器都只有有限的RAM,出现内存争用现象是Oracle的常见问题。
    首先察看RAM的数量,命令如下(LINUX环境):
    [root@brucelau root]#free
    total used free shared buffers cached
    Mem: 1027348 873312 154036 185736 187496 293964
    -/+ buffers/cache: 391852 635496
    Swap: 2096440 0 2096440

    当然可以使用top等其他命令来显示RAM。

    当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,这样会出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,但页导入操作就表明了服务器需要更多的内存了,页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。

    解决的办法有几种:
    1. 最简单的,加大RAM
    2. 改小SGA,使得对RAM需求减少
    3. 减少RAM的需求(如:减少PGA)

    我们基本的了解了VMSTAT工作,下面是STATSPACK通过vmstat统计收集服务器性能数据。

    STATSPACK通过vmstat收集服务器信息
    首先在perfstat用户下建一个存储服务器信息的表:如
    建表:
    create table stats$vmstat
    (
    start_date date, --系统时间
    duration date, --时间间隔
    server_name varchar2(20), --服务器名称
    runque_waits number, --运行队列数据
    page_in number, --页导入数据
    page_out number, --页导出数据
    user_cpu number, --用户cpu数据
    system_cpu number, --系统cpu数据
    idle_cpu number, --空闲cpu数据
    wait_cpu number –等待cpu数据(只是aix存在)
    )
    tablespace perfstat;
    然后,通过UNIX/LINUX的shell变成,利用vmstat的结果来获取相应的服务器信息,并且存放到表中
  • MySQL数据的导出和导入-mysqldump

    2009-12-04 23:37:04

    MySQL环境变量设置,将%MySQL_HOME%下的MySQL Server 5.1\bin放到Path下。


    MySQL的mysqldump工具,基本用法是:
    shell> mysqldump [OPTIONS] database [tables]


    通过执行mysqldump --help,得到当前mysqldump版本支持的选项表。
    通过执行mysqldump –V,得到当前mysqldump版本。


    几个常用的例子(在mysqldump Ver 10.13 Distrib 5.1.30, for Win32 (ia32)下测试通过)
    1.导出整个数据库
    mysqldump -u 用户名 -p 数据库名 > 导出的文件名
    mysqldump -u root -p student >d:\student.sql


    2.导出一个数据库结构
    mysqldump -u root -p -d --add-drop-table student >d:\student_structure.sql
    -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table


    3.导出一个表
    mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
    mysqldump -u root -p schoolproject student>d:\schoolproject_student.sql


    4.导入数据库
    shell> mysqladmin –u root –p create target_db_name
    shell> mysql –u root –p target_db_name < backup-file.sql
    就是:shell> mysql 数据库名 < 文件名


    或者使用source 命令
    进入mysql数据库控制台,mysql -u root –p


    mysql>use 数据库
    然后使用source命令,后面参数为脚本文件(.sql文件)
    mysql>source d:\student.sql
  • 单元测试--phpunit 可否使用实务对单元测试方法的执行进行回滚?

    2009-11-15 15:47:16

    单元测试要求:单元测试方法并不真正去变更数据库,也就是说单元测试不依赖于数据库中的数据。那我们如何解决执行单元测试方法后,不变更数据库中数据呢?
      一般的解决方案有两种:
      1、 新建一个单元测试数据库,开发数据库与单元测试数据库分离,单元测试方法完全基于单元测试数据库。
      此中方法的优点是:开发人员在开发期间不会对单元测试数据库中数据进行变更,也就不会影响单元测试方法 在任何时间执行。
      缺点:单元测试数据库和开发数据库同步问题,特别是对迭代式开发项目,数据库是根据需求在不断地跟进或者变更,同步问题成为了单元测试正常运行的瓶颈。
      2、 使用事务对单元测试方法的执行进行回滚。
      此种方法的优点:解决了方法一中缺点,不会出现数据库结构不同步的问题。
      缺点:在进行CRUD(Create/Read/Update/Delete)操作时,需要在单元测试方法中进行一些插入数据操作,从而保证单元测试与开发数据库的独立,造成了单元测试工作量增加。
      在实际的项目中,可以根据需要选择符合自己的解决方案,如果数据库结构在项目进入开发阶段已经确定,并且以后不会有变动,建议采用第一种方案,否则建议第二种方案。目前我们项目采用第二中方案。
    一、NUnit事务性单元测试
      那使用Nunit框架如果保证数据的会滚呢?这里我们使用了COM+事务。
      即System.EnterpriseServices;
      具体如下:
    /// <summary>
        ///单元测试基类,所有单元测试类都需要继承此类
        /// </summary>
        [TestFixture]
        [Transaction(TransactionOption.Required)]
        public class DatabaseFixture:ServicedComponent
        {
            public DatabaseFixture()
            {
                //
                // TODO: Add constructor logic here
                //
            }
            [TearDown]
            public void TransactionTearDown()
            {
                if (ContextUtil.IsInTransaction)
                {
                    ContextUtil.SetAbort();
                }
            }
     
      所有的单元测试方法都需要继承与此类。比如:
      public class AddressSqlDAOTest : DatabaseFixture
     
     这样,单元测试方法执行完后,会继续执行DatabaseFixture类中的TransactionTearDown()方法。从而会滚之前的数据操
    作,单元测试方法也就不会影响开发数据库,同样开发数据库也不会影响单元测试方法的执行,从而保证了单元测试与数据库数据的独立。
    二、如何CRUD单元测试
      1、测试增加方法:判断返回的主键是否>0,如果主键>0 说明单元测试方法成功,否则失败
      2、测试查询方法:首先在执行单元测试类中的插入数据方法(不是被测试类中的插入方法,而是在单元测试类中写的插入方法,一定要区分开),然后执行查询方法。
      3、测试更新方法:首先在执行单元测试类中的插入数据方法,然后执行更新方法。
      4、测试删除方法:首先在执行单元测试类中的插入数据方法,然后执行删除方法。
    三、单元测试的命名规范
      为了便于后期单元测试方法的维护,建议如下命名单元测试类 和单元测试方法。
      单元测试类名:被测试类名称+Test
      单元测试方法名:被测试方法名称+Test
    四、总结
      至此,大家就可以利用Nunit中如何进行事务性单元测试已经完毕,相信大家也已经了解了如何让单元测试独立于数据库数据,从而更高效地进行单元测试,也不影响开发。

     不知道对于PHPunit来说,有没有第二种回复数据库操作的框架?这样,以后每次回归测试时,就不会因为CRUD对数据库的操作而重新编辑数据库。尤其是删除操作。
  • 薪水永远赶不上房价

    2009-11-11 23:00:58

    薪水永远赶不上房价


    可悲可叹啊


    只能跳槽么?



    中国的创业环境太艰难了


    zgzfbm


    那是赤裸裸的金钱啊



  • 验证码的时间戳观念

    2009-11-11 18:02:07

     

    验证码的好处:避免垃圾邮件、发贴机

    功能及现象描述:

    光标定在输入框时,请求needverfy函数,根据程序系统机制判断是否出验证码,以防灌水现象。 验证码每次出现都是一样的。导致输入验证码后,不能校验成功。 

    现象定位:

    每次请求****/isNeedVerfy函数时,由于链接一致,被浏览器cache住内容后,导致每次页面出现的验证码都是一样的。所以,最后的解决方案是加时间戳随机数。

    代码跟踪修改:

     

                  var callback = function(result){

                           if(true === result){

                                   $("div_verify").show();

    +                              var d = new Date();

                                   if($('verify_img')){

    -                                     var d = new Date();

                                          $('verify_img').src = "/verify/?"+d.getTime();

                                   }else{

                                          var img = document.createElement("img");

                                          img.id="verify_img";

    -                                  img.src = "/verify/";

    +                                  img.src = "/verify/?"+d.getTime();

                                       img.width = 140;

                                       img.height = 50;

                                       img.onclick=function(){var d=new Date();img.src="/verify/?"+d.getTime()};

    @@ -227,13 +227,13 @@

            

            refreshverify :function(){

    +              var d = new Date();

                   if($('verify_img')) {

    -                      var d = new Date();

                           $('verify_img').src = "/verify/?"+d.getTime();

                   }else{

                           var img = document.createElement("img");

                           img.id="verify_img";

    -                  img.src = "/verify/";

    +                  img.src = "/verify/?"+d.getTime();

                       img.width = 140;

                       img.height = 50;

                       img.onclick=function(){var d=new Date();img.src="/verify/?"+d.getTime()};

  • php中,搜索结果的分页测试

    2009-11-10 22:47:13

    关于php对于搜索结果的分页测试

    待续

  • 页面上传头像的测试

    2009-11-10 22:36:20

    算是测试技术吧

    大型网站关于会员自己头像自定义的测试:

    问题描述:有时可以成功的更换新的会员头像,有时候需要先更新为系统头像后,再上传新的自定义头像才可以成功。

    问题定位:每次上传新头像后,则清除线上的cache,以确保下次页面读取的时候是最新上传的会员头像。但是,由于线上采取的是主从数据库的原因,可能导致下次读取的时候,新的数据未能同步到这台服务器上,这样就造成了会员头像不能及时更新的问题。

  • 求租

    2008-03-27 10:27:48

    求租

    一室一厅一厨一卫、家电齐全、简装以上。中关村方圆5公里

    有效期30天

Open Toolbar