<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>比比巴儿</title>
	<link>http://blog.bb82.com</link>
	<description>这里是我的大杂烩，就像东北乱炖，冬天吃很爽的！</description>
	<pubDate>Thu, 28 Aug 2008 02:10:57 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.2</generator>
	<language>en</language>
			<item>
		<title>国标麻将算番源代码</title>
		<link>http://blog.bb82.com/archives/244</link>
		<comments>http://blog.bb82.com/archives/244#comments</comments>
		<pubDate>Thu, 28 Aug 2008 02:10:57 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[其它]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/244</guid>
		<description><![CDATA[国标麻将算番源代码
int myCount(int *in);
int doit1(int *in,int count);
int Hu(int pai[8],int jiang)
Remain(int pai[38]]);
int getHuKeZi(int pai[38],int huKeZi[5]);
int getHuShunZi(int pai[38],int huShunZi[5]);
int isDanDiaojiang(int userHandPai[38],int huPai,int huFa);
int canAsJiangInit(int pai[38],int huPai);
int canAsJiang(int pai[38]);
int isKanZhang(int userHandPai[38],int huPai);
int isBianZhang(int userHandPai[38],int huPs);
int isWuZi(int *userHandPai,int *chiPai,int   *pengPai,int *anGangPai,int *mingGangPai);
int isQueYiMen(int *userHandPai,int *chiPai,int   *pengPai,int *anGangPai,int *mingGangPai);
int isMingGang(int * mingGangPai);
int isYaoJiuKe(int   *pengPai,int *anGangPai,int *mingGangPai,int *huKeZi);
int getAllShunZi(int *allShunZi,int *chiPai,int *huShunZi);
int [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/244/feed</wfw:commentRss>
		</item>
		<item>
		<title>SupeSite模板说明</title>
		<link>http://blog.bb82.com/archives/243</link>
		<comments>http://blog.bb82.com/archives/243#comments</comments>
		<pubDate>Wed, 27 Aug 2008 16:48:44 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[网站]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/243</guid>
		<description><![CDATA[一、             模版路径
\templates\default
二、             模版命名规则
采用‘前缀’+‘—’+‘文件名称’+‘.HTML.PHP’方式命名，前缀为频道分类，如BBS即是论坛类的模板文件；文件名称为文件的功能的英文名称，如footer为底部模板文件
三、             模板文件列表


templates
文件夹
存放SupeSite模板文件


default
文件夹
存放SupeSite默认模板套系文件


Bbs_footer.html.php
&#160;
论坛频道底部模板文件


Bbs_forumdisplay.html.php
&#160;
论坛频道论坛列表显示页


Bbs_header.html.php
&#160;
论坛频道头部文件


Bbs_index.html.php
&#160;
论坛频道首页文件


Bbs_viewthread.html.php
&#160;
论坛频道看帖页文件


Blog_category.html.php
&#160;
日志频道分类信息首页文件


Blog_footer.html.php
&#160;
日志频道底部文件


Blog_header.html.php
&#160;
日志频道头部文件


Blog_index.html.php
&#160;
日志频道首页文件


Blog_itemlist.html.php
&#160;
日志频道信息列表文件


File_category.html.php
&#160;
文件频道分类信息首页文件


File_footer.html.php
&#160;
文件频道底部文件


File_header.html.php
&#160;
文件频道头部文件


File_index.html.php
&#160;
文件频道首页文件


File_itemlist.html.php
&#160;
文件频道信息列表文件


footer.html.php
&#160;
网站首页底部文件


Goods_category.html.php
&#160;
商品频道分类信息首页文件


Goods_footer.html.php
&#160;
商品频道底部文件


Goods_header.html.php
&#160;
商品频道头部文件


Goods_index.html.php
&#160;
商品频道首页文件


Goods_itemlist.html.php
&#160;
商品频道列表文件


header.html.php
&#160;
网站首页头部文件


Image_category.html.php
&#160;
相册频道分类信息首页文件


Image_footer.html.php
&#160;
相册频道底部文件


Image_header.html.php
&#160;
相册频道头部文件


Image_index.html.php
&#160;
相册频道首页


Image_itemllist.html.php
&#160;
相册频道信息列表页


Index.html.php
&#160;
网站首页文件


Link_category.html.php
&#160;
书签频道分类信息首页文件


Link_footer.html.php
&#160;
书签频道底部文件


Link_header.html.php
&#160;
书签频道头部文件


Link_index.html.php
&#160;
书签频道首页文件


Link_itemlist.html.php
&#160;
书签频道信息列表文件


Login.html.php
&#160;
登陆文件


Messagebox.html.php
&#160;
信息提示文件


News_category.html.php
&#160;
资讯频道分类信息首页文件


News_footer.html.php
&#160;
资讯频道底部文件


News_header.html.php
&#160;
资讯频道头部文件


News_index.html.php
&#160;
资讯频道首页文件


News_itemlist.html.php
&#160;
资讯频道信息列表页


News_view.html.php
&#160;
资讯频道资讯查看页


News_viewcomment.html.php
&#160;
资讯频道评论文件


Panel.html.php
&#160;
面板文件


Poll.html.php
&#160;
投票显示页面文件


Register.html.php
&#160;
注册页面文件


Search.html.php
&#160;
搜索页面文件


Showlogin_secques.html
&#160;
登陆回答问题页面文件


Showmessage.html.php
&#160;
后台显示提示信息页面


Snapshot.html.php
&#160;
网页快照页面文件


Space_footer.html.php
&#160;
个人空间底部文件


Space_header.html.php
&#160;
个人空间头部文件


Space_index.html.php
&#160;
个人空间首页文件


Tag_footer.html.php
&#160;
TAG的底部文件


Tag_header.html.php
&#160;
TAG的头部文件


Tag_index.html.php
&#160;
TAG首页文件


Tag_itemlist.html.php
&#160;
TAG列表文件


四、             模版内容详解
1.&#60;?exit?&#62;防止模版被当作PHP文件调用。
2.&#60;?=S_VER?&#62;输出常量S_VER中的内容，S_VER中的内容当然为 SupeSite的版本号。
3. {template bbs_header}此种写法为调用模版文件，其中bbs_header为模版文件名，对应的模版文件为bbs_header.html.php。
4.&#60;!&#8211;{block name=&#8221;bbsthread&#8221; parameter=&#8221;fid/$fid/dateline/2592000/order/views DESC/limit/0,10/cachetime/17200/tpl/thread_subject_list&#8221;}&#8211;&#62;&#60;!&#8211;版块最热主题&#8211;&#62;
以上是调用数据库中的数据，可以按此种格式自行填写，或者在后台“添加模块”中添加。
5. $guide此为PHP中的变量，将PHP中的变量写到模版中后，程序会自动将变量中的内容输出出来，供显示用，此处为导航。
6. {lang common_type_bbs}此种格式为调语言包中common_type_bbs对应的语言，语言包路径为。
7. &#60;!&#8211;{if $page == 1}&#8211;&#62;
       语段1
&#60;!—{else}&#8211;&#62;
       语段2
&#60;!&#8211;{/if}&#8211;&#62;
PHP中的if写法相当于
&#60;?
if($page==1) {
       语段1
} else {
       语段2
}
?&#62;
意思是说如果条件成立则执行语段1否则执行语段2
8. &#60;!&#8211;{loop $_SBLOCK[&#8217;subarr&#8217;] $key $value}&#8211;&#62;
       [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/243/feed</wfw:commentRss>
		</item>
		<item>
		<title>内容管理系统SupeSite模块参数说明</title>
		<link>http://blog.bb82.com/archives/242</link>
		<comments>http://blog.bb82.com/archives/242#comments</comments>
		<pubDate>Wed, 27 Aug 2008 16:48:14 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[网站]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/242</guid>
		<description><![CDATA[SupeSite（点此下载） 是一套拥有独立的内容管理(CMS)功能，并集成了Web2.0社区个人门户系统X-Space，拥有强大的聚合功能的社区门户系统。 SupeSite可以实现对站内的论坛(Discuz!)、个人空间(X-Space)信息进行内容聚合。任何站长，都可以通过SupeSite，轻松构 建一个面向Web2.0的社区门户。　　我们在SupeSite系统的每个模板里，都可以看到类似的一段代码：





这里为大家解释下这段代码的作用，相信大家看完这个文档之后可以深入了解 SupeSite 的模板机制，从而更加方便的进行模板修改，更加灵活的进行数据调用。
一、包含两个部分的内容：





1、根据 parameter 后面给出的参数在数据库里查询某个数据表，将查询到的所有资源存放到 $_SBLOCK[变量名] 数组里。通俗的说法是，这段代码相当与一段SQL的 select 语句，查询的数据表是 name 后面的参数，查询的条件是 parameter 后面的参数，最后查询的果存放到 $_SBLOCK[变量名] ，变量名是 cachename 后面的参数。
2、确定这部分数据的缓存时间：cachetime后面的参数，单位是秒；确定这部分数据在页面的显示模板：tpl后面的参数，如：data， 那么这段数据显示的模板是：.\styles\data.html.php。大家可以看到 .\styles\data.html.php 这个文件夹里没有定义任何样式，所以必须在 block 代码下方定义样式。
二、loop 的含义是：
将 $_SBLOCK[hotnews] 数组里的资源，逐一存放到 $value 数组里。注意：loop 和 foreach() 函数的作用一样。





三、
&#60;p class=&#8221;blockintro&#8221;&#62;&#60;a href=&#8221;$value[url]&#8221;&#62;&#60;img src=&#8221;$value[a_thumbpath]&#8221; class=&#8221;blockintroimg&#8221; alt=&#8221;$value[subject]&#8221; /&#62;&#60;/a&#62;$value[message]&#8230;&#60;a href=&#8221;$value[url]&#8221;&#62;阅读更多&#60;/a&#62;&#60;/p&#62;
这一段内容，都是 html 标签，&#60;a href=&#8221;$value[url]&#8221;&#62;&#8230;&#60;/a&#62;,含义是在页面展示一个 a 标签，a标签的指向是 $value[url]。
一般情况下，我们都不知道 $value[] 数组里存放的内容是什么，我们可以应用的元素有哪些。这时，我们可以使用这个语句将 $value[] 数组打印到页面上。&#60;!&#8211;{eval print_r($value);}&#8211;&#62;
四、为大家介绍常用的 parameter 参数含义：



order&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;以什么方式排序，常见的排序方式如下几种：
displayorder&#8212;&#8212;&#8212;&#8212;&#8211;以后台设置的显示顺序排序
views DESC&#8212;&#8212;&#8212;&#8212;&#8212;-以查看数递减的方式排序
replies DESC&#8212;&#8212;&#8212;&#8212;&#8211;以回复数递减的方式排序
posts [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/242/feed</wfw:commentRss>
		</item>
		<item>
		<title>隨機函數Rand() 在update 語句中的使用</title>
		<link>http://blog.bb82.com/archives/241</link>
		<comments>http://blog.bb82.com/archives/241#comments</comments>
		<pubDate>Tue, 26 Aug 2008 12:44:45 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/241</guid>
		<description><![CDATA[作者：邹建
原文转自：http://topic.csdn.net/t/20030725/20/2072910.html
&#8211;数据测试:
&#8211;创建数据测试环境
declare   @TableA   table(id   int,in1   varchar(5),out1   varchar(5))
insert   into   @tablea(id,in1,out1)
select   1,&#8217;08:00&#8242;,&#8217;12:00&#8242;
union   all   select   2,&#8217;08:00&#8242;,&#8217;12:00&#8242;
union   all   select   3,&#8217;08:00&#8242;,&#8217;12:00&#8242;
union   all   select   4,&#8217;08:00&#8242;,&#8217;12:00&#8242;
union   all   select   5,&#8217;08:00&#8242;,&#8217;12:00&#8242;
&#8211;更新表
update   @tablea   set
in1=left(in1,3)+right(100+cast(floor(rand(id)*100000)   as   int)   %   60,2)
,out1=left(out1,3)+right(100+cast(floor(rand(id)*100000)   as [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/241/feed</wfw:commentRss>
		</item>
		<item>
		<title>40 Tips for optimizing your php Code</title>
		<link>http://blog.bb82.com/archives/240</link>
		<comments>http://blog.bb82.com/archives/240#comments</comments>
		<pubDate>Fri, 25 Jul 2008 06:23:53 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[互联网]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/240</guid>
		<description><![CDATA[原文地址：http://reinholdweber.com/?p=3
英文版权归Reinhold Weber所有，中译文作者yangyang（aka  davidkoree）。双语版可用于非商业传播，但须注明英文版作者、版权信息，以及中译文作者。翻译水平有限，请广大PHPer指正。
1. If a method can be static, declare it static. Speed improvement is by a  factor of 4. 如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。
2. echo is faster than print. echo 比 print 快。
3. Use echo’s multiple parameters instead of string concatenation.  使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。
4. Set the maxvalue for your for-loops before and not in the loop.  [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/240/feed</wfw:commentRss>
		</item>
		<item>
		<title>JSP与Servlet</title>
		<link>http://blog.bb82.com/archives/239</link>
		<comments>http://blog.bb82.com/archives/239#comments</comments>
		<pubDate>Mon, 14 Jul 2008 07:06:02 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[网站]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/239</guid>
		<description><![CDATA[　综述：Java Servlet是JSP技术的基础，而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。现在许多Web服务器都支持Servlet，即使不直接支持Servlet的Web服务器，也可以通过附件的应用服 务器和模块来支持Servlet，这得益于Java的跨平台特性。另外，由于Servlet内部以线程方式提供提供服务，不必对于每个请求都启动一个进 程，并且利用多线程机制可以同时为多个请求服务，因此Servlet的效率非常高。
但它并不是没有缺点，和传统的CGI、ISAPI、NSAPI方式相同，Java Servlet也是利用输出HTML语句来实现动态网页的，如果用它来开发整个网站，动态部分和静态页面的整合过程将变得无法想象。这就是SUN还要推出JSP的原因。
如何正确理解servlet？
servlet的基本概念
一、Servlet的结构
在具体掌握servlet之前，须对Java语言有所了解。我们假设读者已经具备一定的Java基础。在Servlet API中最重要的是Servlet接口（interface），所有的servlets都必须实现该接口，途径有很多：一是直接实现该接口，二是通过扩展 类(class)来实现，如 HttpServlet。 这个Servlet接口提供了servlet与客户端联系的方法。Servlet编写者可以在他们开发 servlet程序时提供更多一些或所有的这样方法。
当一个servlet接收来自客户端的调用请求, 它接收两个对象：一个是ServletRequest，另外一个是ServletResponse。这个ServletRequest类概括从客户端到服务器之间的联系，而  ServletResponse类概括从servlet返回客户端的联系。
ServletRequest接口可以获取到这样一些信息，如由客户端传送的阐述名称，客户端正在使用的协议，产生请求并且接收请求的服务器远端主机名。它也提供获取数据流的ServletInputStream,  这些数据是客户端引用中使用HTTP POST 和 PUT 方法递交的。一个ServletRequest的子类可以让servlet获取更多的协议特性数据。例如：HttpServletRequest  包含获取 HTTP-specific头部信息的方法。
ServletResponse接口给出相应客户端的servlet方法。它允许servlet设置内容长度和回应的mime类型，并且提供输出流 ServletOutputStream，通过编写者可以发回相应的数据。ServletResponse子类可以给出更多protocol- specific内容的信息。 例如：HttpServletResponse 包含允许servlet 操作HTTP-specific头部信息的方法。
上面有关类和接口的描述，构成了一个基本的Servlet框架。HTTP servlets有一些附加的可以提供session-tracking capabilities的方法。servlet编写者可以利用这些API，在有他人操作时维护servlet与客户端之间的状态。
作者：包路跃出处：Yesky责任编辑：                          [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/239/feed</wfw:commentRss>
		</item>
		<item>
		<title>解剖安全帐号管理器（SAM）结构</title>
		<link>http://blog.bb82.com/archives/238</link>
		<comments>http://blog.bb82.com/archives/238#comments</comments>
		<pubDate>Sat, 05 Jul 2008 05:01:50 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/238</guid>
		<description><![CDATA[ 	 本文网址:http://bbs.bitscn.com/35408 复制           
摘要
II、 关于SAM
III、注册表中SAM数据库的结构
IV、 SAM数据库的结构和主要内容
V、 关于SAM数据库分析的结论
一、摘要
分析安全帐号管理器结构是在一个多月前做的事情了，只零碎地记录下片段，没有发布过。不发布的主要
原因是安全帐户管理器（SAM）是WIN系统帐户管理的核心，并且非常系统化，我也有很多地方仅仅是进行的推
断和猜测，同时，SAM hack可能造成启动时lsass.exe加载帐户管理器出错，即便是安全模式也不能修复（启动
时候必然加载SAM）使得整个系统启动崩溃（我通常需要依靠第二系统删除SAM文件来启动）。至于现在发布出
来，主要是因为Adam和叮叮的《克隆管理员帐号》种所描述的制作rootkit办法隐蔽性和危害性，对SAM的结构
的熟悉，可以帮助安全维护人员做好安全检测（当然也可能让不良企图者利用）。
这里只介绍关于SAM的内容，同Security相关的暂时不公开。
二、关于SAM
不要误解了SAM，这不是一个文件sam这么简单。SAM（Security Accounts Manager安全帐户管理器）负责
SAM数据库的控制和维护。SAM数据库位于注册表HKLM\SAM\SAM下，受到ACL保护，可以使用regedt32.exe打开注
册表编辑器并设置适当权限查看SAM中的内容。SAM数据库在磁盘上就保存在%systemroot%system32\config\目
录下的sam文件中，在这个目录下还包括一个security文件，是安全数据库的内容，两者有不少关系。
SAM数据库中包含所有组、帐户的信息，包括密码HASH、帐户的SID等。这些内容在后面详细介绍。以我分
析的系统中文Win2K Adv Server为例。
三、注册表中SAM数据库的结构
展开注册表HKLM\SAM\SAM\:
HKLM&#8212;SAM
&#124;&#8212;SAM
&#124;&#8212;Domains
&#124; &#124;&#8212;Account
&#124; &#124; &#124;&#8212;Aliases
&#124; &#124; &#124; &#124;&#8212;Members
&#124; &#124; &#124; &#124;&#8212;Names
&#124; &#124; &#124;&#8212;Groups
&#124; &#124; &#124; &#124;&#8212;00000201
&#124; &#124; &#124; &#124;&#8212;Names
&#124; &#124; &#124; &#124;&#8212;None
&#124; &#124; &#124;&#8212;Users
&#124; &#124; &#124;&#8212;000001F4
&#124; &#124; &#124;&#8212;000001F5
&#124; &#124; &#124;&#8212;000003E8
&#124; &#124; &#124;&#8212;000003E9
&#124; &#124; &#124;&#8212;Names
&#124; [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/238/feed</wfw:commentRss>
		</item>
		<item>
		<title>Tomcat5.5 为什么运行一段时间就会死掉？</title>
		<link>http://blog.bb82.com/archives/237</link>
		<comments>http://blog.bb82.com/archives/237#comments</comments>
		<pubDate>Thu, 26 Jun 2008 15:01:00 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/237</guid>
		<description><![CDATA[http://topic.csdn.net/u/20070716/17/e575aa41-424e-406a-8ce0-f82c28c4ce11.html
]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/237/feed</wfw:commentRss>
		</item>
		<item>
		<title>Tomcat性能调整</title>
		<link>http://blog.bb82.com/archives/236</link>
		<comments>http://blog.bb82.com/archives/236#comments</comments>
		<pubDate>Thu, 26 Jun 2008 14:55:38 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/236</guid>
		<description><![CDATA[ http://tech.163.com/05/0711/10/1OCH7J2000091589.html
一. 引言
性能测试与分析是软件开发过程中介于架构和调整的一个广泛并比较不容易理解的领域，更是一项较为复杂的活动。就像下棋游戏一样，有效的性能测试和分析只能在一个良好的计划策略和具备了对不可预料事件的处理能力的条件下顺利地完成。一个下棋高手赢得比赛靠的不仅仅是对游戏规则的认识，更是靠他的自己的能力和不断地专注于分析自己对手的实力来更加有效地利用和发挥规则的作用。同样一个优秀的性能测试和分析人员将要面对的是来自一个全新的应用程序和环境下带来的整个项目的挑战。本文中作者结合自己的使用经验和参考文档，对Tomcat性能方面的调整做一简要的介绍，并给出Tomcat性能的测试、分析和调整优化的一些方法。
二. 测量Web服务器的性能
测量web服务器的性能是一项让人感到畏缩的任务，但是我们在这里将给出一些需要注意的地方并且指点你了解其中更多的细节性的内容。它不像一些简单的任务，如测量CPU的速率或者是测量程序占用CPU的比例，web服务器的性能优化中包括许调整许多变量来达到目标。许多的测量策略中都包含了一个看似简单的浏览实际上是在向服务器发送大量的请求，我们称之为客户端的程序，来测量响应时间。客户端和服务器端是在同一台机器上吗？服务器在测试的时候还运行着其它的什么程序吗？客户端和服务器端的通讯是通过局域网，100baseT，10baseT还是使用调制解调器？客户端是否一直重复请求相同的页面，还是随机地访问不同的页面？（这些影响到了服务缓存的性能）客户端发送请求的有规律的还是突发的？你是在最终的配置环境下运行服务的还是在调试的配置环境下运行服务的？客户端请求中包含图片还是只有HTML页面？是否有请求是通过servlets和JSP的，CGI程序，服务端包含（Server-Side  Includes ，SSI是一个可以让你使用动态HTML文件的技术）？所有这些都将是我们要关心的，并且几乎我们不可能精确地把所有的问题都清楚地列出来。
1.压力测试工具
“工欲善其事，必先利其器”，压力测试只有借助于一些工具才可得以实施。
大多数web压力测试工具的实现原理都是通过重复的大量的页面请求来模拟多用户对被测系统的并发访问，以此达到产生压力的目的。产生压力的手段都是通过录制或者是编写压力脚本，这些脚本以多个进程或者线程的形式在客户端运行，这样通过人为制造各种类型的压力，我们可以观察被测系统在各种压力状况下的表现，从而定位系统瓶颈，作为系统调优的基础。目前已经存在的性能测试工具林林总总，数量不下一百种，从单一的开放源码的免费小工具如  Aapache 自带的 web 性能测试工具 Apache Benchmark、开源的Jmeter 到大而全的商业性能测试软件如 Mercury 的  LoadRunner 等等。任何性能测试工具都有其优缺点，我们可以根据实际情况挑选用最合适的工具。您可以在这里找到一些web压力测试工具http://www.softwareqatest.com/qatweb1.html#LOAD
这里我们所使用的工具要支持web应用服务认证才可以，要支持接收发送cookies，不仅如此Tomcat支持多种认证方式，比如基本认证、基于表单的认证、相互认证和客户端认证，而一些工具仅仅支持HTTP基本认证。真实地模拟用户认证是性能测试工具的一个重要的部分，因为认证机制将对一个web站点的性能特征产生重要的影响。基于你在产品中使用的不同的认证方式，你需要从上面的工具列表中选择使用这种特性的测试工具。
Apache Benchmark和http_load是命令行形式的工具，非常易于使用。Apache  Benchmark可以模仿单独的URL请求并且重复地执行，可以使用不同的命令行参数来控制执行迭代的次数，并发用户数等等。它的一个特点是可以周期性地打印出处理过程的信息，而其它工具只能给出一个全局的报告。
2.压力测试工具介绍
三.  外部环境的调整
　　在Tomcat和应用程序进行了压力测试后，如果您对应用程序的性能结果不太满意，就可以采取一些性能调整措施了，当然了前提是应用程序没有问题，我们这里只讲Tomcat的调整。由于Tomcat的运行依赖于JVM，所以在这里我们把Tomcat的调整可以分为两类来详细描述：
外部环境调整
调整非Tomcat组件，例如Tomcat运行的操作系统和运行Tomcat的java虚拟机。
自身调整
修改Tomcat自身的参数，调整Tomcat配置文件中的参数。
下面我们将详细讲解外部环境调整的有关内容，Tomcat自身调整的内容将在第2部分中阐述。
1.JAVA虚拟机性能优化
Tomcat本身不能直接在计算机上运行，需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本（只要是符合Sun发布的Java规范的），但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的，因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。
可以给Java虚拟机设置使用的内存，但是如果你的选择不对的话，虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。



参数


描述




-Xms&#60;size&#62;


JVM初始化堆的大小




-Xmx&#60;size&#62;


JVM堆的最大值




这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言，这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存，此时这个参数就是显得非常重要，如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化，虚拟机就必须重复地增加内存来满足使用。由于这种原因，我们一般把-Xms和-Xmx设为一样大，而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象，内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出，并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。
Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。
Windows下，在文件{tomcat_home}/bin/catalina.bat，Unix下，在文件{tomcat_home}/bin/catalina.sh的前面，增加如下设置：
JAVA_OPTS=&#8217;-Xms【初始化内存大小】  -Xmx【可以使用的最大内存】&#8217;
需要把这个两个参数值调大。例如：
JAVA_OPTS=&#8217;-Xms256m  -Xmx512m&#8217;
表示初始化内存为256MB，可以使用的最大内存为512MB。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关，应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大，那么完全垃圾收集就会很慢，但是频度会降低。如果你把堆的大小和内存的需要一致，完全收集就很快，但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间，以在特定的时间内最大化处理客户的请求。在基准测试的时候，为保证最好的性能，要把堆的大小设大，保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾，请减小堆大小。一次完全的垃圾收集应该不超过  3-5 秒。如果垃圾收集成为瓶颈，那么需要指定代的大小，检查垃圾收集的详细输出，研究 垃圾收集参数对性能的影响。一般说来，你应该使用物理内存的 80%  作为堆大小。当增加处理器时，记得增加内存，因为分配可以并行进行，而垃圾收集不是并行的。
　2.操作系统性能优化
这里说的操作系统是指运行web服务器的系统软件，当然，不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的，因此在它的内核中有许多的限制来防止不同形式的服务攻击（OpenBSD的一句座右铭是“默认是最安全的”）。这些限制或许更多地用来运行活跃的web服务器。
而我们常用的Linux操作系统的目标是易用使用，因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核，表明所有的驱动器都静态地与之相连。这样就使系统易于使用，但是如果你要创建一个自定义的内核来加强其中某些限制，那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之，内存现在变得越来越便宜，所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存，并且在服务器上腾出更多的可用内存。
小提示：虽然现在内存已经相当的便宜，但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点，但是从可靠性上来说，性价比会更高一些。
如果是在Windows操作系统上使用Tomcat，那么最好选择服务器版本。因为在非服务器版本上，最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的。并且基于安全性的考虑，必须经常给操作系统打上最新的补丁。
3.Tomcat与其它web服务器整合使用
虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来，将html与jsp的功能部分进行明确分工，让tomcat只处理jsp部分，其它的由apache,IIS等这些web服务器处理，由此大大节省了tomcat有限的工作“线程”。
4.负载均衡
在负载均衡的思路下，多台服务器为对称方式，每台服务器都具有同等的地位，可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术，将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上，而接收到请求的服务器都独立回应客户机的请求。
提供服务的一组服务器组成了一个应用服务器集群(cluster)，并对外提供一个统一的地址。当一个服务请求被发至该集群时，根据一定规则选择一台服务器，并将服务转定向给该服务器承担，即将负载进行均衡分摊。
通过应用负载均衡技术，使应用服务超过了一台服务器只能为有限用户提供服务的限制，可以利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时，负载均衡服务器会自动进行检测并停止将服务请求分发至该服务器，而由其他工作正常的服务器继续提供服务，从而保证了服务的可靠性。
负载均衡实现的方式大概有四种：第一是通过DNS，但只能实现简单的轮流分配，不能处理故障，第二如果是基于MS  IIS，Windows 2003  server本身就带了负载均衡服务，第三是硬件方式，通过交换机的功能或专门的负载均衡设备可以实现，第四种是软件方式，通过一台负载均衡服务器进行，上面安装软件。使用Apache  Httpd  Server做负载平衡器，Tomcat集群节点使用Tomcat就可以做到以上第四种方式。这种方式比较灵活，成本相对也较低。另外一个很大的优点就是可以根据应用的情况和服务器的情况采取一些策略。
四. 自身调整
　　本节将向您详细介绍一些加速可使Tomcat实例加速运行的技巧和方法，无论是在什么操作系统或者何种Java虚拟机上。在有些情况下，您可能没有控制部署环境上的操作系统或者Java虚拟机。在这种情况下，您就需要逐行了解以下的的一些建议，然而你应该在修改后使之生效。我认为以下方法是Tomcat性能自身调整的最佳方式。
1.禁用DNS查询
当web应用程序向要记录客户端的信息时，它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络，并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程，这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询，方式是修改server.xml文件中的enableLookups参数值：
Tomcat4
&#60;Connector  className=&#8221;org.apache.coyote.tomcat4.CoyoteConnector&#8221; port=&#8221;80&#8243;  minProcessors=&#8221;5&#8243; maxProcessors=&#8221;75&#8243; enableLookups=&#8221;false&#8221; redirectPort=&#8221;8443&#8243;  acceptCount=&#8221;100&#8243; [...]]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/236/feed</wfw:commentRss>
		</item>
		<item>
		<title>Tomcat性能优化笔记</title>
		<link>http://blog.bb82.com/archives/235</link>
		<comments>http://blog.bb82.com/archives/235#comments</comments>
		<pubDate>Thu, 26 Jun 2008 14:30:31 +0000</pubDate>
		<dc:creator>比比巴儿</dc:creator>
		
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://blog.bb82.com/archives/235</guid>
		<description><![CDATA[Tomcat性能优化可从外部环境和自身调整两方面着手。
外部环境主要是Tomcat所在服务器的运行环境，包括操作系统层面、部署以及Java虚拟机的配置。
操作系统
这里不再赘述，跟优化其他服务器的思路与步骤没有本质区别。尽可能的增大可使用的内存容量、提高CPU的频率、保证文件系统的读写速率等等。对于可能发生很大并发连接的情况，可能需要修改内核参数来设置最大连接数。

Java虚拟机
Sun的JVM应该是多数情况下的第一选择。在满足项目要求的前提下可以选用版本较高的JVM版本，一般来说高版本产品在速度和效率上比低版本会有改进。
由  于Jvm系统垃圾收集机制的存在，在高负载情况下如果能根据系统的具体要求有效的调整最优化堆的大小，也可以起到一定优化作用。如果堆设置较大，则GC次  数变少，但每次花费较长时间，从而导致系统处理能力抖动较大；如果堆设置较小，则GC变得频繁，虽然对系统性能影响较小，但频繁的GC也会耗费系统资源。
JVM动态库有Server和Client两个版本，虽然差别不是很大，但生产环境还是推荐使用Server版本。
初此之外，主要的JVM还包括BEA  JRockit，IBM JVM，Jikes RVM，Kaffe等。可以根据项目的中间件产品选择对应厂商的JVM来获取有针对性的性能优化。
Tomcat自身的调整策略

启动参数Tomcat默认可以使用的内存是128MB。可以通过在启动时加入“-Xms”和“-Xmx”参数来获得更大的内存分配。但也要注意GC的问题。
负载均衡比较复杂，有机会另文详述。
集成Web服务器处理静态内容作 为一个Jsp/Servlet容器，Tomcat本身对静态Html文件的相应速度远逊Apache等Web服务器。通过与此类Web服务器的集成，可以  将对jsp内容的请求转发至Tomcat，而用Web服务器处理静态内容，能够非常显著的降低整体负载，提高整体响应的速度。
调整线程数Tomcat5使用线程池（Apache Portable  Runtime）来加速响应速度。默认创建5个线程，最大  线程数是200.如果并发较大，则可以对以下几个参数进行具体的调整：
maxThreads：Tomcat可创建的最大线程数；
acceptCount：如果当前可用线程数为0，则将请求放入处理队列中。这个值限定了请求队列的大小，超过这个数值的请求将不予处理。
connectionTimeout：网络连接超时数，单位毫秒。
minSpareThreads：如果当前没有空闲线程，且没有超过maxThreads，一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。
maxSpareThreads：一旦创建的线程超过此数值，Tomcat会关闭不再需要的线程。
线程数可以大致上用  “同时在线人数*每秒用户操作次数*系统平均操作时间” 来计算。
使用JikesJikes是性能优良的Java编译器，在jsp容器中使用Jikes替代Sun的编译器能够有效提高jsp文件的编译速度。对于Tomcat  5.5，可以参考Jasper-Howto。要注意的是Windows版本的Jikes是不支持-encoding选项的，你需要自己编译。可以参考这里。
用Ant进行预编译Tomcat官方推荐的部署方式是使用Ant对jsp进行预编译。直接在部署时将jsp编译为servlet类，能够在运行初期时显著提高响应速度。
http://zmaze.org/?p=194

]]></description>
		<wfw:commentRss>http://blog.bb82.com/archives/235/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
