﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-coolfiry</title><link>http://www.blogjava.net/coolfiry/</link><description>认认真真做人,兢兢业业做事!</description><language>zh-cn</language><lastBuildDate>Fri, 09 Jan 2009 12:32:25 GMT</lastBuildDate><pubDate>Fri, 09 Jan 2009 12:32:25 GMT</pubDate><ttl>60</ttl><item><title>blog内容预告</title><link>http://www.blogjava.net/coolfiry/archive/2008/12/11/245716.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Thu, 11 Dec 2008 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2008/12/11/245716.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/245716.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2008/12/11/245716.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/245716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/245716.html</trackback:ping><description><![CDATA[1、python的入门级内容。<br />
2、java mail的使用基本用法和注意事项。<br />
3、CXF中相关BUG的解决方法。<br />
4、UNIX 网络编程步步提升系列。<br />
<br />
<img src ="http://www.blogjava.net/coolfiry/aggbug/245716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2008-12-11 15:48 <a href="http://www.blogjava.net/coolfiry/archive/2008/12/11/245716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>snoop的用法</title><link>http://www.blogjava.net/coolfiry/archive/2008/10/21/235784.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Tue, 21 Oct 2008 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2008/10/21/235784.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/235784.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2008/10/21/235784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/235784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/235784.html</trackback:ping><description><![CDATA[转自:http://bbs.chinaunix.net/viewthread.php?tid=691982&amp;extra=&amp;page=1<br />
snoop 抓包<br />
<font color="Red">solaris自带snoop抓包工具,抓所有数据流</font><br />
<br />
# snoop<br />
Using device /dev/pcn0 (promiscuous mode)<br />
192.168.8.18 -&gt; 192.168.255.255 <font color="Red">NBT </font>NS Query Request for WORKGROUP[1c], Success<br />
192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;<font color="Red">TELNET </font>C port=1246<br />
&nbsp; &nbsp;&nbsp;&nbsp;solaris -&gt; 192.168.253.35 TELNET R port=1246 Using device /dev/pc<br />
&nbsp; &nbsp;&nbsp;&nbsp;solaris -&gt; 192.168.253.35 TELNET R port=1246 Using device /dev/pc<br />
192.168.4.150 -&gt; (broadcast)&nbsp;&nbsp;<font color="Red">ARP </font>C Who is 192.168.4.200, 192.168.4.200 ?<br />
192.168.4.200 -&gt; (broadcast)&nbsp;&nbsp;ARP C Who is 192.168.4.150, 192.168.4.150 ?<br />
#<br />
<br />
<font color="Red">抓源地址或目的为 202.101.98.55的数据流：</font><br />
<br />
# snoop 202.101.98.55<br />
Using device /dev/pcn0 (promiscuous mode)<br />
192.168.253.35 -&gt; dns.fz.fj.cn DNS C <a href="http://www.163.com./" target="_blank">www.163.com.</a> Internet Addr ?<br />
dns.fz.fj.cn -&gt; 192.168.253.35 DNS R <a href="http://www.163.com./" target="_blank">www.163.com.</a> Internet CNAME <a href="http://www.cache.split.netease.com./" target="_blank">www.cache.split.netease.com.</a><br />
<br />
#<br />
<br />
说明：internet cname 后的为解析<a href="http://www.163.com/" target="_blank">www.163.com</a>的名字时，代表<a href="http://www.163.com/" target="_blank">www.163.com</a>回答的主机的域名。<br />
<br />
<font color="Red">抓 192.168.253.35和202.101.98.55之间的数据流（双向都抓）</font><br />
<br />
# snoop 192.168.253.35 202.101.98.55<br />
Using device /dev/pcn0 (promiscuous mode)<br />
192.168.253.35 -&gt; dns.fz.fj.cn DNS C <a href="http://www.google.com./" target="_blank">www.google.com.</a> Internet Addr ?<br />
dns.fz.fj.cn -&gt; 192.168.253.35 DNS R <a href="http://www.google.com./" target="_blank">www.google.com.</a> Internet CNAME <a href="http://www.l.google.com./" target="_blank">www.l.google.com.</a><br />
#<br />
<br />
<font color="Red">抓完存在当前目录下的cap文件中并查看</font><br />
<br />
# snoop -o cap1 -P&nbsp; &nbsp;&nbsp; &nbsp;-P表示处在非混杂模式抓数据，只抓广播、主播、目的为本机的数据<br />
Using device /dev/pcn0 (<font color="Blue">non promiscuous</font>)<br />
15 ^C&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;15的含义是：显示目前抓了多少个数据流<br />
#<br />
<br />
# snoop -i cap1<br />
&nbsp;&nbsp;1&nbsp; &nbsp;0.00000 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
&nbsp;&nbsp;2&nbsp; &nbsp;0.18198 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
&nbsp;&nbsp;3&nbsp; &nbsp;0.37232 192.168.4.199 -&gt; 192.168.255.255 NBT Datagram Service Type=17 Source=WB-200[20]<br />
&nbsp;&nbsp;4&nbsp; &nbsp;0.00016&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;? -&gt; (multicast)&nbsp;&nbsp;ETHER Type=EF08 (Unknown), size = 180bytes<br />
&nbsp;&nbsp;5&nbsp; &nbsp;0.62546 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
&nbsp;&nbsp;6&nbsp; &nbsp;0.13822&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;? -&gt; (multicast)&nbsp;&nbsp;ETHER Type=0000 (LLC/802.3), size = 52 bytes<br />
&nbsp;&nbsp;7&nbsp; &nbsp;0.06283 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
&nbsp;&nbsp;8&nbsp; &nbsp;0.90301 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
&nbsp;&nbsp;9&nbsp; &nbsp;0.19781 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
10&nbsp; &nbsp;0.81493&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;? -&gt; (multicast)&nbsp;&nbsp;ETHER Type=0000 (LLC/802.3), size = 52 bytes<br />
11&nbsp; &nbsp;0.07018 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
12&nbsp; &nbsp;0.19939 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
13&nbsp; &nbsp;0.90151 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
14&nbsp; &nbsp;0.18904 192.168.253.35 -&gt; solaris&nbsp; &nbsp;&nbsp; &nbsp;TELNET C port=1246<br />
15&nbsp; &nbsp;0.68422&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;? -&gt; (multicast)&nbsp;&nbsp;ETHER Type=0000 (LLC/802.3), size = 52 bytes<br />
#snoop -i cap1 -p 10,12&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;只看10-12条记录<br />
<br />
#snoop -i cap1 -p10&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;只看第10条记录<br />
<br />
# snoop -i cap1 -v -p101&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;查看第10条数据流的包头的详细内容<br />
<br />
#snoop -i cap1 -v -x 0 -p101&nbsp; &nbsp;查看第10条数据流的全部的详细内容<br />
<br />
<font color="Red">抓主机192.168.253.35和202.101.98.55之间的tcp或者udp端口53的数据</font><br />
<br />
# snoop 192.168.253.35 and 202.101.98.55 and \(tcp or udp\) and port 53<br />
<br />
<font color="Blue">输入（的时候要加转义符号\</font><br />
<br />
<br />
<strong><font color="Red">snoop的详细参数</font></strong><br />
Snoop 是Solaris 系统中自带的工具， 是一个用于显示网络通讯的程序， 它可捕获IP 包并将其显示或保存到指定文件. (限超级用户使用snoop)<br />
Snoop 可将捕获的包以一行的形式加以总结或用多行加以详细的描述(有调用不同的参数&#8211;v -V来实现). 在总结方式下(-V ) ,
将仅显示最高层的相关协议, 例如一个NFS 包将仅显示NFS 信息, 其低层的RPC, UDP, IP, Ethernet 帧信息将不会显示,
但是当加上相应的参数(-v ), 这些信息都能被显示出来.<br />
<br />
-C<br />
<br />
-D<br />
<br />
-N<br />
<br />
-P 在非混杂模式下抓包<br />
<br />
-S 抓包的时候显示数据包的大小<br />
<br />
-V 半详细的显示抓的数据的信息<br />
<br />
-t [ r | a | d ] 显示时间戳，-ta显示当前系统时间，精确到毫秒<br />
<br />
-v 最详细的显示数据的信息<br />
<br />
-x offset [ , length] 以16进制或ACSII方式显示某数据的部分内容，比如 -x 0,10 只显示0-10字节<br />
<br />
#snoop -i cap1 -v -x 0 -p101 查看被抓获的第101个数据流的全部内容<br />
<br />
<br />
<strong><font color="Red">表达式：</font></strong><br />
<br />
根据地址：<br />
<br />
#snoop x.x.x.x&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;IPV4的IP<br />
<br />
#snoop 0XX:XX:XX:XX&nbsp; &nbsp; ETHERNET的MAC地址<br />
<br />
数据的方向：<br />
<br />
from x.x.x.x 或者 src x.x.x.x<br />
<br />
to x.x.x.x 或者 dst x.x.x.x<br />
<br />
可用的数据类型的关键词：<br />
<br />
ip, ip6, arp, rarp, pppoed, pppoes，pppoe，broadcast，multicast，apple，decnet<br />
<br />
udp, tcp, icmp, icmp6, ah, esp<br />
<br />
greater length<br />
&nbsp; &nbsp;&nbsp; &nbsp;True if the packet is longer than length.<br />
<br />
less length<br />
&nbsp; &nbsp;&nbsp; &nbsp;True if the packet is shorter than length.<br />
<br />
net net<br />
<br />
# snoop from net 192.168.1.0 抓来自192.168.1.0/24的数据<br />
<br />
# snoop from net 192.168.0.0 抓来自192.168.0.0/16的数据<br />
<br />
port xx XX为TCP或者UDP的端口号或者 /etc/services里定义的名字<br />
<br />
#snoop to udp and port 53&nbsp; &nbsp; 抓到UDP53的数据
<img src ="http://www.blogjava.net/coolfiry/aggbug/235784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2008-10-21 21:30 <a href="http://www.blogjava.net/coolfiry/archive/2008/10/21/235784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CXF使用中List作为传输参数相关问题的解决</title><link>http://www.blogjava.net/coolfiry/archive/2008/08/05/220272.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Tue, 05 Aug 2008 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2008/08/05/220272.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/220272.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2008/08/05/220272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/220272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/220272.html</trackback:ping><description><![CDATA[在项目使用CXF的过程中,遇到了有关List作为传输参数的时候,如果WebService端没有明确给出List的泛型类型会报错。<br />
例如<br />
CXF的WebService端口接口的一个方法为为：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;updateMessageStatus(List</span><span style="color: #000000;"> batchIds);<br />
</span></div>
<br />
客户端的的调用为：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">预先初始化cxf对象cxfObj</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;list</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">list.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">cxfObj.updateMessageStatus(list);</span></div>
<br />
<br />
在客户端进行调用WebService时会发生错误，错误为：unexpected element (uri:"", local:"arg0")等，据分析生成的wsdl，这是因为CXF在进行数据marshal时不知道要将要转换的类型。<br />
<br />
解决办法是:在WebService端的接口必须用List的泛型类型参数，如：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;updateMessageStatus(List</span><span style="color: #000000;">&lt;String&gt; batchIds);<br />
</span></div>
<br />
这样就完全解决问题了。<br />
<img src ="http://www.blogjava.net/coolfiry/aggbug/220272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2008-08-05 20:09 <a href="http://www.blogjava.net/coolfiry/archive/2008/08/05/220272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的第一个和第二个unix SHELL学习程序</title><link>http://www.blogjava.net/coolfiry/archive/2008/07/20/216227.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Sun, 20 Jul 2008 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2008/07/20/216227.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/216227.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2008/07/20/216227.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/216227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/216227.html</trackback:ping><description><![CDATA[现在正在学习linux shell编程<br />
first.sh<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;read&nbsp;line<br />
do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">$line</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
done&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #800000;">"</span><span style="color: #800000;">$1</span><span style="color: #800000;">"</span></div>
这是第一个shell程序小例子，就相当于一个学习其他语言的hello world了吧。用法first.sh test，将test文件中的每一行输出到stdout中。<br />
<br />
second.sh<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">number</span><span style="color: #000000;">=</span><span style="color: #000000;">0;<br />
</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;[&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">$number</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">lt&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;"> ]<br />
do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">$number</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number</span><span style="color: #000000;">=</span><span style="color: #000000;">'expr&nbsp;$number&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">'<br />
done<br />
echo</span></div>
这是第二个shell程序小例子，作用是输出0到99的数字到stdout中。其中用到的expr的作用是使expr的参数转化为数字并相加。两个单引号的作用是引号所包围的命令被命令的标准输出替换，并输出赋值给我number，得到了如同java中number=number+1的效果。<br />
<br />
<br />
<img src ="http://www.blogjava.net/coolfiry/aggbug/216227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2008-07-20 20:34 <a href="http://www.blogjava.net/coolfiry/archive/2008/07/20/216227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在使用CXF WebService框架时遇到的问题与解决方案</title><link>http://www.blogjava.net/coolfiry/archive/2008/07/18/215882.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Fri, 18 Jul 2008 11:11:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2008/07/18/215882.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/215882.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2008/07/18/215882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/215882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/215882.html</trackback:ping><description><![CDATA[在项目开发过程中，遇到在本机和windows环境中部署用CXF框架开发的的webService没有任何问题，但是当将工程部署到solaris 的SUN ONE application上时，再用本机的cxf Web服务客户端访问对应的web服务时，如果传输的数据量小于大约4K不会出问题，否则则会报一些数据绑定的异常如：<br />
Marshalling Error: Error writing request body to server。<br />
解决这个问题花了我足足两天时间，原因是有关CXF的资料太少了，而且有关于这个错误的解决都必须使用google才能search到，用baidu完全search不到相关的资料。<br />
解决方案：<br />
在客户端的class-path中加上cxf.xml。cxf.xml的配置如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:http</span><span style="color: #0000ff;">="http://cxf.apache.org/transports/http/configuration"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:jaxws</span><span style="color: #0000ff;">="http://cxf.apache.org/jaxws"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="<br />
http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans.xsd<br />
http://cxf.apache.org/jaxws&nbsp;http://cxf.apache.org/schemas/jaxws.xsd<br />
&nbsp;http://cxf.apache.org/transports/http/configuration<br />
http://cxf.apache.org/schemas/configuration/http-conf.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">http:conduit&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*.http-conduit"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">http:client&nbsp;</span><span style="color: #ff0000;">AutoRedirect</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">http:conduit</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
这个问题的解决方案是我在cxf的官网上找了很久才找到的，虽然问题解决了，但是我感到很迷惑。主要在windows tomcat环境下没有问题，而到了SUN ONE的环境就有问题，经过的思考和找了一资料，我认为问题出于solaris对于HTTP数据传输的某些限制，如果真要去搞清楚的话可能要去参看cxf的source code了，但是我不想花这个时间去研究这个问题了。<br />
<br />
我把这个解决方案写出来，希望可以帮助到使用CXF的网友，也希望高手们能帮我解决我的迷惑。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/coolfiry/aggbug/215882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2008-07-18 19:11 <a href="http://www.blogjava.net/coolfiry/archive/2008/07/18/215882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用负载均衡技术建设高负载的网络站点(转)</title><link>http://www.blogjava.net/coolfiry/archive/2008/07/18/215763.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Fri, 18 Jul 2008 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2008/07/18/215763.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/215763.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2008/07/18/215763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/215763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/215763.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>Internet的快速增长使多媒体网络服务器，特别是Web服务器，面对的访问者数量快速增加，网络服务器需要具备提供大量并发访问服务的能力。 例如Yahoo每天会收到数百万次的访问请求，因此对于提供大负载Web服务的服务器来讲，CPU、I/O处理能力很快会成为瓶颈。</p>
<p>简单的 提高硬件性能并不能真正解决这个问题，因为单台服务器的性能总是有限的，一般来讲，一台PC服务器所能提供的并发访问处理能力大约为1000个，更为高档 的专用服务器能够支持3000-5000个并发访问，这样的能力还是无法满足负载较大的网站的要求。尤其是网络请求具有突发性，当某些重大事件发生时，网 络访问就会急剧上升，从而造成网络瓶颈，例如在网上发布的克林顿弹劾书就是很明显的例子。必须采用多台服务器提供网络服务，并将网络请求分配给这些服务器 分担，才能提供处理大量并发服务的能力。</p>
<p>当使用多台服务器来分担负载的时候，最简单的办法是将不同的服务器用在不同的方面。 按提供的内容进行分割时，可以将一台服务器用于提供新闻页面，而另一台用于提供游戏页面；或者可以按服务器的功能进行分割，将一台服务器用于提供静态页面 访问，而另一些用于提供CGI等需要大量消耗资源的动态页面访问。然而由于网络访问的突发性，使得很难确定那些页面造成的负载太大，如果将服务的页面分割 的过细就会造成很大浪费。事实上造成负载过大的页面常常是在变化中的，如果要经常按照负载变化来调整页面所在的服务器，那么势必对管理和维护造成极大的问 题。因此这种分割方法只能是大方向的调整，对于大负载的网站，根本的解决办法还需要应用负载均衡技术。</p>
<p>负载均衡的思路下多台 服务器为对称方式，每台服务器都具备等价的地位，都可以单独对外提供服务而无须其他服务器的辅助。然后通过某种负载分担技术，将外部发送来的请求均匀分配 到对称结构中的某一台服务器上，而接收到请求的服务器都独立回应客户机的请求。由于建立内容完全一致的Web服务器并不复杂，可以使用服务器同步更新或者 共享存储空间等方法来完成，因此负载均衡技术就成为建立一个高负载Web站点的关键性技术。</p>
<ol>
    <li><strong>基于特定服务器软件的负载均衡</strong>
    <p>很 多网络协议都支持&#8220;重定向&#8221;功能，例如在HTTP协议中支持Location指令，接收到这个指令的浏览器将自动重定向到Location指明的另一个 URL上。由于发送Location指令比起执行服务请求，对Web服务器的负载要小的多，因此可以根据这个功能来设计一种负载均衡的服务器。任何时候 Web服务器认为自己负载较大的时候，它就不再直接发送回浏览器请求的网页，而是送回一个Locaction指令，让浏览器去服务器集群中的其他服务器上 获得所需要的网页。</p>
    <p>在这种方式下，服务器本身必须支持这种功能，然而具体实现起来却有很多困难，例如一台服务器如何能保证它重定向过的服务 器是比较空闲的，并且不会再次发送Location指令？Location指令和浏览器都没有这方面的支持能力，这样很容易在浏览器上形成一种死循环。因 此这种方式实际应用当中并不多见，使用这种方式实现的服务器集群软件也较少。有些特定情况下可以使用CGI（包括使用FastCGI或mod_perl扩 展来改善性能）来模拟这种方式去分担负载，而Web服务器仍然保持简洁、高效的特性，此时避免Location循环的任务将由用户的CGI程序来承担。</p>
    <li><strong>基于</strong><strong>DNS的负载均衡</strong>
    <p>由 于基于服务器软件的负载均衡需要改动软件，因此常常是得不偿失，负载均衡最好是在服务器软件之外来完成，这样才能利用现有服务器软件的种种优势。最早的负 载均衡技术是通过DNS服务中的随机名字解析来实现的，在DNS服务器中，可以为多个不同的地址配置同一个名字，而最终查询这个名字的客户机将在解析这个 名字时得到其中的一个地址。因此，对于同一个名字，不同的客户机会得到不同的地址，他们也就访问不同地址上的Web服务器，从而达到负载均衡的目的。</p>
    <p><img class="magplus" title="点击查看原始大小图片" height="418" alt="" src="http://www.lslnet.com/linux/photos/load-1.gif" width="700" _counted="undefined" /></p>
    <p>例如如果希望使用三个Web服务器来回应对www.exampleorg.org.cn的HTTP请求，就可以设置该域的DNS服务器中关于该域的数据包括有与下面例子类似的结果：</p>
    <blockquote>
    <blockquote>
    <pre>www1		IN		A 		192.168.1.1</pre>
    <pre>www2		IN		A 		192.168.1.2</pre>
    <pre>www3		IN		A 		192.168.1.3</pre>
    <pre>www		IN		CNAME		www1</pre>
    <pre>www		IN		CNAME		www2</pre>
    <pre>www		IN		CNAME		www3</pre>
    </blockquote></blockquote>
    <p>此后外部的客户机就可能随机的得到对应www的不同地址，那么随后的HTTP请求也就发送给不同地址了。</p>
    <p>DNS 负载均衡的优点是简单、易行，并且服务器可以位于互联网的任意位置上，当前使用在包括Yahoo在内的Web站点上。然而它也存在不少缺点，一个缺点是为 了保证DNS数据及时更新，一般都要将DNS的刷新时间设置的较小，但太小就会造成太大的额外网络流量，并且更改了DNS数据之后也不能立即生效；第二点 是DNS负载均衡无法得知服务器之间的差异，它不能做到为性能较好的服务器多分配请求，也不能了解到服务器的当前状态，甚至会出现客户请求集中在某一台服 务器上的偶然情况。</p>
    <li><strong>反向代理负载均衡</strong>
    <p>使用代理服务器可以将请求转发给内部的Web服务器，使用这种加速 模式显然可以提升静态网页的访问速度。因此也可以考虑使用这种技术，让代理服务器将请求均匀转发给多台内部Web服务器之一上，从而达到负载均衡的目的。 这种代理方式与普通的代理方式有所不同，标准代理方式是客户使用代理访问多个外部Web服务器，而这种代理方式是多个客户使用它访问内部Web服务器，因 此也被称为反向代理模式。</p>
    <p>实现这个反向代理能力并不能算是一个特别复杂的任务，但是在负载均衡中要求特别高的效率，这样实现起来就不是十分 简单的了。每针对一次代理，代理服务器就必须打开两个连接，一个为对外的连接，一个为对内的连接，因此对于连接请求数量非常大的时候，代理服务器的负载也 就非常之大了，在最后反向代理服务器会成为服务的瓶颈。例如，使用Apache的mod_rproxy模块来实现负载均衡功能时，提供的并发连接数量受 Apache本身的并发连接数量的限制。一般来讲，可以使用它来对连接数量不是特别大，但每次连接都需要消耗大量处理资源的站点进行负载均衡，例如搜寻。</p>
    <p>使 用反向代理的好处是，可以将负载均衡和代理服务器的高速缓存技术结合在一起，提供有益的性能，具备额外的安全性，外部客户不能直接访问真实的服务器。并且 实现起来可以实现较好的负载均衡策略，将负载可以非常均衡的分给内部服务器，不会出现负载集中到某个服务器的偶然现象。</p>
    <li><strong>基于</strong><strong>NAT的负载均衡技术</strong>
    <p>网 络地址转换为在内部地址和外部地址之间进行转换，以便具备内部地址的计算机能访问外部网络，而当外部网络中的计算机访问地址转换网关拥有的某一外部地址 时，地址转换网关能将其转发到一个映射的内部地址上。因此如果地址转换网关能将每个连接均匀转换为不同的内部服务器地址，此后外部网络中的计算机就各自与 自己转换得到的地址上服务器进行通信，从而达到负载分担的目的。</p>
    <p><img height="338" alt="" src="http://www.lslnet.com/linux/photos/load-2.gif" width="474" _counted="undefined" /></p>
    <p>地 址转换可以通过软件方式来实现，也可以通过硬件方式来实现。使用硬件方式进行操作一般称为交换，而当交换必须保存TCP连接信息的时候，这种针对OSI网 络层的操作就被称为第四层交换。支持负载均衡的网络地址转换为第四层交换机的一种重要功能，由于它基于定制的硬件芯片，因此其性能非常优秀，很多交换机声 称具备400MB-800MB的第四层交换能力，然而也有一些资料表明，在如此快的速度下，大部分交换机就不再具备第四层交换能力了，而仅仅支持第三层甚 至第二层交换。</p>
    <p>然而对于大部分站点来讲，当前负载均衡主要是解决Web服务器处理能力瓶颈的，而非网络传输能力，很多站点的互联网连接带宽总共也不过10MB，只有极少的站点能够拥有较高速的网络连接，因此一般没有必要使用这些负载均衡器这样的昂贵设备。</p>
    <p>使 用软件方式来实现基于网络地址转换的负载均衡则要实际的多，除了一些厂商提供的解决方法之外，更有效的方法是使用免费的自由软件来完成这项任务。其中包括 Linux Virtual Server Project中的NAT实现方式，或者本文作者在FreeBSD下对natd的修订版本。一般来讲，使用这种软件方式来实现地址转换，中心负载均衡器存 在带宽限制，在100MB的快速以太网条件下，能得到最快达80MB的带宽，然而在实际应用中，可能只有40MB-60MB的可用带宽。</p>
    <li><strong>扩展的负载均衡技术 </strong></li>
</ol>
<blockquote>
<p>上 面使用网络地址转换来实现负载分担，毫无疑问所有的网络连接都必须通过中心负载均衡器，那么如果负载特别大，以至于后台的服务器数量不再在是几台、十几 台，而是上百台甚至更多，即便是使用性能优秀的硬件交换机也回遇到瓶颈。此时问题将转变为，如何将那么多台服务器分布到各个互联网的多个位置，分散网络负 担。当然这可以通过综合使用DNS和NAT两种方法来实现，然而更好的方式是使用一种半中心的负载均衡方式。</p>
<p>在这种半中心的负载均衡方式下，即当客户请求发送给负载均衡器的时候，中心负载均衡器将请求打包并发送给某个服务器，而服务器的回应请求不再返回给中心负载均衡器，而是直接返回给客户，因此中心负载均衡器只负责接受并转发请求，其网络负担就较小了。</p>
<p><img height="578" alt="" src="http://www.lslnet.com/linux/photos/load-3.gif" width="606" _counted="undefined" /></p>
<p>上图来自Linux Virtual Server Project，为他们使用IP隧道实现的这种负载分担能力的请求/回应过程，此时每个后台服务器都需要进行特别的地址转换，以欺骗浏览器客户，认为它的回应为正确的回应。</p>
<p>同样，这种方式的硬件实现方式也非常昂贵，但是会根据厂商的不同，具备不同的特殊功能，例如对SSL的支持等。</p>
<p><font size="3">由于这种方式比较复杂，因此实现起来比较困难，它的起点也很高，当前情况下网站并不需要这么大的处理能力。</font></p>
<p><font size="3"></font></p>
<p><font size="3">比 较上面的负载均衡方式，DNS最容易，也最常用，能够满足一般的需求。但如果需要进一步的管理和控制，可以选用反向代理方式或NAT方式，这两种之间进行 选择主要依赖缓冲是不是很重要，最大的并发访问数量是多少等条件。而如果网站上对负载影响很厉害的CGI程序是由网站自己开发的，也可以考虑在程序中自己 使用Locaction来支持负载均衡。半中心化的负载分担方式至少在国内当前的情况下还不需要。<br />
http://galaxystar.javaeye.com/blog/50546</font></p>
</blockquote></div>
<img src ="http://www.blogjava.net/coolfiry/aggbug/215763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2008-07-18 14:23 <a href="http://www.blogjava.net/coolfiry/archive/2008/07/18/215763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>垃圾收集机制(Garbage Collection)批判</title><link>http://www.blogjava.net/coolfiry/archive/2007/10/12/152260.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Fri, 12 Oct 2007 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2007/10/12/152260.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/152260.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2007/10/12/152260.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/152260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/152260.html</trackback:ping><description><![CDATA[<p><span>在Java版发表这篇文章，似乎有点把矛头指向Java了。其实不是，GC是所有新一代语言共有的特征，<br />
Python, Eiffel，C#，Roby等无一例外地都使用了GC机制。但既然Java中的GC最为著名，所以天塌<br />
下来自然应该抗着。</span></p>
<p><span>这篇短文源于comp.lang.</span><a href="http://www.chinaitpower.com/Dev/Programme/Java/index.html" target="_blank"><span>java</span></a><span>.programmer跟comp.lang.c++上发生的一场大辩论，支持C++和Java<br />
的两派不同势力展开了新世纪第一场冲突，跟贴发言超过350，两派都有名角压阵。C++阵营的擂主是<br />
Pete Becker，ACM会员，Dinkumware Ltd. 的技术副总监。此君精通C++和Java，开发过两种语言的<br />
核心类库，但是却对C++狂热之极，而对于Java颇不以为然。平时谈到Java的时候还好，一旦有人胆<br />
敢用Java来批判C++，立刻忍不住火爆脾气跳将出来，以坚韧不拔的毅力和大无畏精神与对手周旋，<br />
舌战群儒，哪怕只剩下一个人也要血战到底。这等奇人当真少见！我真奇怪他整天泡在usenet上，<br />
不用工作么？他的老板P.J. Plauger如此宽宏大量？Java阵营主角是一个网名Razzi的兄弟，另外有<br />
Sun公司大名鼎鼎的Peter van der Linden助阵，妙语连珠，寸土必争，加上人多势众，一度占据优势。<br />
C++阵营里大拿虽然很多，但是大多数没有Pete那么多闲工夫，例如Greg Comeau，Comeau公司老板，<br />
每次来个只言片语，实在帮不了Pete多大忙。但是自从C++阵营中冒出一个无名小子，网名Courage(勇气)，<br />
发动对Java GC机制的批判，形势为之一变。C++阵营眼下处于全攻之势，Java阵营疲于防守，只能<br />
招架说：&#8220;你们没有证据，没有统计资料&#8221;，形势很被动。</span></p>
<p><span>垃圾收集(GC)不是一直被Java fans用来炫耀，引以为傲的优点么？怎么成了弱点了？我大惑不解，定睛<br />
一看，才觉得此中颇有道理。</span></p>
<p><span>首先，Java Swing库存在大量资源泄漏问题，这一点SUN非常清楚，称之为bugs，正在极力修正。但是看来<br />
这里的问题恐怕不仅是库编写者的疏忽，可能根源在于深层的机制，未必能够轻易解决，搞不好要伤筋动骨。<br />
不过这个问题不是那么根本，C++阵营觉得如果抓住对方的弱点攻击，就算是占了上风也没什么说服力。谁<br />
没有缺点呢？于是反其道而行之，猛烈攻击Java阵营觉得最得意的东西，Java的GC机制本身。</span></p>
<p><span>首先来想一想，memory leak到底意味着什么。在C++中，new出来的对象没有delete，这就导致了memory<br />
leak。但是C++早就有了克服这一问题的办法——smart pointer。通过使用标准库里设计精致的auto_ptr<br />
以及各种STL容器，还有例如boost库(差不多是个准标准库了)中的四个smart pointers，C++</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>员只要<br />
花上一个星期的时间学习最新的资料，就可以拍着胸脯说：&#8220;我写的</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>没有memory leak!&#8221;。</span></p>
<p><span>相比之下，Java似乎更优秀，因为从一开始你就不用考虑什么特殊的机制，大胆地往前new，自有GC替你<br />
收拾残局。Java的GC实际上是</span><a name="baidusnap0"></a><span>JVM中的一个独立线程，采用不同的算法</span><a name="baidusnap4"></a><span>策略来收集heap中那些不再有<br />
reference指向的垃圾对象所占用的内存。但是，通常情况下，GC线程的优先级比较低，只有在当前</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><br />
<span>空闲的时候才会被调度，收集垃圾。当然，如果JVM感到内存紧张了，JVM会主动</span><a name="baidusnap1"></a><span>调用GC来收集垃圾，获取<br />
更多的内存。请注意，Java的GC工作的时机是：1. 当前</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>不忙，有空闲时间。2. 空闲内存不足。<br />
现在我们考虑一种常见的情况，</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>在紧张运行之中，没哟空闲时间给GC来运行，同时机器内存很大，<br />
JVM也没有感到内存不足，结果是什么？对了，GC形同虚设，得不到调用。于是，内存被不断吞噬，而那些<br />
早已经用不着的垃圾对象仍在在宝贵的内存里睡大觉。例如：</span></p>
<p><span>class BadGc {</span></p>
<p><span>&nbsp;&nbsp;&nbsp; public void job1() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String garbage = "I am a garbage, and just sleeping in your precious memory, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "how do you think you can deal with me? Daydreaming! HAHA!!!";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span>&nbsp;&nbsp;&nbsp; public void job2() {...}</span></p>
<p><span>&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; ...</span></p>
<p><span>&nbsp;&nbsp;&nbsp; public void job1000() {...}</span></p>
<p><span>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bgc = new BadGc();<br />
&nbsp;bgc.job1();<br />
&nbsp;bgc.job2();<br />
&nbsp;...<br />
&nbsp;bgc.job1000();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</span></p>
<p><span>运行中，虽然garbage对象在离开job1()之后，就再也没有用了。但是因为</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>忙，内存还够用，所以GC得<br />
不到调度，garbage始终不会被回收，直到</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>运行到bgc.job1000()时还躺在内存里嘲笑你。没辙吧！</span></p>
<p><span>好了，我承认这段</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>很傻。但是你不要以为这只是理论上的假设，恰恰相反，大多数实用中的Java</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>都有<br />
类似的效应。这就是为什么Java</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>狂耗内存，而且好像给它多少内存吃都不够。你花上大笔的银子把内存<br />
从128升到256，再升到512，结果是，一旦执行复杂任务，内存还是被轻易填满，而且多出来的这些内存只是<br />
用来装垃圾，GC还是不给面子地千呼万唤不出来。等到你的内存终于心力交瘁，GC才姗姗来迟，收拾残局。而<br />
且GC工作的方式也很不好评价，一种方法是一旦有机会回收内存，就把所有的垃圾都回收。你可以想象，这要<br />
花很长时间(几百M的垃圾啊！)，如果你这时侯正在压下开炮的按钮，GC却叫了暂定，好了，你等死吧！另一<br />
种方法，得到机会之后，回收一些内存，让JVM感到内存不那么紧张时就收手。结果呢，内存里始终有大批垃<br />
圾，</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>始终在半死不活的荡着。最后，GC可以每隔一段时间就运行一次，每次只回收一部分垃圾，这是现在<br />
大部分JVM的方式，结果是内存也浪费了，还动不动暂停几百毫秒。难啊！</span></p>
<p><span>反过来看看C++利用smart pointer达成的效果，一旦某对象不再被引用，</span><a href="http://www.chinaitpower.com/System/index.html" target="_blank"><span>系统</span></a><span>刻不容缓，立刻回收内存。这<br />
通常发生在关键任务完成后的清理(cleanup)时期，不会影响关键任务的实时性，同时，内存里所有的对象<br />
都是有用的，绝对没有垃圾空占内存。怎么样？传统、朴素的C++是不是更胜一筹？</span></p>
<p><span>据统计，目前的Java</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>运行期间占用的内存通常为对应C++</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>的4-20倍。除了其它的原因，上面所说的是一个<br />
非常主要的因素。我们对memory leak如此愤恨，不就是因为它导致大量的内存垃圾得不到清除吗？如果有了<br />
GC之后，垃圾比以前还来势汹汹，那么GC又有什么好处呢？</span></p>
<p><span>当然，C++的smart pointer现在会使用的人不多，所以现在的C++</span><a href="http://www.chinaitpower.com/Dev/index.html" target="_blank"><span>程序</span></a><span>普遍存在更严重的memory leak问题。<br />
但是，如果我奶奶跟舒马赫比赛车输掉了，你能够埋怨那辆车子么？<br />
http://www.594k.com/java/html/y2007m1/12051/</span></p>
<img src ="http://www.blogjava.net/coolfiry/aggbug/152260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2007-10-12 10:43 <a href="http://www.blogjava.net/coolfiry/archive/2007/10/12/152260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从LiveJournal后台发展看大规模网站性能优化方法</title><link>http://www.blogjava.net/coolfiry/archive/2007/09/29/149681.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Sat, 29 Sep 2007 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2007/09/29/149681.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/149681.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2007/09/29/149681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/149681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/149681.html</trackback:ping><description><![CDATA[<h3>从LiveJournal后台发展看大规模网站性能优化方法</h3>
<h2>一、LiveJournal发展历程</h2>
<p><a href="http://www.livejournal.com/">LiveJournal</a>是99年始于校园中的项目，几个人出于爱好做了这样一个应用，以实现以下功能： </p>
<ul>
    <li>博客，论坛
    <li>社会性网络，找到朋友
    <li>聚合，把朋友的文章聚合在一起 </li>
</ul>
<p>LiveJournal采用了大量的开源软件，甚至它本身也是一个开源软件。 </p>
<p>在上线后，LiveJournal实现了非常快速的增长：</p>
<ul>
    <li>2004年4月份：280万注册用户。
    <li>2005年4月份：680万注册用户。
    <li>2005年8月份：790万注册用户。
    <li>达到了每秒钟上千次的页面请求及处理。
    <li>使用了大量MySQL服务器。
    <li>使用了大量通用组件。 </li>
</ul>
<h2>二、LiveJournal架构现状概况</h2>
<p><img height="445" alt="livejournal_backend.png" src="http://www.example.net.cn/archives/livejournal_backend.png" width="600" /><br />
<br />
</p>
<h2>三、从LiveJournal发展中学习</h2>
<p>&nbsp;</p>
<p>LiveJournal从1台服务器发展到100台服务器，这其中经历了无数的伤痛，但同时也摸索出了解决这些问题的方法，通过对LiveJournal的学习，可以让我们避免LJ曾经犯过的错误，并且从一开始就对系统进行良好的设计，以避免后期的痛苦。</p>
<p>下面我们一步一步看LJ发展的脚步。</p>
<div id="a000073more">
<div id="more">
<h2>1、一台服务器</h2>
<p>一 台别人捐助的服务器，LJ最初就跑在上面，就像Google开始时候用的破服务器一样，值得我们尊敬。这个阶段，LJ的人以惊人的速度熟悉的Unix的操 作管理，服务器性能出现过问题，不过还好，可以通过一些小修小改应付过去。在这个阶段里LJ把CGI升级到了FastCGI。</p>
<p>最终问题出现了，网站越来越慢，已经无法通过优过化来解决的地步，需要更多的服务器，这时LJ开始提供付费服务，可能是想通过这些钱来购买新的服务器，以解决当时的困境。<br />
毫无疑问，当时LJ存在巨大的单点问题，所有的东西都在那台服务器的铁皮盒子里装着。</p>
<p><img height="187" alt="LJ-backend-7.png" src="http://www.example.net.cn/archives/LJ-backend-7.png" width="500" /></p>
<h2>2、两台服务器</h2>
<p>用付费服务赚来的钱LJ买了两台服务器：一台叫做Kenny的Dell 6U机器用于提供Web服务，一台叫做Cartman的Dell 6U服务器用于提供数据库服务。</p>
<p><img height="279" alt="LJ-backend-8.png" src="http://www.example.net.cn/archives/LJ-backend-8.png" width="218" /></p>
<p>LJ有了更大的磁盘，更多的计算资源。但同时网络结构还是非常简单，每台机器两块网卡，Cartman通过内网为Kenny提供MySQL数据库服务。<br />
<br />
暂时解决了负载的问题，新的问题又出现了：</p>
<ul>
    <li>原来的一个单点变成了两个单点。
    <li>没有冷备份或热备份。
    <li>网站速度慢的问题又开始出现了，没办法，增长太快了。
    <li>Web服务器上CPU达到上限，需要更多的Web服务器。 </li>
</ul>
<h2>3、四台服务器</h2>
<p>又买了两台，Kyle和Stan，这次都是1U的，都用于提供Web服务。目前LJ一共有3台Web服务器和一台数据库服务器。这时需要在3台Web服务器上进行负载均横。</p>
<p><img height="241" alt="LJ-backend-9.png" src="http://www.example.net.cn/archives/LJ-backend-9.png" width="499" /></p>
<p>LJ把Kenny用于外部的网关，使用mod_backhand进行负载均横。</p>
<p>然后问题又出现了：</p>
<ul>
    <li>单点故障。数据库和用于做网关的Web服务器都是单点，一旦任何一台机器出现问题将导致所有服务不可用。虽然用于做网关的Web服务器可以通过保持心跳同步迅速切换，但还是无法解决数据库的单点，LJ当时也没做这个。
    <li>网站又变慢了，这次是因为IO和数据库的问题，问题是怎么往应用里面添加数据库呢？ </li>
</ul>
<h2>4、五台服务器</h2>
<p>又买了一台数据库服务器。在两台数据库服务器上使用了数据库同步(Mysql支持的Master-Slave模式)，写操作全部针对主数据库（通过Binlog，主服务器上的写操作可以迅速同步到从服务器上），读操作在两个数据库上同时进行(也算是负载均横的一种吧)。</p>
<p><img height="265" alt="LJ-backend-10.png" src="http://www.example.net.cn/archives/LJ-backend-10.png" width="500" /></p>
<p>实现同步时要注意几个事项：</p>
<ul>
    <li>读操作数据库选择算法处理，要选一个当前负载轻一点的数据库。
    <li>在从数据库服务器上只能进行读操作
    <li>准备好应对同步过程中的延迟，处理不好可能会导致数据库同步的中断。只需要对写操作进行判断即可，读操作不存在同步问题。 </li>
</ul>
<h2>5、更多服务器</h2>
<p>有钱了，当然要多买些服务器。部署后快了没多久，又开始慢了。这次有更多的Web服务器，更多的数据库服务器，存在 IO与CPU争用。于是采用了BIG-IP作为负载均衡解决方案。</p>
<p><img height="483" alt="LJ-backend-11.png" src="http://www.example.net.cn/archives/LJ-backend-11.png" width="453" /></p>
<h2>6、现在我们在哪里：</h2>
<p><img height="357" alt="LJ-backend-1.png" src="http://www.example.net.cn/archives/LJ-backend-1.png" width="600" /></p>
<p>现在服务器基本上够了，但性能还是有问题，原因出在架构上。</p>
<p>数据库的架构是最大的问题。由于增加的数据库都是以Slave模式添加到应用内，这样唯一的好处就是将读操作分布到了多台机器，但这样带来的后果就是写操作被大量分发，每台机器都要执行，服务器越多，浪费就越大，随着写操作的增加，用于服务读操作的资源越来越少。</p>
<p><img height="195" alt="LJ-backend-2.png" src="http://www.example.net.cn/archives/LJ-backend-2.png" width="500" /></p>
<p>由一台分布到两台</p>
<p><img height="273" alt="LJ-backend-3.png" src="http://www.example.net.cn/archives/LJ-backend-3.png" width="500" /></p>
<p>最终效果</p>
<p>现在我们发现，我们并不需要把这些数据在如此多的服务器上都保留一份。服务器上已经做了RAID，数据库也进行了备份，这么多的备份完全是对资源的浪费，属于冗余极端过度。那为什么不把数据分布存储呢？</p>
<p>问题发现了，开始考虑如何解决。现在要做的就是把不同用户的数据分布到不同的服务器上进行存储，以实现数据的分布式存储，让每台机器只为相对固定的用户服务，以实现平行的架构和良好的可扩展性。</p>
<p>为 了实现用户分组，我们需要为每一个用户分配一个组标记，用于标记此用户的数据存放在哪一组数据库服务器中。每组数据库由一个master及几个slave 组成，并且slave的数量在2-3台，以实现系统资源的最合理分配，既保证数据读操作分布，又避免数据过度冗余以及同步操作对系统资源的过度消耗。</p>
<p><img height="324" alt="LJ-backend-4.png" src="http://www.example.net.cn/archives/LJ-backend-4.png" width="500" /></p>
<p>由一台（一组）中心服务器提供用户分组控制。所有用户的分组信息都存储在这台机器上，所有针对用户的操作需要先查询这台机器得到用户的组号，然后再到相应的数据库组中获取数据。</p>
<p>这样的用户架构与目前LJ的架构已经很相像了。</p>
<p>在具体的实现时需要注意几个问题：</p>
<ul>
    <li>在数据库组内不要使用自增ID，以便于以后在数据库组之间迁移用户，以实现更合理的I/O，磁盘空间及负载分布。
    <li>将userid，postid存储在全局服务器上，可以使用自增，数据库组中的相应值必须以全局服务器上的值为准。全局服务器上使用事务型数据库InnoDB。
    <li>在数据库组之间迁移用户时要万分小心，当迁移时用户不能有写操作。 </li>
</ul>
<h2>7、现在我们在哪里</h2>
<p><img height="365" alt="LJ-backend-5.png" src="http://www.example.net.cn/archives/LJ-backend-5.png" width="500" /></p>
<p>问题：</p>
<ul>
    <li>一个全局主服务器，挂掉的话所有用户注册及写操作就挂掉。
    <li>每个数据库组一个主服务器，挂掉的话这组用户的写操作就挂掉。
    <li>数据库组从服务器挂掉的话会导致其它服务器负载过大。 </li>
</ul>
<p>对于Master-Slave模式的单点问题，LJ采取了Master-Master模式来解决。所谓Master-Master实际上是人工实现的，并不是由MySQL直接提供的，实际上也就是两台机器同时是Master，也同时是Slave，互相同步。</p>
<p>Master-Master实现时需要注意：</p>
<ul>
    <li>一个Master出错后恢复同步，最好由服务器自动完成。
    <li>数字分配，由于同时在两台机器上写，有些ID可能会冲突。 </li>
</ul>
<p>解决方案：<br />
</p>
<ul>
    <li>奇偶数分配ID，一台机器上写奇数，一台机器上写偶数
    <li>通过全局服务器进行分配(LJ采用的做法)。 </li>
</ul>
<p>&nbsp;</p>
<p>Master-Master模式还有一种用法，这种方法与前一种相比，仍然保持两台机器的同步，但只有一台机器提供服务（读和写），在每天晚上的时候进行轮换，或者出现问题的时候进行切换。</p>
<h2>8、现在我们在哪里</h2>
<p><img height="349" alt="LJ-backend-6.png" src="http://www.example.net.cn/archives/LJ-backend-6.png" width="500" /></p>
<p>现在插播一条广告，MyISAM VS InnoDB。</p>
<p>使用InnoDB：</p>
<ul>
    <li>支持事务
    <li>需要做更多的配置，不过值得，可以更安全的存储数据，以及得到更快的速度。 </li>
</ul>
<p>使用MyISAM：</p>
<ul>
    <li>记录日志（LJ用它来记网络访问日志）
    <li>存储只读静态数据，足够快。
    <li>并发性很差，无法同时读写数据（添加数据可以）
    <li>MySQL非正常关闭或死机时会导致索引错误，需要使用myisamchk修复，而且当访问量大时出现非常频繁。 </li>
</ul>
<h2>9、缓存</h2>
<p>去年我写过<a href="http://www.example.net.cn/archives/2006/01/eoamemcachedoea.html">一篇文章介绍memcached</a>，它就是由LJ的团队开发的一款缓存工具，以key-value的方式将数据存储到分布的内存中。LJ缓存的数据：</p>
<ul>
    <li>12台独立服务器（不是捐赠的）
    <li>28个实例
    <li>30GB总容量
    <li>90-93%的命中率（用过squid的人可能知道，squid内存加磁盘的命中率大概在70-80%） </li>
</ul>
<p>如何建立缓存策略？</p>
<p>想缓存所有的东西？那是不可能的，我们只需要缓存已经或者可能导致系统瓶颈的地方，最大程度的提交系统运行效率。通过对MySQL的日志的分析我们可以找到缓存的对象。</p>
<p>缓存的缺点？</p>
<ul>
    <li>没有完美的事物，缓存也有缺点：
    <li>增大开发量，需要针对缓存处理编写特殊的代码。
    <li>管理难度增加，需要更多人参与系统维护。
    <li>当然大内存也需要钱。 </li>
</ul>
<h2>10、Web访问负载均衡</h2>
<p>在数据包级别使用BIG-IP，但BIG-IP并不知道我们内部的处理机制，无法判断由哪台服务器对这些请求进行处理。反向代理并不能很好的起到作用，不是已经够快了，就是达不到我们想要的效果。</p>
<p>所以，LJ又开发了<a href="http://www.danga.com/perlbal/">Perlbal</a>。特点：</p>
<ul>
    <li>快，小，可管理的http web 服务器/代理
    <li>可以在内部进行转发
    <li>使用Perl开发
    <li>单线程，异步，基于事件，使用epoll , kqueue
    <li>支持Console管理与http远程管理，支持动态配置加载
    <li>多种模式：web服务器，反向代理，插件
    <li>支持插件：GIF/PNG互换？ </li>
</ul>
<h2>11、MogileFS</h2>
<p>LJ使用开源的<a href="http://www.danga.com/mogilefs/">MogileFS</a>作为分布式文件存储系统。MogileFS使用非常简单，它的主要设计思想是：</p>
<ul>
    <li>文件属于类（类是最小的复制单位）
    <li>跟踪文件存储位置
    <li>在不同主机上存储
    <li>使用MySQL集群统一存储分布信息
    <li>大容易廉价磁盘 </li>
</ul>
<p>到目前为止就这么多了，更多文档可以在<a href="http://www.danga.com/words/">http://www.danga.com/words/</a>找到。<a href="http://www.danga.com/">Danga.com</a>和<a href="http://www.livejournal.com/">LiveJournal.com</a>的 同学们拿这个文档参加了两次MySQL Con，两次OS Con，以及众多的其它会议，无私的把他们的经验分享出来，值得我们学习。在web2.0时代快速开发得到大家越来越多的重视，但良好的设计仍是每一个应 用的基础，希望web2.0们在成长为Top500网站的路上，不要因为架构阻碍了网站的发展。</p>
&nbsp;http://blog.csdn.net/xmr_gxcfe/archive/2007/09/14/1785292.aspx</div>
</div>
<p>&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/coolfiry/aggbug/149681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2007-09-29 21:26 <a href="http://www.blogjava.net/coolfiry/archive/2007/09/29/149681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转Windows快速创建大文件的三种方法</title><link>http://www.blogjava.net/coolfiry/archive/2007/09/25/148051.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Tue, 25 Sep 2007 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2007/09/25/148051.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/148051.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2007/09/25/148051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/148051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/148051.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/coolfiry/aggbug/148051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2007-09-25 14:30 <a href="http://www.blogjava.net/coolfiry/archive/2007/09/25/148051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML标识</title><link>http://www.blogjava.net/coolfiry/archive/2007/06/10/123212.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Sun, 10 Jun 2007 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/coolfiry/archive/2007/06/10/123212.html</guid><wfw:comment>http://www.blogjava.net/coolfiry/comments/123212.html</wfw:comment><comments>http://www.blogjava.net/coolfiry/archive/2007/06/10/123212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/coolfiry/comments/commentRss/123212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coolfiry/services/trackbacks/123212.html</trackback:ping><description><![CDATA[UML类图的各种标识法 <br>关键字:&nbsp;&nbsp; UML&nbsp;&nbsp;&nbsp;&nbsp; <br>&#183;------&gt;虚线箭头表示依赖关系（dependency），一个类需要与另外一个类一起工作，是它一种最弱的关联关系，常见于各种工具类之间的关系<br>&#183;——实线表示联合关系（association），一个类包含对另外一个类对象的引用，这个通常是使用属性来实现的，为了表明之间的包含关系，有时候会在实线的一端加上箭头（navigability arrow）来表示导航关系，如果关联的双方又都和第三个类有关联关系，那么可以在实线的中间加一个虚线和第三个类关联来表示这种association classes关系<br>&#183;◇——空心菱形加实线表示聚合关系（aggregation），它是一种更强的关联关系，表示一个类可以拥有或者享有一个类的实例对象，在java代码表现上跟联合是一样的。<br>&#183;◆——实心菱形加实线表示组合关系（composition），它的关联性比聚合更强，被组合的对象是组合对象的一部分，没法跟其他的对象共享，而且如果组合对象销毁的话，被组合的对象也会同时被销毁，其表现形式跟联合一样<br>&#183;空心箭头加实线，表示泛化generalization（继承inheritance）关系，这个很简单<br>&#183;在rose中要建立enumeration，只需要在建立的class中将其stereotype设置为enumeration即可。stereotype只是用来做一个标记，并不包含别的意义 <br>
<img src ="http://www.blogjava.net/coolfiry/aggbug/123212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coolfiry/" target="_blank">Coolfiry</a> 2007-06-10 18:03 <a href="http://www.blogjava.net/coolfiry/archive/2007/06/10/123212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>