中文词条名:椽子
  英文词条名:jack timber rafter spar
  椽(chuán)子:它是屋面基层的最底层构件,垂直安放在檩木之上。
  屋面基层是承接屋面瓦作的木基础层,它由椽子、望板、飞椽、连檐、瓦口等构件所组成。
  房屋的木构架由柱、梁、檩、构架连接件和屋面基层等五部á分组成.
  现代混凝土坡屋面中多用洋瓦,即水泥瓦,椽子已不用。仅现于传统的木构建筑中。

椽子的本义,是承屋瓦的圆木放在檩上架着屋顶的木条。它是屋面基层的最底层构件,垂直安放在檩木之上,是屋面基层不可或缺的构件之一。我们常听说的笔大如椽,也足以证明椽子对于房子的重要性了。
  椽子所处的位置,所承担的责任,都决定了它必然得有一部分要裸露到房檐下,因而,也就有了出头的椽子。
  出头的椽子抛头露面,缺乏保护层,很易受风吹雨淋!日久经化学及物理作用则会逐渐地变烂。也就是说,房子上的椽子只要露出头,就容易遭到风雨的侵蚀,因此先烂掉也就不可避免。
  也许是受了杜甫有名诗句“射人先射马,擒贼先擒王”的启发吧,后来也不知是哪个聪明人就演绎出一个推论:“出头的椽子先烂”。毋庸讳言,这句话生动地反映了客观世界中的一个客观事实,更折射出了一些道理。对此常伸手涉足屋檐下的大雨小雨们,可能理解感受得更深刻。君不见,一年四季,风吹雨淋,年复一年,日久天长,出头的椽子先烂是自然而然的了。在客观世界中,类似的事情很多,人们已经司空见惯。
  出头的椽子先烂,字面上是自然现象的反映,其所含的哲理意义则是告诫人们先出头的人先遭受挫折,不可贪一时痛快而贸然地强出风头,去遭受风险,要夹着尾巴做人。这句话,似乎无时无刻不在提醒我们要压抑自己、小看自己。所以,尽管对椽子的价值心知肚明,对做椽子向往日久,但出头的椽子,通常没人敢轻易去做。
  在社会生活中出头的椽子先烂这类事情也是屡见不鲜。一些人在工作、学习中或多或少地都会尝到“出头的椽子先烂”的滋味儿,恐怕也都是受害者。我们只要观察下自己的周围,就会很容易地发觉,某些人因做事出色而受到上司的肯定和表扬奖励,这原本是一件旨意在引导发扬光大的好事,但事实上,却极其容易事与愿违,即这种表扬奖励常搞得那些人很尴尬,真是“小荷才露尖尖角,早有蜻蜓立上头”啊。本来蜻蜓是该站在荷上欣赏的,可是,那些别有用心的人却成了来践踏的蜻蜓。出头的椽子不但会被看成格格不入的怪异另类,风言风语、冷嘲热讽也必然会随之而来,甚至还会有人在嫉妒心的火攻下,肆意地颠倒黑白,不择手段地向受表扬的人施放冷枪毒箭、泼脏水儿等。结果导致为房子发挥自己应有作用的椽子们,奉献和付出得不到公正的待遇不算,还会被孤立甚至会被折断,然后再被咬牙切齿地抛弃扔掉。
  都说杀鸡给猴儿看,既然出头的椽子先烂,木秀于林风必摧之,枪打出头鸟,早起的鸟儿没有虫吃,出力不讨好,那么,大家就都不去做出头的椽子好了,不争先更不争第一吧。耳闻目睹过的人,谁也不愿意再出头,谁也不敢再出头,而只能是随大流得过且过了。可,建房子,就离不开椽子,而,是椽子就得出头,至少得有一部分下地狱的椽子,不管愿意与否,这是房子对椽子的根本要求。除非我们不去做那有风险的椽子,而事实上,椽子再有危险也得有人去承当,毕竟如无梁殿那样不需要椽子的建筑方式难以普及推广和延续。
  既然如此,那么出头椽子先烂这既不美观房子也不利于椽子延年益寿的现象,是否就不可救药地永远不能避免了呢?我看不是,其实,出头的椽子也不见得必然先烂,比方说,如果房子的管理者能从全局着眼,照顾到局部利益,采取相应保护措施,同时,椽子也能不断增强免疫力,做到打铁先得自身硬,那么,实现椽子的完好无损的目的,就绝对不是一个天方夜谭了。也就是说,管理者一定要看清楚这种出头椽子先烂背后的原因,在制度和机制上为出头椽子撑把伞,给出了头的优秀椽子涂上必要的防腐油漆,理直气壮地阻止和打击暴风骤雨的歪风邪气,全力真诚地支持和保护在一向积极履行职责的作风端正的椽子们。有了这些真诚强力的支持和保护,只要不是故意弄景的歪斜椽子,就肯定能挺直脊梁,继续与栋梁合力擎举一片片离不开它们支撑的屋顶。
  如果能够这样,绝对不会令椽子们抱着“为了房屋千万间,使我不得开心颜”的哀怨,最后伤心地腐烂了。
  用椽子之道如斯,用人之道有时也如斯。
SUN RPC是对socket的封装,其底层适用TCP或是UDP协议来传输数据,本文讨论SUN RPC使用的超时和重传策略。

1.       总超时值:一个客户端等待其服务器的应答的总时间量。TCP和UDP都是用该值;
2.       重试超时:只用于UDP, 是一个客户等待其服务器的应答期间每次重传请求的间隔时间;

注:因TCP是可靠的面向连接的协议,有自己的一套机制来保证端到端的传输可靠性,故使用TCP建立的应用不需要考虑超时重传等问题。


默认的超时时间可以通过clnt_control函数获取,

clnt = clnt_create (host, square_prog, square_vers, "udp");  

struct timeval tv;
clnt_control(clnt, CLGET_TIMEOUT, (char *)&tv);
printf("timeout = %d : timout = %d\n", tv.tv_sec, tv.tv_usec);
clnt_control(clnt, CLGET_RETRY_TIMEOUT, (char *)&tv);

printf("timeout = %d : timeout = %d\n", tv.tv_sec, tv.tv_usec);


其中,UDP的默认总超时值为-1,重传超时值为5s(unp书上说是15s);

      TCP的默认总超时值为0(unp书上说是30s);

      跟书上不同的地方应该是由于RPC的版本不同吧。
为了对这些数据进行验证,以square程序为例,通过改变clnt_call传递的TIMEOUT值及服务器端处理请求前的睡眠时间值,我做了几个实验:(超时值还可以通过clnt_control来指定,此时rpc_call忽略参数timeout)
1.       TIMEOUT = {2,0},服务器端睡眠10s,使用tcp协议;
现象:客户端2s后提示call failed: rpc: time out,服务器接收到一次请求。
   分析: 与期望相吻合,应用请求超过总的超时值时返回。  

2.       TIMEOUT = {2, 0}, 服务器端睡眠10s,使用udp协议;

现象:客户端5s后提示call failed: rpc: time out,服务器接收到一次请求。

分析:不明白,不是2s就提示超时么。
于是,我猜测是不是使用udp时,总的超时值不能小于重传时间呢?  
做如下试验:通过clnt_control将UDP的重试时间改成10s,TIMEOUT值不变,仍为2s。
现象:客户端10s后提示call failed: rpc: time out,服务器接收到一次请求。  
分析:我的猜测可能是正确的,RPC在实现时将总的超时值设为重传值和TIMEOUT中的较大值,不过这仅仅是猜测,没有看过SUN RPC实现的代码,不敢往下断言。
3.       TIMEOUT = {25, 0}, 服务器睡眠10s,使用tcp协议;
现象:客户端10s后收到应答,服务器收到一次请求。
分析:与期望相符合,整个请求没有超出总的超时值。
4.       TIMEOUT = {25, 0}, 服务器睡眠10s,使用udp协议;
现象:客户端在快到11s时收到一个回复,而服务器收到三次请求。
分析:
l  0s时,客户端启动后发送请求,服务器端接受该请求,处理时睡眠10s;
l   5s时,客户端重发请求,服务器端接受该请求,等待第一个请求处理完后。
l  10s时,客户端再次发送请求,服务器端接受该请求,等待前两次请求处理完.
不到1s后,客户端收到回复,这是服务器对第一个请求的应答,程序结束。
l  20s后,服务器端处理完第二个请求;
l  20s后,服务器端处理完第三个请求;
服务器睡眠10s就返回结果,为什么客户端会发出第三次请求?
因为网络延时,服务器从收到第一个请求,到睡眠10s,处理数据,返回结果时已经是10s之后的事情了,而客户端在10s时就发送了第三次请求,并马上收到了服务器对第一次请求的应答数据。
以上是我对SUN RPC超时和重传机制的一点理解,望不吝赐教!


来源:http://blog.chinaunix.net/u2/87570/showart_2201021.html
串行通信的传送速率用于说明数据传送的快慢,波特率表示串行通信时每秒钟传送“位” 的数目,比如1秒钟传送1位,就是1波特。即1波特=1bps (位/秒)
  串行通信常用的标准波特率在RS-232C标准中已有规定,如波特率为600、1200、2400、4800、9600、19200等等。 假若数据传送速率为120字符/秒,而每一个字符帧已规定为10个数据位,则传输速率为120×10=1200位/秒,即波特率为1200,每一位数据传送的时间为波特率的倒数:
  T=1÷1200=0.833ms
——司马懿和曹操的智谋大比拼阅读全文
asctime(将时间和日期以字符串格式表示)阅读全文
bogon:/home/jackxiang # man fd_set  看到了select的用法,贴了下代码如下:
select.cpp
      #include <stdio.h>
       #include <stdlib.h>
       #include <sys/time.h>
       #include <sys/types.h>
       #include <unistd.h>

       int
       main(void)
       {
           fd_set rfds;
           struct timeval tv;
           int retval;

           /* Watch stdin (fd 0) to see when it has input. */
           FD_ZERO(&rfds);
           FD_SET(0, &rfds);

           /* Wait up to five seconds. */
           tv.tv_sec = 5;
           tv.tv_usec = 0;

           retval = select(1, &rfds, NULL, NULL, &tv);
           /* Don't rely on the value of tv now! */

           if (retval == -1)
               perror("select()");
           else if (retval)
               printf("Data is available now.\n");
               /* FD_ISSET(0, &rfds) will be true. */
           else
               printf("No data within five seconds.\n");

           exit(EXIT_SUCCESS);
       }

g++ select.c

bogon:/home/jackxiang/com/com118 # ./a.out
dir
Data is available now.
bogon:/home/jackxiang/com/com118 # dir
total 24
-rwxr-xr-x 1 root root 7534 Aug 28 13:42 a.out
-rw-r--r-- 1 root root 4980 Aug 28 13:30 com118.c
-rw-r--r-- 1 root root 4056 Aug 27 23:05 com118.c.bak.jackxiang
-rw-r--r-- 1 root root  890 Aug 28 13:42 selectexample.cpp
前面介绍了串口的简单读写阅读全文
今天在修改 Blog Mover 上面那块菜单的时候我把 <a href="#" title="Step 1: 从源 Blog 读取日志" onclick="return selectTab('step1)" ... 中的href属性删除了,然后鼠标指针就不是手形了,于是我加上style="cursor:hand;",
在Firefox下查看发现鼠标指针没有变成手形,而是I形,而且报错了,说

”警告: 分析属性 'cursor' 值时出错。  声明被丢弃。
源文件:http://localhost:8080/blog-mover/styles/nicetabs.css
行:46“

后来查了一下发现:

在firefox下设置 cursor:hand;会报错,要用cursor:pointer 才可以。

style="cursor:hand;" 在IE中能正常显示成手;在firefox中却不能正常显示。

如果改用 style="cursor:pointer;" 则在两个浏览器下都能正常显示。
Bond哥说:

所有浏览器兼容!!!

<a href="javascript:document.getElementById('q_form').submit();">



<form action="question3.php" method="post" name="q_form" id="q_form">
<div class="right_div_2">
<div class="radio1"><input type="radio" name="3" value="yes" /><input type="radio" name="3" value="no"/></div>
<div class="radio2"><input type="radio" name="4" value="yes" /><input type="radio" name="4" value="no" /></div>
<div class="reset_next"><a href="javascript:document.getElementById('q_form').submit();">下一题</a></div>
</div>
</form>
写给应用(PHP)开发工程师,如果这些迹象(不良习惯)仍能在你身上找到,那么看来你还有很多必要的东西要学习,Live and learn。
阅读全文

php读写内存

WEB2.0 jack 2010-8-25 19:30
windows下,php.ini中取消 ;extension=php_shmop.dll 这行的行首分号,加载shmop扩展。
Linux下得加上编译参数。

测试代码如下:


<?php
//定义全局变量
$super = "hello world";

//申请100字节共享内存空间
$shm_id = shmop_open(0xff3, "c", 0644, 100);
if (!$shm_id)
{
echo "申请空间失败<br>";
}

//内容写入共享内存空间
if (shmop_write($shm_id, $super, 0))
{
echo "全局变量已经写入共享内存<br>";
}
else
{
echo "写入共享内存失败<br>";
}

//关闭共享内存空间
shmop_close($shm_id);
?>


<?php
//读100字节共享内存空间
$shm_id = shmop_open(0xff3, "a", 0644, 100);

//获取共享内存空间中的前11个字节的内容
//create.php中 $super 变量长度为11
$share = shmop_read($shm_id, 0, 11);

echo $share;

//关闭
shmop_close($shm_id);
?>


来源:http://ymsomix.blog.sohu.com/148799230.html
       Apache中 RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结构,这次我终于算大概知道它的意思了。
   RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。
   RewriteEngine on
   RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla\/5\.0.*
   RewriteRule  index.php            index.m.php

   RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
   RewriteRule  index.php            index.L.php

   RewriteRule  index.php            index.b.php
上面语句的作用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,如果你是用其它的浏览器访问的时候,会让你跳到 index.b.php。在说形象一点,上面的语句就等同于程序里面的下面语句(依PHP语句为例):
        if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
        {
              //跳转到对index.m.php的访问
        }
        else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
        {
              //跳转到对index.L.php的访问
        }
        else
              //跳转到对index.b.php的访问

在看例2:
        RewriteCond %{HTTP_REFERER} (www.test.cn)
        RewriteRule (.*)$ test.php
上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。

在看例三:
       RewriteCond %{REMOTE_HOST} ^host1.* [OR]
       RewriteCond %{REMOTE_HOST} ^host2.* [OR]
       RewriteCond %{REMOTE_HOST} ^host3.*
       RewriteRule (.*)$ test.php
上面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。

下面是自己收藏的一些有用的重写规则:
RewriteCond %{REQUEST_FILENAME} !-f   //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)

RewriteCond %{REQUEST_FILENAME} !-d   //#如果目录存在就直接访问目录不进行RewriteRule

RewriteCond %{REQUEST_URI} !^.*(\.css|\.js|\.gif|\.png|\.jpg|\.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite

来源:http://www.mx111.com/Article_View.asp?id=1347
Linux下把GBK编码的文件转化为utf-8编码的命令

iconv -f gbk -t utf8 in_file > out_file



conv -f gbk -t utf8 phone_samsung.php > phone_samsung2.php




find default -type d -exec mkdir -p utf/{} \;
find default -type f -exec iconv -f GBK -t UTF-8 {} -o utf/{} \;


这两行命令将default目录下的文件由GBK编码转换为UTF-8编码,目录结构不变,转码后的文件保存在utf/default目录下。

RewriteCond %{REQUEST_URI} !^/component.php$
RewriteRule /*.php  /component.php?key=jack


访问:component.php get变量会没有jack,而访问除开component.php的其他页面就有有Jack变量了。


这个也可以:
   RewriteCond %{REQUEST_URI} !^/component.php$
#   RewriteRule /*.php  /component.php?key=jack
   RewriteRule ^(.+?)\.php$  /component.php?key=jack


你可以把参数带上:


   RewriteCond %{REQUEST_URI} !^/component.php$
#   RewriteRule /*.php  /component.php?key=jack
   RewriteRule ^(.+?)\.php$  /component.php?key=$1


感谢:PHP高级编程组:我姓-->苏同学,呵呵!



备注:


<VirtualHost *:80>
ServerAdmin jackxiang@****.com
   DocumentRoot /usr/local/***/htdocs/***.act_view
   ServerName zzz.act.***.com
   AddDefaultCharset UTF-8

   RewriteEngine on
   RewriteCond %{REQUEST_URI} !^/component.php$
   RewriteRule /*.php  /component.php?key=jack
#   RewriteRule ^(.+?)\.php$  component.php?key=jack
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{QUERY_STRING} ^(.+)$
   RewriteRule ^/c/([a-zA-Z0-9]*)/([a-zA-Z0-9]*)$ /component.php
   RewriteRule ^/c/([a-zA-Z0-9]*)$ /component.php
   RewriteRule ^/c/(\w*)/(\w*) /component.php

   ErrorLog   /tmp/apache_****_act.log
   CustomLog /tmp/apache_****_act.clog common
   <Directory />
         Options Includes FollowSymLinks
         AllowOverride None
   </Directory>
</VirtualHost>



RewriteRule /*.php  /component.php?key=jack 可以,但是用:
RewriteRule ^(.+?)\.php$  /component.php?key=jack 后,没法访问:
domian.com/component/index.php/framemain  奇怪!!!

原来是少个斜杠,于是重新测试apache的urlrewrite正确的如下:


<VirtualHost *:80>
ServerAdmin jackxiang@***.com
   DocumentRoot /usr/local/tads/htdocs/****.act_view
   ServerName ****.act.**.com
   AddDefaultCharset UTF-8

   RewriteEngine on
   RewriteCond %{REQUEST_URI} !^/component.php$
   RewriteRule ^(.+?)\.php$  /component.php
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{QUERY_STRING} ^(.+)$
   RewriteRule ^/c/([a-zA-Z0-9]*)/([a-zA-Z0-9]*)$ /component.php
   RewriteRule ^/c/([a-zA-Z0-9]*)$ /component.php
   RewriteRule ^/c/(\w*)/(\w*) /component.php

   ErrorLog   /tmp/apache_****_act.log
   CustomLog /tmp/apache_****_act.clog common
   <Directory />
         Options Includes FollowSymLinks
         AllowOverride None
   </Directory>
</VirtualHost>


参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html
必须参看:http://www.jackxiang.com/post/3439/


后面Bond:
RewriteCond %{REQUEST_URI} !^.*(\.css|\.js|\.gif|\.png|\.jpg|\.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite
RewriteCond %{REQUEST_FILENAME} !-f   //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
RewriteEngine on
RewriteRule !\.(js|ico|txt|gif|jpg|png|css|html|xml)$ index.php
RewriteCond %{QUERY_STRING} ^(.+)$ 这个能解释一下吗?好几个,这个就是符合有query语句的情况。From:ianzhang(张文驰)


阅读全文
把2个串口用交叉线连起来,假设两个串口分别为/dev/ttyS0和/dev/ttyS1,则可以直接在一个shell执行cat /dev/ttyS0,然后在另外一个shell 执行echo "test." >/dev/ttyS1,如果两个串口都是好的,则执行cat /dev/ttyS0会输出'test."如果不行,则可用cat /proc/interrupts看一下是否产生了中断,也可用setserial查看串口设置

简单总结一些串口程序调试的方法
最近在做一个串口发送数据的程序,有时候在办公室写有时候在家里。在办公室都是用串口连接两台电脑来调试串口程序。因为电脑多,用一根线连起来,这边发那边收,收的一边xp里用串口调试助手,很方便。回到家就不那么方便了,以前只有一台笔记本,现在多了一台台式机。虽然机器多了,但是有时候又忘记把串口线带回来,也不方便。我的程序是linux qtembedded的,到现在用过几种其他方法调试串口数据发送,简单总结一下。

1.单机的时候。用ln -s output /dev/ttySAC2 把程序里用到的串口ttySAC2连到一个文件,写数据进去之后,再用xxd打开这个文件,看16进制输出。缺点是看结果慢一拍,好处是最简单。xxd是 linux命令行查看16进制的工具,可以在vi中调用,也可以直接在命令行使用。

2.两台机器连接,台式机向笔记本发送数据。那时候还不知道下面说的qtserialport-terminal。笔记本打开一个终端,用cat /dev/ttyUSB0|xxd输出接收到的数据,也是可以直接看到16进制输出的。但是似乎默认有缓存,不是每次发的数据都能及时显示出来。

3. 就是今天发现的方法。在virtualbox里装的xp,设置里enable serialport,选择host device,/dev/ttyS0。但是启动后找不到串口,自己手动添加一个,IRQ4,3F8,出来的是com3。(显示com1被使用,不知道原因)然后打开串口调试助手,在宿主机linux里运行程序,发送数据到/dev/ttyS0;xp里用串口调试助手就可以收到数据了。这样也不需要连线,一台机器就可以调试,马上可以看到接受的数据,也是个不错的办法。

另外,在Archlinux的aur里,有一个用qt和 qextserialport和多线程方式实现的qtserialport- terminal,和串口助手差不多。但是没有16进制显示,默认不能用ttyUSB,但是可以选择很多种字符编码。等有时间了,可以改一下,加上16进制和usb串口。 看看这个程序的源码,就可以很容易写出多线程的串口程序。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alexxu_118/archive/2010/06/29/5701409.aspx
        人生不能光溜溜的来,再光溜溜的走,人的一生总要做点什么,才会实现更大的人生价值,在士兵突击里许三多的一句话,应该学会运用在生活中:不抛弃,不放弃,做有意义的事。什么叫爱自己,得有规划,如果你没有规划,每天虚度年华,那叫糟蹋自己。所以,一个真正爱自己的人是爱周围所有的人。学会爱自己,就能爱他人,因为爱他人,才能爱自己。
        当有一天你需要知道谁是最优秀的,你不要告诉别人你是最优秀的,你要学会告诉每一个人,他们是优秀的,你才能听到你才是优秀的。当你需要被人帮助的时候,你应该去帮助他人,当你需要被帮助,你
才会看到,有人去帮助你。这就是更高层次的哲学。
      练习好自己的文笔,练好讲话。改变自己的个性,不能太内向,无乱在什么情况下都能笑出来,人应该有一种抗压的能力,你不能太娇气,不能弱不禁风,你不能怕这怕那,
      你总应该有一种向上的力量。      在任何困难到来的时候告诉自己你能闯过去,你能做得到,你是一个优秀的人。弄清楚工具和玩具的本质区别。要役物而不是役于物。君子身非异也,善假于物也,学会使用好工具,吸收大量的知识,你才能成为成为一个有用的人,受人尊敬的人。贪恋否则就是玩物丧志,失去社会存在的意义和价值。
      一定要学会做计划,好好想想你最爱好什么,最喜欢什么,将来做什么,为自己的未来做一个计划,为未来的计划去努力,怎么样才能完成人生的目标,而不是随遇而安,在自己有限的时间里学一些自己不喜欢的事情,敢于重头再来,否则就是愧对自己后边更多的金色年华。。。让世界充满爱。
[eparator]
 webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。

  1、适用系统:Linux

  2、编译安装:

引用wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make && make install

  3、使用:

引用webbench -c 500 -t 30 http://127.0.0.1/test.jpg
  参数说明:-c表示并发数,-t表示时间(秒)

  4、测试结果示例:

引用Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1/test.jpg
500 clients, running 30 sec.

Speed=3230 pages/min, 11614212 bytes/sec.
Requests: 1615 susceed, 0 failed.

下面是用100个并发连接分别去压生产环境中同一负载均衡器VIP下、提供相同服务的两台服务器,一台为Nginx,另一台为Apache,Nginx每秒处理的请求数是Apache的两倍多,Nginx服务器的系统负载、CPU使用率远低于Apache:

  你可以将连接数开到10000~30000,去压Nginx和Apache上的phpinfo.php,这是用浏览器访问Nginx上的phpinfo.php一切正常,而访问Apache服务器的phpinfo.php,则是该页无法显示。4G内存的服务器,即使再优化,Apache也很难在“webbench -c 30000 -t 60 http://xxx.xxx.xxx.xxx/phpinfo.php”的压力情况下正常访问,而调整参数优化后的Nginx可以。

  webbench 下载地址:http://blog.s135.com/post/288/

  注意:webbench 做压力测试时,该软件自身也会消耗CPU和内存资源,为了测试准确,请将 webbench 安装在别的服务器上。

  测试结果:##### Nginx + PHP #####

引用[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.21/phpinfo.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://192.168.1.21/phpinfo.php
100 clients, running 30 sec.

Speed=102450 pages/min, 16490596 bytes/sec.
Requests: 51225 susceed, 0 failed.

top - 14:06:13 up 27 days,   2:25,   2 users,   load average: 14.57, 9.89, 6.51
Tasks: 287 total,   4 running, 283 sleeping,   0 stopped,   0 zombie
Cpu(s): 49.9% us,   6.7% sy,   0.0% ni, 41.4% id,   1.1% wa,   0.1% hi,   0.8% si
Mem:   6230016k total,   2959468k used,   3270548k free,   635992k buffers
Swap:   2031608k total,     3696k used,   2027912k free,   1231444k cached

  测试结果:#####   Apache + PHP #####
引用[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.27/phpinfo.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://192.168.1.27/phpinfo.php
100 clients, running 30 sec.

Speed=42184 pages/min, 31512914 bytes/sec.
Requests: 21092 susceed, 0 failed.

top - 14:06:20 up 27 days,   2:13,   2 users,   load average: 62.15, 26.36, 13.42
Tasks: 318 total,   7 running, 310 sleeping,   0 stopped,   1 zombie
Cpu(s): 80.4% us, 10.6% sy,   0.0% ni,   7.9% id,   0.1% wa,   0.1% hi,   0.9% si
Mem:   6230016k total,   3075948k used,   3154068k free,   379896k buffers
Swap:   2031608k total,     12592k used,   2019016k free,   1117868k cached


--------------------------------------------------------------------------------

  为什么Nginx的性能要比Apache高得多?这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。

  处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别:

  假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分明了。

来源:http://hi.baidu.com/arongdy/blog/item/a7dab0511813c02c42a75b98.html

分页: 166/338 第一页 上页 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 下页 最后页 [ 显示模式: 摘要 | 列表 ]