<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘少宁的博客</title>
	<atom:link href="http://www.gosoa.com.cn/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gosoa.com.cn</link>
	<description>专注于高性能LAMP架构分析与实践</description>
	<lastBuildDate>Mon, 30 Apr 2012 09:24:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Linux服务器性能评估与优化</title>
		<link>http://www.gosoa.com.cn/linux%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%80%a7%e8%83%bd%e8%af%84%e4%bc%b0%e4%b8%8e%e4%bc%98%e5%8c%96</link>
		<comments>http://www.gosoa.com.cn/linux%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%80%a7%e8%83%bd%e8%af%84%e4%bc%b0%e4%b8%8e%e4%bc%98%e5%8c%96#comments</comments>
		<pubDate>Mon, 30 Apr 2012 09:24:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux开发]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[linux性能]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=661</guid>
		<description><![CDATA[一、影响Linux服务器性能的因素 1. 操作系统级   Ø       CPU Ø       内存 Ø       磁盘I/O带宽 Ø       网络I/O带宽   2.        程序应用级   二、系统性能评估标准 &#160; 影响性能因素 评判标准 好 坏 糟糕 CPU user% + sys%&#60; 70% user% + sys%= 85% user% + sys% &#62;=90% 内存 Swap In（si）＝0 Swap Out（so）＝0 Per CPU with 10 page/s More Swap In &#38; Swap Out 磁盘 iowait % &#60; 20% iowait % =35% iowait [...]]]></description>
			<content:encoded><![CDATA[<p align="left">
<p align="left"><strong>一、影响Linux服务器性能的因素</strong></p>
<p align="left"><strong><span style="font-family: 'Times New Roman';">1. </span></strong><strong>操作系统级</strong></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left">Ø       <span style="font-family: 'Times New Roman';"><strong>CPU</strong></span></p>
<p align="left">Ø       <strong>内存</strong></p>
<p align="left">Ø       <strong>磁盘</strong><strong><span style="font-family: 'Times New Roman';">I/O</span></strong><strong>带宽</strong></p>
<p align="left">Ø       <strong>网络</strong><strong><span style="font-family: 'Times New Roman';">I/O</span></strong><strong>带宽</strong></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong><span style="font-family: 'Times New Roman';">2.        </span></strong><strong>程序</strong><strong>应用级</strong></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>二、系统性能评估标准</strong></p>
<p>&nbsp;</p>
<table width="571" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td rowspan="2" width="103">
<p align="center">影响性能因素</p>
</td>
<td colspan="3" width="468">
<p align="center">评判标准</p>
</td>
</tr>
<tr>
<td width="156">
<p align="center">好</p>
</td>
<td width="156">
<p align="center">坏</p>
</td>
<td width="156">
<p align="center">糟糕</p>
</td>
</tr>
<tr>
<td width="103">
<p align="center">CPU</p>
</td>
<td valign="top" width="156">
<p align="left">user% + sys%&lt; 70%</p>
</td>
<td valign="top" width="156">
<p align="left">user% + sys%= 85%</p>
</td>
<td valign="top" width="156">
<p align="left">user% + sys% &gt;=90%</p>
</td>
</tr>
<tr>
<td width="103">
<p align="center">内存</p>
</td>
<td valign="top" width="156">
<p align="left">Swap In（si）＝0</p>
<p align="left">Swap Out（so）＝0</p>
</td>
<td valign="top" width="156">
<p align="left">Per CPU with 10 page/s</p>
</td>
<td valign="top" width="156">
<p align="left">More Swap In &amp; Swap Out</p>
</td>
</tr>
<tr>
<td width="103">
<p align="center">磁盘</p>
</td>
<td valign="top" width="156">
<p align="left">iowait % &lt; 20%</p>
</td>
<td valign="top" width="156">
<p align="left">iowait % =35%</p>
</td>
<td valign="top" width="156">
<p align="left">iowait % &gt;= 50%</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p align="left">
<span style="font-family: 'Times New Roman';"> </span></p>
<p align="left">其中：</p>
<p align="left">       %user：表示CPU处在用户模式下的时间百分比。</p>
<p align="left">       %sys：表示CPU处在<a href="http://www.baidu.com/baidu?tn=jbh270&amp;word=site:33369.com%20" target="_blank"><span style="text-decoration: underline;">系统</span></a>模式下的时间百分比。</p>
<p align="left">       %iowait：表示CPU等待输入输出完成时间的百分比。</p>
<p align="left">       swap in：即si，表示虚拟内存的页导入，即从SWAP DISK交换到RAM</p>
<p align="left">       swap out：即so，表示虚拟内存的页导出，即从RAM交换到SWAP DISK。</p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>三、系统性能分析工具</strong></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>1.</strong><strong>常用系统命令</strong><strong> </strong></p>
<p align="left">Vmstat、sar、iostat、netstat、free、ps、top等</p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>2.</strong><strong>常用组合方式</strong><strong> </strong></p>
<p align="left">•           用vmstat、sar、iostat检测是否是CPU瓶颈</p>
<p align="left">•           用free、vmstat检测是否是内存瓶颈</p>
<p align="left">•           用iostat检测是否是磁盘I/O瓶颈</p>
<p align="left">•           用netstat检测是否是网络带宽瓶颈</p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>四、Linux性能评估与优化</strong></p>
<p align="left">
<p align="left"><strong>1. </strong><strong>系统整体性能评估（</strong><strong>uptime</strong><strong>命令）</strong></p>
<p align="left">
<p align="left">[root@web1 ~]# uptime</p>
<p align="left">16:38:00 up 118 days,  3:01,  5 users,  load average: 1.22, 1.02, 0.91</p>
<p align="left">这里需要注意的是：load average这个输出值，这三个值的大小一般不能大于系统CPU的个数，例如，本输出中系统有8个CPU,如果load average的三个值长期大于8时，说明CPU很繁忙，负载很高，可能会影响系统性能，但是偶尔大于8时，倒不用担心，一般不会影响系统性能。相反，如果load average的输出值小于CPU的个数，则表示CPU还有空闲的时间片，比如本例中的输出，CPU是非常空闲的。</p>
<p align="left">
<p align="left"><strong>2. CPU</strong><strong>性能评估</strong></p>
<p align="left">
<p align="left">（1）利用vmstat命令监控系统CPU</p>
<p align="left">   该命令可以显示关于系统各种资源之间相关性能的简要信息，这里我们主要用它来看CPU一个负载情况。</p>
<p align="left">   下面是vmstat命令在某个系统的输出结果：</p>
<p align="left">
<p align="left">[root@node1 ~]# vmstat 2 3</p>
<p align="left">procs &#8212;&#8212;&#8212;&#8211;memory&#8212;&#8212;&#8212;-  &#8212;swap&#8211;  &#8212;&#8211;io&#8212;- &#8211;system&#8211;  &#8212;&#8211;cpu&#8212;&#8212;</p>
<p align="left"> r  b   swpd   free      buff  cache   si   so    bi    bo       in     cs     us sy  id   wa st</p>
<p align="left"> 0  0    0    162240   8304  67032   0    0    13    21   1007   23     0  1   98   0   0</p>
<p align="left"> 0  0    0    162240   8304  67032   0    0     1     0     1010   20     0  1   100 0   0</p>
<p align="left"> 0  0    0    162240   8304  67032   0    0     1     1     1009   18     0  1    99  0   0</p>
<p align="left">l        Procs</p>
<p align="left">     r列表示运行和等待cpu时间片的进程数，这个值如果长期大于系统CPU的个数，说明CPU不足，需要增加CPU。</p>
<p align="left">     b列表示在等待资源的进程数，比如正在等待I/O、或者内存交换等。</p>
<p align="left">l        Cpu</p>
<p align="left"><strong>    </strong>us列显示了用户进程消耗的CPU 时间百分比。us的值比较高时，说明用户进程消耗的cpu时间多，但是如果长期大于50%，就需要考虑优化程序或算法。</p>
<p align="left">     sy列显示了内核进程消耗的CPU时间百分比。Sy的值较高时，说明内核消耗的CPU资源很多。</p>
<p align="left">    根据经验，us+sy的参考值为80%，如果us+sy大于 80%说明可能存在CPU资源不足。</p>
<p align="left">
<p align="left"><strong>（2）利用sar命令监控系统CPU</strong></p>
<p align="left">
<p align="left">sar功能很强大，可以对系统的每个方面进行单独的统计，但是使用sar命令会增加系统开销，不过这些开销是可以评估的，对系统的统计结果不会有很大影响。</p>
<p align="left"> 下面是sar命令对某个系统的CPU统计输出：</p>
<p align="left">[root@webserver ~]# sar -u 3 5</p>
<p align="left">Linux 2.6.9-42.ELsmp (webserver)        11/28/2008      _i686_  (8 CPU)</p>
<p align="left">11:41:24 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle</p>
<p align="left">11:41:27 AM     all      0.88      0.00      0.29      0.00      0.00     98.83</p>
<p align="left">11:41:30 AM     all      0.13      0.00      0.17      0.21      0.00     99.50</p>
<p align="left">11:41:33 AM     all      0.04      0.00      0.04      0.00      0.00     99.92</p>
<p align="left">11:41:36 AM     all      <strong>90.08     0.00      0.13      0.16      0.00     9.63</strong></p>
<p align="left">11:41:39 AM     all      0.38      0.00      0.17      0.04      0.00     99.41</p>
<p align="left">Average:        all      0.34      0.00      0.16      0.05      0.00     99.45</p>
<p align="left">
<p align="left">对上面每项的输出解释如下：</p>
<p align="left">l        %user列显示了用户进程消耗的CPU 时间百分比。</p>
<p align="left">l        %nice列显示了运行正常进程所消耗的CPU 时间百分比。</p>
<p align="left">l        %system列显示了系统进程消耗的CPU时间百分比。</p>
<p align="left">l        %iowait列显示了IO等待所占用的CPU时间百分比</p>
<p align="left">l        %steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。</p>
<p align="left">l        %idle列显示了CPU处在空闲状态的时间百分比。</p>
<p align="left">
<p align="left">问题</p>
<p align="left">1.<strong>你是否遇到过系统CPU整体利用率不高，而应用缓慢的现象？</strong></p>
<p align="left">       在一个多CPU的系统中，如果程序使用了单线程，会出现这么一个现象，CPU的整体使用率不高，但是系统应用却响应缓慢，这可能是由于程序使用单线程的原因，单线程只使用一个CPU，导致这个CPU占用率为100%，无法处理其它请求，而其它的CPU却闲置，这就导致了整体CPU使用率不高，而应用缓慢现象的发生。</p>
<p align="left">
<p align="left"><strong>3. </strong><strong>内存性能评估</strong></p>
<p align="left"><strong>（</strong><strong><span style="font-family: 'Times New Roman';">1</span></strong><strong>）利用</strong><strong><span style="font-family: 'Times New Roman';">free</span></strong><strong>指令监控内存</strong></p>
<p align="left">free是监控linux内存使用状况最常用的指令，看下面的一个输出：</p>
<p align="left">[root@webserver ~]# free  -m</p>
<p align="left">                total         used       free     shared    buffers     cached</p>
<p align="left">Mem:       8111       7185        926          0        243           6299</p>
<p align="left">-/+ buffers/cache:     643       7468</p>
<p align="left">Swap:       8189          0         8189</p>
<p align="left">     一般有这样一个经验公式：应用程序可用内存/系统物理内存&gt;70%时，表示系统内存资源非常充足，不影响系统性能，应用程序可用内存/系统物理内存&lt;20%时，表示系统内存资源紧缺，需要增加系统内存，20%&lt;应用程序可用内存/系统物理内存&lt;70%时，表示系统内存资源基本能满足应用需求，暂时不影响系统性能。</p>
<p align="left">3.内存性能评估</p>
<p align="left">
<p align="left"><strong>（</strong><strong><span style="font-family: 'Times New Roman';">1</span></strong><strong>）利用</strong><strong><span style="font-family: 'Times New Roman';">free</span></strong><strong>指令监控内存</strong></p>
<p align="left">free是监控linux内存使用状况最常用的指令，看下面的一个输出：</p>
<p align="left">[root@webserver ~]# free  -m</p>
<p align="left">                total         used       free     shared    buffers     cached</p>
<p align="left">Mem:       8111       7185        926          0        243           6299</p>
<p align="left">-/+ buffers/cache:     643       7468</p>
<p align="left">Swap:       8189          0         8189</p>
<p align="left">     一般有这样一个经验公式：应用程序可用内存/系统物理内存&gt;70%时，表示系统内存资源非常充足，不影响系统性能，应用程序可用内存/系统物理内存&lt;20%时，表示系统内存资源紧缺，需要增加系统内存，20%&lt;应用程序可用内存/系统物理内存&lt;70%时，表示系统内存资源基本能满足应用需求，暂时不影响系统性能。</p>
<p align="left">
<p align="left"><strong>（</strong><strong><span style="font-family: 'Times New Roman';">2</span></strong><strong>）</strong><strong>利用</strong><strong><span style="font-family: 'Times New Roman';">vmstat</span></strong><strong>命令监控内存</strong></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><span style="font-family: 'Times New Roman';">[root@node1 ~]# vmstat 2 3</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">procs &#8212;&#8212;&#8212;&#8211;memory&#8212;&#8212;&#8212;-  &#8212;swap&#8211;  &#8212;&#8211;io&#8212;- &#8211;system&#8211;  &#8212;&#8211;cpu&#8212;&#8212;</span></p>
<p align="left"><span style="font-family: 'Times New Roman';"> r  b   swpd   free      buff  cache   si   so    bi    bo       in     cs     us sy  id  wa st</span></p>
<p align="left"><span style="font-family: 'Times New Roman';"> 0  0    0    162240   8304  67032   0    0    13    21   1007   23     0  1  98   0  0</span></p>
<p align="left"><span style="font-family: 'Times New Roman';"> 0  0    0    162240   8304  67032   0    0     1     0     1010   20     0  1  100 0  0</span></p>
<p align="left"><span style="font-family: 'Times New Roman';"> 0  0    0    162240   8304  67032   0    0     1     1     1009   18     0  1  99   0  0</span></p>
<p align="left">l        <span style="font-family: 'Times New Roman';">memory</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">         swpd</span>列表示切换到内存交换区的内存数量（以<span style="font-family: 'Times New Roman';">k</span>为单位）。如果<span style="font-family: 'Times New Roman';">swpd</span>的值不为<span style="font-family: 'Times New Roman';">0</span>，或者比较大，只要<span style="font-family: 'Times New Roman';">si</span>、<span style="font-family: 'Times New Roman';">so</span>的值长期为<span style="font-family: 'Times New Roman';">0</span>，这种情况下一般不用担心，不会影响系统性能。</p>
<p align="left"><span style="font-family: 'Times New Roman';">         free</span>列表示当前空闲的物理内存数量（以<span style="font-family: 'Times New Roman';">k</span>为单位）</p>
<p align="left"><span style="font-family: 'Times New Roman';">         buff</span>列表示<span style="font-family: 'Times New Roman';">buffers cache</span>的内存数量，一般对块设备的读写才需要缓冲。</p>
<p align="left"><span style="font-family: 'Times New Roman';">         cache</span>列表示<span style="font-family: 'Times New Roman';">page cached</span>的内存数量，一般作为文件系统<span style="font-family: 'Times New Roman';">cached</span>，频繁访问的文件都会被<span style="font-family: 'Times New Roman';">cached</span>，如果<span style="font-family: 'Times New Roman';">cache</span>值较大，说明<span style="font-family: 'Times New Roman';">cached</span>的文件数较多，如果此时<span style="font-family: 'Times New Roman';">IO</span>中<span style="font-family: 'Times New Roman';">bi</span>比较小，说明文件系统效率比较好。</p>
<p align="left">l        <span style="font-family: 'Times New Roman';">swap</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">si</span>列表示由磁盘调入内存，也就是内存进入内存交换区的数量。</p>
<p align="left"><span style="font-family: 'Times New Roman';">so</span>列表示由内存调入磁盘，也就是内存交换区进入内存的数量。</p>
<p align="left">一般情况下，<span style="font-family: 'Times New Roman';">si</span>、<span style="font-family: 'Times New Roman';">so</span>的值都为<span style="font-family: 'Times New Roman';">0</span>，如果<span style="font-family: 'Times New Roman';">si</span>、<span style="font-family: 'Times New Roman';">so</span>的值长期不为<span style="font-family: 'Times New Roman';">0</span>，则表示系统内存不足。需要增加系统内存。</p>
<p align="left"><strong> </strong></p>
<p align="left"><strong>4.</strong><strong>磁盘</strong><strong>I/O</strong><strong>性能评估</strong><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>（</strong><strong><span style="font-family: 'Times New Roman';">1</span></strong><strong>）磁盘存储基础</strong></p>
<p align="left">l        <span style="font-family: 'Times New Roman';">     </span>熟悉<span style="font-family: 'Times New Roman';">RAID</span>存储方式，可以根据应用的不同，选择不同的<span style="font-family: 'Times New Roman';">RAID</span>方式。</p>
<p align="left">l        <span style="font-family: 'Times New Roman';">     </span>尽可能用内存的读写代替直接磁盘<span style="font-family: 'Times New Roman';">I/O</span>，使频繁访问的文件或数据放入内存中进行操作处理，因为内存读写操作比直接磁盘读写的效率要高千倍。</p>
<p align="left">l        <span style="font-family: 'Times New Roman';">     </span>将经常进行读写的文件与长期不变的文件独立出来，分别放置到不同的磁盘设备上。</p>
<p align="left">l        <span style="font-family: 'Times New Roman';">      </span>对于写操作频繁的数据，可以考虑使用裸设备代替文件系统。</p>
<p align="left"><span style="font-family: 'Times New Roman';">        </span></p>
<p align="left"><span style="font-family: 'Times New Roman';">       </span>使用裸设备的优点有：</p>
<p align="left">ü        <span style="font-family: 'Times New Roman';">   </span>数据可以直接读写，不需要经过操作系统级的缓存，节省了内存资源，避免了内存资源争用。</p>
<p align="left">ü        <span style="font-family: 'Times New Roman';">   </span>避免了文件系统级的维护开销，比如文件系统需要维护超级块、<span style="font-family: 'Times New Roman';">I-node</span>等。</p>
<p align="left">ü        <span style="font-family: 'Times New Roman';">   </span>避免了操作系统的<span style="font-family: 'Times New Roman';">cache</span>预读功能，减少了<span style="font-family: 'Times New Roman';">I/O</span>请求。</p>
<p align="left"><span style="font-family: 'Times New Roman';">       </span>使用裸设备的缺点是：</p>
<p align="left">ü        <span style="font-family: 'Times New Roman';">    </span>数据管理、空间管理不灵活，需要很专业的人来操作。</p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>（2）利用iostat评估磁盘性能</strong></p>
<p align="left"><span style="font-family: 'Times New Roman';">[root@webserver ~]#   iostat -d 2 3</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">Linux 2.6.9-42.ELsmp (webserver)        12/01/2008      _i686_  (8 CPU)</span></p>
<p align="left">
<p align="left"><span style="font-family: 'Times New Roman';">Device:         tps   Blk_read/s   Blk_wrtn/s   Blk_read      Blk_wrtn</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">sda               1.87         2.58       114.12        6479462     286537372</span></p>
<p align="left">
<p align="left"><span style="font-family: 'Times New Roman';">Device:         tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">sda               0.00         0.00         0.00              0                0</span></p>
<p align="left">
<p align="left"><span style="font-family: 'Times New Roman';">Device:         tps   Blk_read/s   Blk_wrtn/s   Blk_read    Blk_wrtn</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">sda               1.00         0.00        12.00             0                24</span></p>
<p align="left">对上面每项的输出解释如下：</p>
<p align="left"><span style="font-family: 'Times New Roman';">Blk_read/s</span>表示每秒读取的数据块数。</p>
<p align="left"><span style="font-family: 'Times New Roman';">Blk_wrtn/s</span>表示每秒写入的数据块数。</p>
<p align="left"><span style="font-family: 'Times New Roman';">Blk_read</span>表示读取的所有块数。</p>
<p align="left"><span style="font-family: 'Times New Roman';">Blk_wrtn</span>表示写入的所有块数。</p>
<p align="left">Ø       <span style="font-family: 'Times New Roman';">     </span>可以通过<span style="font-family: 'Times New Roman';">Blk_read/s</span>和<span style="font-family: 'Times New Roman';">Blk_wrtn/s</span>的值对磁盘的读写性能有一个基本的了解，如果<span style="font-family: 'Times New Roman';">Blk_wrtn/s</span>值很大，表示磁盘的写操作很频繁，可以考虑优化磁盘或者优化程序，如果<span style="font-family: 'Times New Roman';">Blk_read/s</span>值很大，表示磁盘直接读取操作很多，可以将读取的数据放入内存中进行操作。</p>
<p align="left">Ø       <span style="font-family: 'Times New Roman';">     </span>对于这两个选项的值没有一个固定的大小，根据系统应用的不同，会有不同的值，但是有一个规则还是可以遵循的：长期的、超大的数据读写，肯定是不正常的，这种情况一定会影响系统性能。</p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left">
<p align="left"><strong>（3）利用sar评估磁盘性能</strong></p>
<p align="left">         通过“sar –d”组合，可以对系统的磁盘IO做一个基本的统计，请看下面的一个输出：</p>
<p align="left">[root@webserver ~]# sar -d 2 3</p>
<p align="left">Linux 2.6.9-42.ELsmp (webserver)        11/30/2008      _i686_  (8 CPU)</p>
<p align="left">
<p align="left">11:09:33 PM  DEV     tps   rd_sec/s   wr_sec/s  avgrq-sz  avgqu-sz   await  svctm   %util</p>
<p align="left">11:09:35 PM dev8-0  0.00  0.00            0.00        0.00          0.00         0.00   0.00     0.00</p>
<p align="left">
<p align="left">11:09:35 PM  DEV     tps  rd_sec/s    wr_sec/s  avgrq-sz  avgqu-sz  await   svctm   %util</p>
<p align="left">11:09:37 PM dev8-0  1.00  0.00         12.00        12.00         0.00        0.00    0.00     0.00</p>
<p align="left">
<p align="left">11:09:37 PM   DEV    tps    rd_sec/s  wr_sec/s   avgrq-sz  avgqu-sz  await  svctm   %util</p>
<p align="left">11:09:39 PM dev8-0  1.99   0.00         47.76         24.00       0.00        0.50    0.25     0.05</p>
<p align="left">
<p align="left">Average:  DEV          tps    rd_sec/s   wr_sec/s  avgrq-sz  avgqu-sz    await  svctm   %util</p>
<p align="left">Average:  dev8-0      1.00   0.00          19.97         20.00       0.00         0.33    0.17     0.02</p>
<p align="left">      需要关注的几个参数含义：</p>
<p align="left">     await表示平均每次设备I/O操作的等待时间（以毫秒为单位）。</p>
<p align="left">     svctm表示平均每次设备I/O操作的服务时间（以毫秒为单位）。</p>
<p align="left">     %util表示一秒中有百分之几的时间用于I/O操作。</p>
<p align="left">
<p align="left">
<p align="left">对以磁盘IO性能，一般有如下评判标准：</p>
<p align="left">     正常情况下svctm应该是小于await值的，而svctm的大小和磁盘性能有关，CPU、内存的负荷也会对svctm值造成影响，过多的请求也会间接的导致svctm值的增加。</p>
<p align="left">     await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式，如果svctm的值与await很接近，表示几乎没有I/O等待，磁盘性能很好，如果await的值远高于svctm的值，则表示I/O队列等待太长，系统上运行的应用程序将变慢，此时可以通过更换更快的硬盘来解决问题。</p>
<p align="left">     %util项的值也是衡量磁盘I/O的一个重要指标，如果%util接近100%，表示磁盘产生的I/O请求太多，I/O系统已经满负荷的在工作，该磁盘可能存在瓶颈。长期下去，势必影响系统的性能，可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。</p>
<p align="left">
<p align="left"><strong>5. </strong><strong>网络性能评估</strong></p>
<p align="left">
<p align="left"><span style="font-family: 'Times New Roman';"><strong>（1）通过ping命令检测网络的连通性</strong></span></p>
<p align="left"><span style="font-family: 'Times New Roman';"><strong>（2）通过netstat –i组合检测网络接口状况</strong></span></p>
<p align="left"><span style="font-family: 'Times New Roman';"><strong>（3）通过netstat –r组合检测系统的路由表信息</strong></span></p>
<p align="left"><span style="font-family: 'Times New Roman';"><strong>（4）通过sar –n组合显示系统的网络运行状态</strong></span></p>
<p align="left">
<p align="left"><span style="font-family: 'Times New Roman';"><strong>五、Oracle在Linux下的性能优化</strong></span></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong><span style="font-family: 'Times New Roman';">Oracle</span></strong><strong>数据库内存参数的优化</strong></p>
<p align="left">Ø       <strong>与</strong><strong><span style="font-family: 'Times New Roman';">oracle</span></strong><strong>相关的系统内核参数</strong></p>
<p align="left">Ø       <strong><span style="font-family: 'Times New Roman';">SGA</span></strong><strong>、</strong><strong><span style="font-family: 'Times New Roman';">PGA</span></strong><strong>参数设置</strong></p>
<p align="left"><strong><span style="font-family: 'Times New Roman';"> </span></strong></p>
<p align="left"><strong><span style="font-family: 'Times New Roman';">Oracle</span></strong><strong>下磁盘存储性能优化</strong></p>
<p align="left">Ø       <strong>文件系统的选择（</strong><strong><span style="font-family: 'Times New Roman';">ext2/ext3</span></strong><strong>、</strong><strong><span style="font-family: 'Times New Roman';">xfs</span></strong><strong>、</strong><strong><span style="font-family: 'Times New Roman';">ocfs2</span></strong><strong>）</strong></p>
<p align="left">Ø       <strong><span style="font-family: 'Times New Roman';">Oracle  ASM</span></strong><strong>存储</strong></p>
<p align="left"><span style="font-family: 'Times New Roman';"><strong> 1.</strong><strong>优化oracle性能参数之前要了解的情况</strong></span></p>
<p align="left"><span style="font-family: 'Times New Roman';">1）物理内存有多大</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">2）操作系统估计要使用多大内存</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">3）数据库是使用文件系统还是裸设备</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">4）有多少并发连接</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">5）应用是OLTP类型还是OLAP类型</span></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><span style="font-family: 'Times New Roman';"><strong>2.oracle</strong><strong>数据库内存参数的优化</strong></span></p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left"><strong>（</strong><strong><span style="font-family: 'Times New Roman';">1</span></strong><strong>）系统内核参数</strong></p>
<p align="left">修改<span style="font-family: 'Times New Roman';"> /etc/sysctl.conf </span>这个文件，加入以下的语句：</p>
<p align="left"><span style="font-family: 'Times New Roman';">kernel.shmmax = 2147483648</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">kernel.shmmni = 4096</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">kernel.shmall = 2097152</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">kernel.sem = 250 32000 100 128</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">fs.file-max = 65536</span></p>
<p align="left"><span style="font-family: 'Times New Roman';">net.ipv4.ip_local_port_range = 1024 65000</span></p>
<p align="left">参数依次为：</p>
<p align="left"><span style="font-family: 'Times New Roman';">Kernel.shmmax<strong>:</strong></span>共享内存段的最大尺寸（以字节为单位）。</p>
<p align="left"><span style="font-family: 'Times New Roman';">Kernel.shmmni</span><strong>：</strong>系统中共享内存段的最大数量。</p>
<p align="left"><span style="font-family: 'Times New Roman';">Kernel.shmall</span>：共享内存总量，以页为单位。</p>
<p align="left"><span style="font-family: 'Times New Roman';">fs.file-max</span>：文件句柄数，表示在<span style="font-family: 'Times New Roman';">Linux</span>系统中可以打开的文件数量。</p>
<p align="left"><span style="font-family: 'Times New Roman';">net.ipv4.ip_local_port_range</span>：应用程序可使用的<span style="font-family: 'Times New Roman';">IPv4</span>端口范围。</p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span></p>
<p align="left">需要注意的几个问题</p>
<p align="left"><strong>关于Kernel.shmmax</strong></p>
<p align="left">     Oracle SGA 由共享内存组成，如果错误设置 SHMMAX可能会限制SGA 的大小，SHMMAX设置不足可能会导致以下问题：ORA-27123:unable to attach to shared memory segment，如果该参数设置小于Oracle SGA设置，那么SGA就会被分配多个共享内存段。这在繁忙的系统中可能成为性能负担，带来系统问题。</p>
<p align="left">     Oracle建议Kernel.shmmax最好大于sga，以让oracle共享内存区SGA在一个共享内存段中，从而提高性能。</p>
<p align="left"><strong>关于Kernel.shmall</strong></p>
<p align="left">     表示系统共享内存总大小，以页为单位。</p>
<p align="left">     一个32位的Linux系统，8G的内存，可以设置kernel.shmall = 2097152，即为： 2097152*4k/1024/1024 = 8G就是说可用共享内存一共8G，这里的4K是32位操作系统一页的大小，即4096字节。</p>
<p align="left"><strong>关于Kernel.shmmni</strong></p>
<p align="left">     表示系统中共享内存段的最大数量。系统默认是4096，一般无需修改，在SUN OS下还有Kernel.shmmin参数，表示共享内存段最小尺寸，勿要混肴！<br />
（2）SGA、PAG参数的设置</p>
<p align="left">
<p align="left"><strong><span style="font-family: 'Times New Roman';">A Oracle</span></strong><strong>在</strong><strong>内存管理方面的改进</strong></p>
<p align="left">     Oracle 9i通过参数PGA_AGGREGATE_TARGET参数实现PGA自动管理  Oracle 10g通过参数SGA_TARGET参数实现了SGA的自动管理，</p>
<p align="left">     Oracle 11g实现了数据库所有内存块的全自动化管理，使得动态管理SGA和PGA成为现实。</p>
<p align="left">
<p align="left"><strong>自动内存管理的两个参数：</strong></p>
<p align="left">     MEMORY_TARGET：表示整个ORACLE实例所能使用的内存大小，包括PGA和SGA的整体大小，即这个参数是动态的，可以动态控制SGA和PGA的大小。</p>
<p align="left">     MEMORY_MAX_TARGET：这个参数定义了MEMORY_TARGET最大可以达到而不用重启实例的值，如果没有设置MEMORY_MAX_TARGET值，默认等于MEMORY_TARGET的值。</p>
<p align="left">     使用动态内存管理时，SGA_TARGET和PGA_AGGREGATE_TARGET代表它们各自内存区域的最小设置，要让Oracle完全控制内存管理，这两个参数应该设置为0。</p>
<p align="left">B Oracle五种内存管理方式</p>
<p align="left">Ø         自动内存管理,即AMM (Automatic Memory Management）</p>
<p align="left">Ø         自动共享内存管理，即ASMM（Automatic Shared Memory Management）</p>
<p align="left">Ø         手动共享内存管理</p>
<p align="left">Ø         自动PGA管理</p>
<p align="left">Ø         手动PGA管理</p>
<p align="left">
<p align="left"><strong>自动内存管理（AMM）</strong></p>
<p align="left">默认安装oracle11g的实例就是AMM方式。通过如下查看：</p>
<p align="left">示例如下：</p>
<p align="left"><span style="font-family: 'Times New Roman';">SQL&gt; show parameters target<br />
NAME                                       TYPE                  VALUE<br />
&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;      &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- archive_lag_target                     integer                      0<br />
db_flashback_retention_target   integer                    1860<br />
fast_start_io_target                    integer                      0<br />
fast_start_mttr_target                 integer                      0<br />
<strong>memory_max_target                  big integer              1400M</strong><br />
<strong>memory_target                          big integer              1400M</strong><br />
pga_aggregate_target                big integer                0</span><br />
<span style="font-family: 'Times New Roman';">sga_target                                  big integer                </span><span style="font-family: 'Times New Roman';">0</span></p>
<p align="left">注意：如果初始化参数 LOCK_SGA ＝ true ，则 AMM 是不可用的。</p>
<p align="left"><strong>自动共享内存管理</strong></p>
<p align="left">自动共享内存管理是oracle10g引进的，如果要使用自动共享内存管理，只需设置MEMORY_TARGET=0，然后显式指定SGA_TARGET即可。</p>
<p align="left">示例如下：</p>
<p align="left">SQL&gt; alter system set memory_target=0 scope=both;<br />
System altered.<br />
SQL&gt; alter system set sga_target=1024m scope=both;<br />
System altered.<br />
SQL&gt;</p>
<p align="left">
<p align="left"><strong>手工共享内存管理</strong></p>
<p align="left">Oracle9i以及以前版本，只能手工设置共享内存管理，如果要使用手动共享内存管理，首先需要设置SGA_TARGET 与MEMORY_TARGET为0。</p>
<p align="left">SGA包含主要参数有：</p>
<p align="left">share_pool_size：共享池大小，建议300-500M之间。</p>
<p align="left">Log_buffer：日志缓冲区大小，建议1-3M之间。</p>
<p align="left">Large_pool_size：大缓冲池大小，非MTS系统，建议在20-30M之间。</p>
<p align="left">Java_pool_size：java池大小，没有java应用时，建议10-20M之间。</p>
<p align="left">db_cache_size：数据缓冲区大小，根据可使用内存大小，尽可能大。</p>
<p align="left">
<p align="left"><strong>自动PAG管理</strong></p>
<p align="left">Oracle9i版本引入了自动PGA管理，如果使用的是AMM管理方式，则无需担心PGA的配置，但是如果对对AMM管理不放心的话，可以设置自动PGA管理，设置</p>
<p align="left">     WORKAREA_SIZE_POLICY ＝ AUTO</p>
<p align="left">然后指定PGA_AGGREGATE_TARGET大小即可。，</p>
<p align="left">
<p align="left"><strong>手工PAG管理</strong></p>
<p align="left">
<p align="left">如果要做到精确的控制PGA，还可以设置手动管理PGA，设置</p>
<p align="center">WORKAREA_SIZE_POLICY = manual</p>
<p align="left">然后分别指定PGA相关参数即可：</p>
<p align="left">PGA相关参数有：</p>
<p align="left">SORT_AREA_SIZE</p>
<p align="left">SORT_AREA_RETAINED_SIZE，</p>
<p align="left">
<p align="left"><strong>3.Oracle</strong><strong>下磁盘存储性能优化</strong></p>
<p align="left">
<p align="left">①      <strong>选择文件系统存取数据</strong></p>
<p align="left">文件系统的选择</p>
<p align="left">     单一文件系统（ext2、ext3、xfs等）</p>
<p align="left">     集群文件系统（gfs、ocfs2）</p>
<p align="left">文件系统存储优缺点：</p>
<p align="left">     优点：管理维护方便。</p>
<p align="left">     缺点：数据读写要经过操作系统级的缓存，效率不是很高。</p>
<p align="left">②      <strong>ASM</strong><strong>（Automatic Storage Management）</strong></p>
<p align="left">ASM优点：</p>
<p align="left">     数据可直接读写，无需经过操作系统存取效率很高，读写效率与直接的原始设备基本相同。</p>
<p align="left">     Oracle提供了专门的管理和维护工具</p>
<p align="left">
<p align="left">关于作者</p>
<p align="left">
<p align="left"><span style="font-family: 'Times New Roman';"> </span>高俊峰，网名：南非蚂蚁</p>
<p align="left"><span style="font-family: 'Times New Roman';">IXPUB “</span>存储设备与容灾技术<span style="font-family: 'Times New Roman';">”</span>及<span style="font-family: 'Times New Roman';">“ Linux</span>与开源世界<span style="font-family: 'Times New Roman';">”</span>版主。</p>
<p align="left"><span style="font-family: 'Times New Roman';"> </span>喜欢<span style="font-family: 'Times New Roman';">oracle</span>和<span style="font-family: 'Times New Roman';"> Unix/Linux</span>技术，平时主要活动在<span style="font-family: 'Times New Roman';">ITPUB.net</span>﹑<span style="font-family: 'Times New Roman';">IXPUB.net</span>﹑<span style="font-family: 'Times New Roman';">ChinaUnix.net</span>等大型技术社区，一直致力与<span style="font-family: 'Times New Roman';">oracle</span>数据库﹑<span style="font-family: 'Times New Roman';">Unix/Linux</span>操作系统管理﹑优化领域，现在主要从事<span style="font-family: 'Times New Roman';">oracle</span>数据库管理和项目规划设计工作，擅长<span style="font-family: 'Times New Roman';">oracle</span>数据库的备份恢复，性能调优，对<span style="font-family: 'Times New Roman';">Unix/Linux</span>集群应用也有一定的研究。</p>
<p align="left">
<p align="left">
<p align="left">转载：不知道原文出处！</p>
<p align="left">
<p align="left">
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/linux%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%80%a7%e8%83%bd%e8%af%84%e4%bc%b0%e4%b8%8e%e4%bc%98%e5%8c%96/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于memcache分布式一致性hash</title>
		<link>http://www.gosoa.com.cn/%e5%85%b3%e4%ba%8ememcache%e5%88%86%e5%b8%83%e5%bc%8f%e4%b8%80%e8%87%b4%e6%80%a7hash</link>
		<comments>http://www.gosoa.com.cn/%e5%85%b3%e4%ba%8ememcache%e5%88%86%e5%b8%83%e5%bc%8f%e4%b8%80%e8%87%b4%e6%80%a7hash#comments</comments>
		<pubDate>Mon, 30 Apr 2012 08:56:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP开发]]></category>
		<category><![CDATA[Memcache]]></category>
		<category><![CDATA[一致性hash]]></category>
		<category><![CDATA[一致性哈希]]></category>
		<category><![CDATA[分布式]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=647</guid>
		<description><![CDATA[consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出，目前在 cache 系统中应用越来越广泛； 1 基本场景 比如你有 N 个 cache 服务器（后面简称 cache ），那么如何将一个对象 object 映射到 N 个 cache 上呢，你很可能会采用类似下面的通用方法计算 object 的 hash 值，然后均匀的映射到到 N 个 cache ； hash(object)%N 一切都运行正常，再考虑如下的两种情况； 1 一个 cache 服务器 m down 掉了（在实际应用中必须要考虑这种情况），这样所有映射到 cache m 的对象都会失效，怎么办，需要把 cache m 从 cache 中移除，这时候 cache 是 N-1 台，映射公式变成了 hash(object)%(N-1) ； 2 由于访问加重，需要添加 cache ，这时候 cache 是 N+1 台，映射公式变成了 hash(object)%(N+1) ； 1 和 2 意味着什么？这意味着突然之间几乎所有的 cache 都失效了。对于服务器而言，这是一场灾难，洪水般的访问都会直接冲向后台服务器； 再来考虑第三个问题，由于硬件能力越来越强，你可能想让后面添加的节点多做点活，显然上面的 hash 算法也做不到。 有什么方法可以改变这个状况呢，这就是 consistent hashing&#8230; 2 hash 算法和单调性 Hash 算法的一个衡量指标是单调性（ Monotonicity ），定义如下： 单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中，又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去，而不会被映射到旧的缓冲集合中的其他缓冲区。 容易看到，上面的简单 hash 算法 hash(object)%N 难以满足单调性要求。 3 consistent hashing 算法的原理 consistent hashing 是一种 hash 算法，简单的说，在移除 / 添加一个 cache 时，它能够尽可能小的改变已存在 key 映射关系，尽可能的满足单调性的要求。 下面就来按照 5 个步骤简单讲讲 consistent hashing 算法的基本原理。 3.1 环形hash 空间 考虑通常的 hash 算法都是将 value 映射到一个 32 为的 key 值，也即是 0~2^32-1 次方的数值空间；我们可以将这个空间想象成一个首（ 0 ）尾（ 2^32-1 ）相接的圆环，如下面图 1 所示的那样。   图 1 环形 hash 空间 3.2 把对象映射到hash 空间 接下来考虑 4 个对象 object1~object4 ，通过 hash 函数计算出的 hash 值 key 在环上的分布如图 2 所示。 hash(object1) = key1; … … hash(object4) = key4;   图 2 4 个对象的 key 值分布 3.3 把cache 映射到hash 空间 Consistent hashing 的基本思想就是将对象和 cache 都映射到同一个 hash 数值空间中，并且使用相同的hash 算法。 假设当前有 A,B 和 C 共 3 台 cache ，那么其映射结果将如图 3 所示，他们在 hash 空间中，以对应的 hash值排列。 hash(cache A) = [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;" align="center">consistent hashing 算法早在 1997 年就在论文 <strong><a href="http://portal.acm.org/citation.cfm?id=258660" target="_blank">Consistent hashing and random trees</a> </strong>中被提出，目前在 cache 系统中应用越来越广泛；</p>
<h2>1 基本场景</h2>
<p>比如你有 N 个 cache 服务器（后面简称 cache ），那么如何将一个对象 object 映射到 N 个 cache 上呢，你很可能会采用类似下面的通用方法计算 object 的 hash 值，然后均匀的映射到到 N 个 cache ；</p>
<p>hash(object)%N</p>
<p>一切都运行正常，再考虑如下的两种情况；</p>
<p>1 一个 cache 服务器 m down 掉了（在实际应用中必须要考虑这种情况），这样所有映射到 cache m 的对象都会失效，怎么办，需要把 cache m 从 cache 中移除，这时候 cache 是 N-1 台，映射公式变成了 hash(object)%(N-1) ；</p>
<p>2 由于访问加重，需要添加 cache ，这时候 cache 是 N+1 台，映射公式变成了 hash(object)%(N+1) ；</p>
<p>1 和 2 意味着什么？这意味着突然之间几乎所有的 cache 都失效了。对于服务器而言，这是一场灾难，洪水般的访问都会直接冲向后台服务器；</p>
<p>再来考虑第三个问题，由于硬件能力越来越强，你可能想让后面添加的节点多做点活，显然上面的 hash 算法也做不到。</p>
<p>有什么方法可以改变这个状况呢，这就是 consistent hashing&#8230;</p>
<h2>2 hash 算法和单调性</h2>
<p>Hash 算法的一个衡量指标是单调性（ Monotonicity ），定义如下：</p>
<p>单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中，又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去，而不会被映射到旧的缓冲集合中的其他缓冲区。</p>
<p>容易看到，上面的简单 hash 算法 hash(object)%N 难以满足单调性要求。</p>
<h2>3 consistent hashing 算法的原理</h2>
<p>consistent hashing 是一种 hash 算法，简单的说，在移除 / 添加一个 cache 时，它能够尽可能小的改变已存在 key 映射关系，尽可能的满足单调性的要求。</p>
<p>下面就来按照 5 个步骤简单讲讲 consistent hashing 算法的基本原理。</p>
<h3>3.1 环形hash 空间</h3>
<p>考虑通常的 hash 算法都是将 value 映射到一个 32 为的 key 值，也即是 0~2^32-1 次方的数值空间；我们可以将这个空间想象成一个首（ 0 ）尾（ 2^32-1 ）相接的圆环，如下面图 1 所示的那样。</p>
<p align="center"> <img class="alignnone size-full wp-image-648" title="1" src="http://scofield-wordpress.stor.sinaapp.com/uploads/2012/04/1.jpg" alt="" width="91" height="104" /></p>
<p align="center">图 1 环形 hash 空间</p>
<h3>3.2 把对象映射到hash 空间</h3>
<p>接下来考虑 4 个对象 object1~object4 ，通过 hash 函数计算出的 hash 值 key 在环上的分布如图 2 所示。</p>
<p>hash(object1) = key1;</p>
<p>… …</p>
<p>hash(object4) = key4;</p>
<p align="center"> <img class="alignnone size-full wp-image-649" title="2" src="http://scofield-wordpress.stor.sinaapp.com/uploads/2012/04/2.jpg" alt="" width="234" height="253" data-pinit="registered" /></p>
<p align="center">图 2 4 个对象的 key 值分布</p>
<h3>3.3 把cache 映射到hash 空间</h3>
<p>Consistent hashing 的基本思想就是将对象和 cache 都映射到同一个 hash 数值空间中，并且使用相同的hash 算法。</p>
<p>假设当前有 A,B 和 C 共 3 台 cache ，那么其映射结果将如图 3 所示，他们在 hash 空间中，以对应的 hash值排列。</p>
<p>hash(cache A) = key A;</p>
<p>… …</p>
<p>hash(cache C) = key C;</p>
<p align="center"> <img class="alignnone size-full wp-image-650" title="3" src="http://scofield-wordpress.stor.sinaapp.com/uploads/2012/04/3.jpg" alt="" width="283" height="253" data-pinit="registered" /></p>
<p align="center">图 3 cache 和对象的 key 值分布</p>
<p>说到这里，顺便提一下 cache 的 hash 计算，一般的方法可以使用 cache 机器的 IP 地址或者机器名作为hash 输入。</p>
<h3>3.4 把对象映射到cache</h3>
<p>现在 cache 和对象都已经通过同一个 hash 算法映射到 hash 数值空间中了，接下来要考虑的就是如何将对象映射到 cache 上面了。</p>
<p>在这个环形空间中，如果沿着顺时针方向从对象的 key 值出发，直到遇见一个 cache ，那么就将该对象存储在这个 cache 上，因为对象和 cache 的 hash 值是固定的，因此这个 cache 必然是唯一和确定的。这样不就找到了对象和 cache 的映射方法了吗？！</p>
<p>依然继续上面的例子（参见图 3 ），那么根据上面的方法，对象 object1 将被存储到 cache A 上； object2和 object3 对应到 cache C ； object4 对应到 cache B ；</p>
<h3>3.5 考察cache 的变动</h3>
<p>前面讲过，通过 hash 然后求余的方法带来的最大问题就在于不能满足单调性，当 cache 有所变动时，cache 会失效，进而对后台服务器造成巨大的冲击，现在就来分析分析 consistent hashing 算法。</p>
<p><strong>3.5.1 </strong><strong>移除 cache</strong></p>
<p>考虑假设 cache B 挂掉了，根据上面讲到的映射方法，这时受影响的将仅是那些沿 cache B 逆时针遍历直到下一个 cache （ cache C ）之间的对象，也即是本来映射到 cache B 上的那些对象。</p>
<p>因此这里仅需要变动对象 object4 ，将其重新映射到 cache C 上即可；参见图 4 。</p>
<p align="center"> <img class="alignnone size-full wp-image-651" title="4" src="http://scofield-wordpress.stor.sinaapp.com/uploads/2012/04/4.jpg" alt="" width="283" height="253" data-pinit="registered" /></p>
<p align="center">图 4 Cache B 被移除后的 cache 映射</p>
<p><strong>3.5.2 </strong><strong>添加 cache</strong></p>
<p>再考虑添加一台新的 cache D 的情况，假设在这个环形 hash 空间中， cache D 被映射在对象 object2 和object3 之间。这时受影响的将仅是那些沿 cache D 逆时针遍历直到下一个 cache （ cache B ）之间的对象（它们是也本来映射到 cache C 上对象的一部分），将这些对象重新映射到 cache D 上即可。</p>
<p>&nbsp;</p>
<p>因此这里仅需要变动对象 object2 ，将其重新映射到 cache D 上；参见图 5 。</p>
<p align="center"><img class="alignnone size-full wp-image-652" title="5" src="http://scofield-wordpress.stor.sinaapp.com/uploads/2012/04/5.jpg" alt="" width="283" height="253" data-pinit="registered" /></p>
<p align="center">图 5 添加 cache D 后的映射关系</p>
<h2>4 虚拟节点</h2>
<p>考量 Hash 算法的另一个指标是平衡性 (Balance) ，定义如下：</p>
<p>平衡性</p>
<p>平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去，这样可以使得所有的缓冲空间都得到利用。</p>
<p>hash 算法并不是保证绝对的平衡，如果 cache 较少的话，对象并不能被均匀的映射到 cache 上，比如在上面的例子中，仅部署 cache A 和 cache C 的情况下，在 4 个对象中， cache A 仅存储了 object1 ，而 cache C 则存储了 object2 、 object3 和 object4 ；分布是很不均衡的。</p>
<p>为了解决这种情况， consistent hashing 引入了“虚拟节点”的概念，它可以如下定义：</p>
<p>“虚拟节点”（ virtual node ）是实际节点在 hash 空间的复制品（ replica ），一实际个节点对应了若干个“虚拟节点”，这个对应个数也成为“复制个数”，“虚拟节点”在 hash 空间中以 hash 值排列。</p>
<p>仍以仅部署 cache A 和 cache C 的情况为例，在图 4 中我们已经看到， cache 分布并不均匀。现在我们引入虚拟节点，并设置“复制个数”为 2 ，这就意味着一共会存在 4 个“虚拟节点”， cache A1, cache A2 代表了 cache A ； cache C1, cache C2 代表了 cache C ；假设一种比较理想的情况，参见图 6 。</p>
<p align="center"><img class="alignnone size-full wp-image-653" title="6" src="http://scofield-wordpress.stor.sinaapp.com/uploads/2012/04/6.jpg" alt="" width="283" height="253" data-pinit="registered" /></p>
<p align="center">图 6 引入“虚拟节点”后的映射关系</p>
<p>此时，对象到“虚拟节点”的映射关系为：</p>
<p>objec1-&gt;cache A2 ； objec2-&gt;cache A1 ； objec3-&gt;cache C1 ； objec4-&gt;cache C2 ；</p>
<p>因此对象 object1 和 object2 都被映射到了 cache A 上，而 object3 和 object4 映射到了 cache C 上；平衡性有了很大提高。</p>
<p>引入“虚拟节点”后，映射关系就从 { 对象 -&gt; 节点 } 转换到了 { 对象 -&gt; 虚拟节点 } 。查询物体所在 cache时的映射关系如图 7 所示。</p>
<p align="center"><img class="alignnone size-medium wp-image-654" title="7" src="http://scofield-wordpress.stor.sinaapp.com/uploads/2012/04/7-300x131.jpg" alt="" width="300" height="131" data-pinit="registered" /></p>
<p align="center">图 7 查询对象所在 cache</p>
<p>“虚拟节点”的 hash 计算可以采用对应节点的 IP 地址加数字后缀的方式。例如假设 cache A 的 IP 地址为202.168.14.241 。</p>
<p>引入“虚拟节点”前，计算 cache A 的 hash 值：</p>
<p>Hash(“202.168.14.241”);</p>
<p>引入“虚拟节点”后，计算“虚拟节”点 cache A1 和 cache A2 的 hash 值：</p>
<p>Hash(“202.168.14.241#1”);  // cache A1</p>
<p>Hash(“202.168.14.241#2”);  // cache A2</p>
<p>&nbsp;</p>
<p><strong>而在PHP使用pecl::memcache  的时候，客户端也已经实现了 consistent 算法。需要修改如下参数。</strong></p>
<p>memcache.hash_strategy=consistent<br />
memcache.hash_function=crc32</p>
<p>参考: pecl::memcache的配置参数，<a href="http://www.php.net/manual/en/memcache.ini.php">http://www.php.net/manual/en/memcache.ini.php</a></p>
<p>这里有一篇关于pecl::memcache的测试 <a href="http://www.surfchen.org/archives/348">http://www.surfchen.org/archives/348</a></p>
<p>&nbsp;</p>
<p>转载：<a href="http://blog.csdn.net/sparkliang/article/details/5279393">http://blog.csdn.net/sparkliang/article/details/5279393</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/%e5%85%b3%e4%ba%8ememcache%e5%88%86%e5%b8%83%e5%bc%8f%e4%b8%80%e8%87%b4%e6%80%a7hash/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 常用命令 &#8211; 给linux初学者</title>
		<link>http://www.gosoa.com.cn/linux-%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4-%e7%bb%99linux%e5%88%9d%e5%ad%a6%e8%80%85</link>
		<comments>http://www.gosoa.com.cn/linux-%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4-%e7%bb%99linux%e5%88%9d%e5%ad%a6%e8%80%85#comments</comments>
		<pubDate>Mon, 30 Apr 2012 07:32:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux开发]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=644</guid>
		<description><![CDATA[Linux 常用命令 1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功登陆后，可以进入相应的用户环境. 退出当前shell,输入:exit 2.useradd netseek 添加一个netseek用户 passwd netseek 给netseek这个用户设置密码. (/etc/passwd /etc/group) userdel netseek 删除账号 userdel -r netseek 删除账号连同自家目录. [更详细的操作请参阅man page,和账号管理篇] 3.查看命令 ls -l 显示文件列表 ls -al -a 显示所有档案及目录 (ls内定将档案名或目录名称开头为”.”的视为隐藏档，不会列出) ls -al &#124;grep &#8216;^d&#8217; 显示目录 ls -al &#124;grep &#8216;^[^d]&#8216; 在一个目录中查询不包含目录的所有文件 ls -sh (man ls 查看man帮助.) linux几种文件类型: d 表示此文件是一个目录 &#8211; 表示此文件是一个普通文件 [...]]]></description>
			<content:encoded><![CDATA[<p>Linux 常用命令 </p>
<p>1.# 表示权限用户(如:root),$ 表示普通用户<br />
  开机提示:Login:输入用户名<br />
  password:输入口令   用户是系统注册用户成功登陆后，可以进入相应的用户环境.<br />
  退出当前shell,输入:exit </p>
<p>2.useradd netseek 添加一个netseek用户<br />
  passwd netseek  给netseek这个用户设置密码.<br />
  (/etc/passwd /etc/group)<br />
  userdel netseek 删除账号<br />
  userdel -r netseek 删除账号连同自家目录.<br />
  [更详细的操作请参阅man page,和账号管理篇] </p>
<p>3.查看命令<br />
  ls -l                显示文件列表<br />
  ls -al        -a 显示所有档案及目录 (ls内定将档案名或目录名称开头为”.”的视为隐藏档，不会列出)<br />
  ls -al |grep &#8216;^d&#8217;   显示目录<br />
  ls -al |grep &#8216;^[^d]&#8216; 在一个目录中查询不包含目录的所有文件<br />
  ls -sh        (man ls 查看man帮助.) </p>
<p>  linux几种文件类型:<br />
  d    表示此文件是一个目录<br />
  &#8211;    表示此文件是一个普通文件<br />
  b    表示此文件是一个特殊的块设备I/O文件<br />
  c    表示此文件是一个特殊的字符设备I/O文件<br />
  l    表示此文件是一个连接文件。在其文件名称后紧跟与它连接的文件路径及名称 </p>
<p>  file 命令通过探测文件内容判断文件类型 </p>
<p>4.建立文件和目录<br />
  touch 1.txt<br />
  cat > 2.txt (用定向符创建文件，填写内容后，按ctrl+d保存内容)<br />
  mkdir mywork 建立mywork这个目录 </p>
<p>5.拷贝文件或目录<br />
  cp filename1 filename2<br />
  cp -r dir1 dir2 复制目录<br />
  cp -rf 参数f是删除已经存在的目标文件而不提示<br />
  cp -i  参数i和f相反，在覆盖目标文件之前将给出提示要求用户确认，回答y时目标文件将被覆盖，是交互式拷贝. </p>
<p>6.删除文件和目录(删除文件或目录都可以用rm搞定)<br />
  rm 1.c //将1.c这个文件删除<br />
  rm -rf (强制删除文件或目录,删除时不提示.) </p>
<p>7.移走目录或者改文件名<br />
  mv [opitons] 源文件或目录   目标文件或目录<br />
  [options]主要参数<br />
  -i:交互方式操作，如果mv操作将导致对已存在的目标文件的覆盖，此时系统询问是否重写，要求用户回答“y”或“n”，<br />
     这样可以避免误覆盖文件.<br />
  -f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示，指定此参数后i参数将不再起作用。<br />
  mv hello ../ 将hello目录或者文件移动上一级. </p>
<p>8.alias 别名<br />
  alias dir=&#8217;ls -l&#8217;   输入dir，其实就相当于执行了ls -l </p>
<p>9.权限的控制(rwx 421)<br />
  chmod +x hello.sh 赋于可执行权限.<br />
  (详细介绍一下权限的控制)<br />
  chmod 命令 权限修改 用法：chmod 一位8进制数 filename (rwx 421)<br />
　eg: chmod u+x filenmame      只想给自己运行，别人只能读<br />
  chown netseek.netseek mydir  改变用户属组 </p>
<p>    u：表示文件所有者<br />
    g：表示同组用户<br />
    o：表示其它用户<br />
    a：表示所有用户<br />
    opt则是代表操作，可以为：<br />
    +：添加某个权限<br />
    -：取消某个权限<br />
    =：赋予给定的权限，并取消原有的权限<br />
    而mode则代表权限：<br />
    r：可读 4<br />
    w：可写 2<br />
    x：可执行 1 </p>
<p>10.pwd 显示当前目录完整路径和改变目录<br />
  cd netseek 进入netseek这个目录<br />
  cd 退出当前目录<br />
  cd ../ 进入上一级目录.<br />
  cd &#8211; 返回上一次目录<br />
  cd ~ 返回主目录 </p>
<p>11. cat,more,less 命令<br />
  将某个文件的内容显示出来，两个命令不同的是:cat 把文件内容一直打印出来，而more则分展显示.<br />
  less 可以上下翻滚查看内容.<br />
  cat > 1.txt 可以填写或者复制内容,按ctrl+d保存<br />
  cat 1.c<br />
  more 1.c<br />
  head -n filename 显示第N行的内容<br />
  tail -n filename 显示后N行的内容<br />
  tail -n 20 /var/log/message 显示最新的20行日志 </p>
<p>12.设置linux时间和日期<br />
  date 命令(“date MMDDhhmmYYYY.ss”)<br />
  2006年7月24日12:37 ,30秒<br />
  date 072412372006.30<br />
  date -s 20:30:30 #设置系统时间为20: 30:30<br />
  date -s 2006-7-24 #设置系统时期为2006-7-24<br />
  clock -r #对系统Bios中读取时间参数<br />
  clock -w #将系统时间(如由date设置的时间)写入Bios </p>
<p>13.查看找文件(find,grep,awk更多的请参照man page或shell编程专题讲解)<br />
  几种介绍:<br />
  find 路径  -name 文件名<br />
  find /etc -name named.conf<br />
  locate 通过文件名搜索文件的工具(要先通过updatedb建立索引数据库)<br />
  localte named.conf<br />
  whereis 是寻找二进制文件，同时也会找到其帮助文件<br />
  which 和where 相似，只是我们所设置的环境变量中设置好的路径中寻找；比如； </p>
<p>14.查杀进程<br />
  ps aux<br />
  ps -ef |grep<br />
  kill -9<br />
  看看哪个进程占用的内存最大<br />
  ps -aux|sort +5n </p>
<p>  将程序放在前后台执行<br />
  cp file1 file2 &#038;<br />
  &#038;与ctrl+z 你可以使用&#038;或ctrl+z来将命令放在后台执行.<br />
  fg 是将放在后台执行的程序再放回前台.<br />
  jobs </p>
<p>15.dd命令备份<br />
  dd if=”input_file” of=”out_file” bs=”block_size” count=”number”<br />
  参数:<br />
  if:就是input file可以是设备<br />
  of:就是output file也可以是设备<br />
  bs:规划的一个block的大小，如果没有设定时，预设是512bytes<br />
  count:多少个bs的意思. </p>
<p>  dd if=/etc/password of=/tmp/passwd.bak 备份 </p>
<p>16.mount 加载一个硬件设备<br />
　 用法:mount [参数] 要加载的设备 载入点<br />
　 eg: mount /dev/cdrom<br />
　 cd /mnt/cdrom //进入光盘目录<br />
   u盘:<br />
   mkdir /mnt/usb；（注：创建挂载目录）<br />
   mount /mnt/sda1 /mnt/usb；(注：挂载U盘)<br />
   现在就可以使用U盘了，在/mnt/usb目录下的内容就是U盘里的内容了；<br />
   使用完后，用以下命令卸载U盘即可。<br />
   umount /mnt/usb<br />
   mount     列出系统所有的分区<br />
   mount -t iso9660 /dev/cdrom /mnt/cdrom   挂载光盘<br />
   mount -t vfat /dev/fd0 /mnt/floppy       挂载软盘<br />
   mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2   挂载fat32分区<br />
   mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3         挂载ntfs分区<br />
   Linux-NTFS Project: http://linux-ntfs.sourceforge.net/<br />
   umount /mnt/hda3 缷载<br />
   注:挂载设备前，请先fdisk -l 看一下. </p>
<p>17.su在不退出登陆的情况下，切换到另一个身份<br />
    用法: su -l 用户名(如果用户名缺省,则切换到root状态)<br />
　　eg:su -l netseek (切换到netseek这个用户，将提示输入密码),加上-表示切换到用户的环境变量. </p>
<p>    sudo 利用他可以执行root执行的权限 </p>
<p>18.whoami,id,w,lastlog,users,groups<br />
   w       查看用户登陆信息<br />
   who     查看当前登陆用户<br />
   last    最近一个月用户登陆情况<br />
   lastlog 检查某特定用户上次登录的时间，并格式化输出上次登录日志/var/log/lastlog的内容<br />
   whoami  确认自己身份.<br />
   id      打印出自己的UID以及GID.(UID:用户身份唯一标识.GID:用户组身份唯一标识.每一个用户只能有一个唯一的UID和GID.)<br />
   users<br />
   groups  用户所归属的用户组查询；<br />
   finger -l netseek root<br />
   finger -s 或者直接finger<br />
   可以让使用者查询一些其他使用者的资料<br />
　 eg: finger //查看所用用户的使用资料<br />
　 finger root //查看root的资料 </p>
<p>19.用户用过的命令和执行历史执行的命令<br />
   history 显示用户过去命用的命令<br />
   !!执行最近一次的命令 </p>
<p>20.uname 查看linux系统信息<br />
   参数:-a 所有信息 -r 版本号 -n 主机名 </p>
<p>21.建立软连接<br />
   ln [-sf] source target<br />
   ln souce-file hard-link<br />
   ln -sf source-file soft-link<br />
   s表示软连接,f表示，若有同名文件在，则将它覆盖过去.<br />
   注：硬链接不能为目录创建，只有文件才能创建硬链接。 </p>
<p>22.查看目录<br />
   du -sh   目录或者文件<br />
   du -m    du系统默认输出是以KB,以参数-m表示以MB显示.<br />
   cat /etc/fstab   查看分区列表<br />
   fdisk -l<br />
   df -h<br />
   df -ah </p>
<p>23.查看linux系统占用的资源(top,free,uptime)<br />
   top   查看后台程序，监控系统性能<br />
   top -d 2 每两秒列新一次<br />
   top -d -2 -p3690 查看某个PID<br />
   top -b -n 2 >/tmp/top.txt 将top的信息进行2次，然后将结果输出到/tmp/top.txt </p>
<p>   free -m 查看系统内存使用情况 </p>
<p>   uptime  显示目前系统开机时间(查看开机多久，多少人登陆，过去1,5,15分钟系统的负载) </p>
<p>24.文件比软件:<br />
   cmp  cmp（“compare”的缩写）命令用来简要指出两个文件是否存在差异，它的使用权限是所有用户<br />
   diff diff命令用于两个文件之间的比较，并指出两者的不同，它的使用权限是所有用户 </p>
<p>25.远程操作与文件传输<br />
   ssh user@remote.machine<br />
   scp user@remote.machine:/remote/path /local/path<br />
   scp /local/path user@remote.machine:/remote/path </p>
<p>26.编译c/c++文件<br />
   gcc<br />
   gcc -v 查看GCC版本<br />
   gcc -o test test.c 2>errfile 编译test.c时若有错误信息，则将错误信息重定向到errfile </p>
<p>27.chattr +i filename 禁止删除，chattr -i filename 取消禁止<br />
   lsattr 查看隐藏档属性 </p>
<p>28.自动化执行<br />
   at 执行一次<br />
   crontab 定时循环执行程序<br />
   crontab 介绍<br />
   1 以root登录<br />
   2 # crontab -e<br />
   3 加入一行<br />
   1 */12 * * * /usr/sbin/ntpdate pool.ntp.org<br />
   分钟　（0-59）<br />
   小時　（0-23）<br />
   日 期　（1-31）<br />
   月份　（1-12）<br />
   星期　（0-6）//0代表星期天 </p>
<p>29.关机和重启:<br />
   shutwond [-t 秒数] [-rkhncff] 时间 [警告信息]<br />
   -t 秒数:设置在切换至不同的runlevel之前，警告和删除两信号之彰间的延迟时间(秒)<br />
   -k 发出警告信息，但不是真的要shutdown<br />
   -r shutdown这后重新开机<br />
   -h shutdown这后开机<br />
   -n 不经过init,由shutdown命令本身来做开机工作(不建议你使用)<br />
   -f 重新开机时，跳过fsck指令，不检查文件系统.<br />
   -F 重新开机时，强迫做fsck检查.<br />
   -c 将已经正在shutdown的动作取消<br />
   shutdown -h now 立刻关机，其中now相当于时间为0,halt,poweroff也可以关机,或者直接init 0<br />
   shutdown -h 20:30  系统将在今晚的8:30关机<br />
   shutdown -h +10    系统再过十分钟后自动关机.<br />
   shutdown -t3 -r now  立刻重新开机，但在警告和删除processes这间，<br />
   shutdown -k now  &#8216;Hey! Go away! now&#8230;&#8217; 发出警告信息，但没有真的关机. </p>
<p>   reboot:<br />
   shutdown -r now 几乎与reboot相同，不关建议用reboot执行如下:<br />
   shutdown -r +30 &#8216;The system wiil reboot&#8217;<br />
   shutdown -r +10 &#8216;Hey!Go away!&#8217;  10分钟后系统重启.<br />
   #sync; sync; sync; reboot   注：sync将数据同步写入硬盘<br />
   halt命令相当于shutdown -h now ，表示立刻关机。<br />
   reboot命令相当于shutown -r now ，表示立刻重起。 </p>
<p>30.如何改变启动模式运行级别<br />
   vi /etc/inittab<br />
   将5改成3，启动后就可以变成字符模式。<br />
   startx 或者 init 5 就可以进入图形化界面.<br />
   runlevel 显示当前运行级别 </p>
<p>  如何切换至单用户模式<br />
  利用telinit或init(其实telinit只是一个synbol link to init)<br />
  telinit 1 或者 init S 即可，当然telinit S也是可以的. </p>
<p>  如何使ctrl+alt+del 三键失效的方法<br />
  #vi /etc/inittab<br />
  在ca::ctrlaltdel:/sbin/shutdonw -t3 -r now之前加上注释#<br />
  然后执行#telinit q ,参数q是要telinit重新检查一次/etc/inittab </p>
<p>31.TAB  巧用tab键，当你不知道文件或命令的全名是请连续按两下tab键. </p>
<p>32.clear 清屏 </p>
<p>33.dmesg |more 显示开机信息(查看系统启动时硬件信息) </p>
<p>34.改变程序执行的优秀级<br />
   nice    设置优先权 nice -n -5 vi &#038; 用root给一个nice值为-5,用于执行vi<br />
   renice  调整已存在优先权 </p>
<p>35.模块相关的命令<br />
   lsmod 显示已经载入系统的模块<br />
   depmod 分析可载入系统的相依性<br />
   modinfo 显示kernel模块的信息<br />
   insmod  载入模块<br />
   modprobe 自动处理可载入模块<br />
   rmmod    删除模块 </p>
<p>36.chkconfig &#8211;list 显示各种服务的状态，利用chkconfig可以轻松管理init脚本. </p>
<p>37.linux的几种解压缩命令<br />
   compress aaa  将aaa文件压缩成为aaa.Z<br />
   compress -d aaa.z 将aaa.z文件压缩成aaa </p>
<p>   gzip aaa 压缩命令<br />
   gzip -d aaa.gz  解压命令 </p>
<p>   bzip2 -z filename 压缩,同上加-d参数解压<br />
   bzcat filename.bz 查看压缩文件内容 </p>
<p>   tar czvf aaa.tar.gz aaa 将目录aaa压缩成aaa.tar.gz<br />
   tar -N &#8217;2007/03/01&#8242; -zcvf home.tar.gz /home 在/home当中,比2007/03/01新的文件才备份.<br />
   tar &#8211;exclude /home/cao -zxvf myfile.tar.gz /home/* /etc 要备份/home,/etc，但不要/home/cao<br />
   cd /tmp; tar -cvf -/etc | tar -xvf &#8211; 将/etc/打包后直接解开/tmp底下，而不产生文件.<br />
   tar zxvf aaa.tar.gz 解压缩命令.<br />
   tar jxvf aaa.tar.bz2 解压命令<br />
   tar zxvf aaa.tar.gz -C /var/www 将aaa.tar.gz解压到/var/www目录下<br />
   cpio -covB > [file|device] 备份<br />
   cpio -icduv < [file|device] 还原 </p>
<p>38.网络命令<br />
   ifconfig 显示或设置网络设备,可以查看当前ip,类似于windows里的ipconfig<br />
   service network restart(/etc/rc.d/init.d/network restart) 重启网卡<br />
   ifdown eth0 关闭网卡<br />
   ifup eth0 开启网卡<br />
   route -n 查看路由表<br />
   route add -net 192.168.20.1 netmask 255.255.255.0 dev eth0 </p>
<p>   netstat 查看网络连接情况<br />
   netstat -i 显示网卡运行情况<br />
   netstat -r 查看主机的路由列表 </p>
<p>   traceroute </p>
<p>   hostname 显示主机名<br />
   hostname -i 显示当前主机名的IP. </p>
<p>39.系统集成管理菜单.<br />
   setup   系统服务管理命令<br />
   ntsysv  设置系统服务 </p>
<p>40.fdisk /mbr 删除GRUB </p>
<p>41.数据库启动<br />
启动mysql：<br />
service mysqld start(/etc/rc.d/init.d/mysqld start)<br />
mysql -uroot -p 输入密码即可操作mysql数据库. </p>
<p>启动Oracle<br />
su &#8211; oracle<br />
$lsnrctl stop<br />
$lsnrctl start<br />
sqlplus /nolog<br />
conn /as sysdba(connected)<br />
startup </p>
<p>42.安装软件包<br />
rpm包安装:<br />
rpm -ivh xxx.rpm         安装rpm包<br />
rpm -qa &#8211;last | less    根据安装日期显示已经安装的包<br />
rpm -qa |grep mysql -i   查询系统是否安装mysql包(-i,忽略大小写)<br />
rpm -e                   删除安装的软件包<br />
rpm -e mysql* &#8211;nodpes   强制删除相关的软件包<br />
rpm &#8211;test               测试安装<br />
rpm -qi                  查询mysql套件的说明资料<br />
rpm -qpl xxx.rpm         查看rpm包内含的内容.<br />
rpm -qc[d]               设定档与说明档<br />
rpm -Uvh                 升级安装<br />
rpmbuild &#8211;bb SPECS/xxx.spec 重新装将xxx.spec编译成rpm包.<br />
rpmbuild &#8211;rebuild packagename.src.rpm 重新把.src.rpm编译成rpm包. </p>
<p>源码编译安装(经典)<br />
./configure              检查系统信息(./configure &#8211;help | more 帮助信息，可以看到相关的参数设定)<br />
make clean               清除之前留下的文件<br />
make                     编译<br />
make install             安装<br />
注:源码包安装，一般先将文件解压，安装过程大致上面几步，具体说明一般见解压后目录里的(INSTALL,READEME说明.) </p>
<p>转自：http://weiwu83.iteye.com/blog/465640 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/linux-%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4-%e7%bb%99linux%e5%88%9d%e5%ad%a6%e8%80%85/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于产品经理核心专业能力的思考 &#8211; 腾讯产品总监蒋宁</title>
		<link>http://www.gosoa.com.cn/%e5%85%b3%e4%ba%8e%e4%ba%a7%e5%93%81%e7%bb%8f%e7%90%86%e6%a0%b8%e5%bf%83%e4%b8%93%e4%b8%9a%e8%83%bd%e5%8a%9b%e7%9a%84%e6%80%9d%e8%80%83-%e8%85%be%e8%ae%af%e4%ba%a7%e5%93%81%e6%80%bb%e7%9b%91</link>
		<comments>http://www.gosoa.com.cn/%e5%85%b3%e4%ba%8e%e4%ba%a7%e5%93%81%e7%bb%8f%e7%90%86%e6%a0%b8%e5%bf%83%e4%b8%93%e4%b8%9a%e8%83%bd%e5%8a%9b%e7%9a%84%e6%80%9d%e8%80%83-%e8%85%be%e8%ae%af%e4%ba%a7%e5%93%81%e6%80%bb%e7%9b%91#comments</comments>
		<pubDate>Sat, 31 Mar 2012 03:47:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[产品相关]]></category>
		<category><![CDATA[产品经理]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=637</guid>
		<description><![CDATA[【本文系外部转载】 作者：腾讯产品总监- 蒋宁 引言： 产品经理是什么，最核心的能力KEY是哪些？如何获得？这个是自从担任产品经理以来就一直思索的问题；感觉产品经理的素质模型与培训体系不够系统化，特别是对于产品经理核心专业能力这块，感觉理解的不够清晰；打个比方，我想MS OFFICE的产品经理，WPS，或是Google的产品经理一定是很牛的人，那我们作为产品经理如果和他们换岗，能胜任吗？我们腾讯的产品经理需要哪些能力可以在更大的行业领域内流动，和业内的产品经理看齐？ 首先，我想找到产品经理专业领域中的核心能力，这个能力不能是其他岗位所重叠覆盖的，比如领导力，商务沟通。。。等，虽然这些也属于产品经理素质模型；但我想需要一些能力用来标记和识别一个产品经理专业性的核心素质。 下面聊三点： 1．是对产品经理个人专业能力的理解 2．从系统分析员看产品经理工作的异同 2. 无线互联网产品经理面临的更大要求和挑战 第一部分：对产品经理专业核心能力的理解； 记得2004加入公司做WAP产品开发工作，编码的时候就不由自主的去思考，我正在做的这个产品到底是给谁用户的，用户会怎么使用更合适；所以会不时地提出一些自己的个人意见，我想当初的产品经理应该觉得我挺烦的，呵呵；有次，当时的Leader找我聊天，问我有无兴趣转行做产品经理；我当时简单想了想就委婉拒绝了；原因有几个： 首先，我还是很希望在技术领域中更深入一些； 其次，我没有感到当时的产品经理工作有什么核心价值和含量； 2004年，个人对SP行业产品经理的看法与认知： 1）产品逻辑简单；感觉当时的那些WAP产品逻辑非常简单；有的是简单几个页面，放几个图铃就可以拿到移动梦网上收费；这里产品的主要工作还是在内容运营上； 2）“面向运营商的产品策划”；那个阶段，SP的商务模式清晰暴利，移动绝对主导产业链，制定游戏规则，对产品模式，甚至连产品表现层都有限制，比如页面什么地方要加什么链接就要加； 3）“面向渠道的产品运营”；运营商通过移动梦网把握营销渠道及计费渠道，产品经理更多的工作是以收入为中心进行渠道经营；对用户的行为分析做的比较少；回顾这个阶段，我想整个行业发展阶段就是如此，无所谓对错了； 4）产品经理的进入门槛不高；要做开发至少要会写程序吧，但感觉产品经理门槛太低；BD,内容维护，美工，很多角色都可以转岗到产品经理；据了解，当时很多SP公司招一些专科生，甚至高中生做产品经理，也一样紧锣密鼓的赚钱。产品经理的工作内容琐碎而繁杂，但感觉不够系统和严谨，每天花用WORD画几个页面就扔过来开发； 我当时一直在考虑这种工作状态下，这个岗位沉淀的核心能力和价值是什么？ 但客观的说，这个也不全是我们的问题，当时的整个SP行业氛围就是如此浮躁；也幸亏这个时期无线业务的造血功能，才养活了游戏，互联网等各个业务；但人才的价值在哪里呢？随着后续SP行业泡沫的破灭，很多公司的SP产品经理下岗，求职也到处碰壁；原因在于他们并没有建立起自己的核心竞争力，甚至不具备成为一个互联网行业产品经理的能力； 2005年WAP门户阶段的产品经理；初步转型的困惑。 到了2005年，部门决定做Wap门户了。我一开始在这个团队中作开发工作，比如资讯系统的建设；后来，又被当时的Leader建议去做WAP门户产品经理，这一次接受了： 主要原因： 1. 个人感觉，由于业务和市场导向的经营模式，产品经理对于WAP门户产品发展策略上话语权是比较大； 2. 个人非常看好和认同WAP门户这个发展方向 记得在2004年6月初，从事WAP开发的时候，同时在思考WAP，SMS,MMS 这几种无线产品的体验，个人感觉WAP的发展很有潜力，可为产品平台化提供支撑；有一天在公交车用手机看WAP新闻，突然有个想法，如果在将来车上每个人都拿着手机上网会是什么景象？我觉得有必要通过系统化思考，将自己的想法记录下来；于是用了三天的时间，反复的修改，写了一个14页的报告《关于发展免费WAP门户的思路与建议》； 现在看来，文章中无非表达了几个观点： 1. WAP的未来发展潜力很大，有可能孕育内容平台 2. 有线无线一体化会成为一种趋势； 3. 腾讯公司的WEB上优势业务都可以逐步衍生到手机终端； 4. 可以两条腿走路，一边发展免费WAP门户为未来布局；一边经营传统SP业务；。。。。。 这个文章其实无所谓有无现实意义，权当当时自己的思考结果的一种记录了； 逐步转型的困惑：以系统分析员的角度来做产品 大概从2005年4月，跌跌撞撞开始了产品经理之路；当时，一直很困惑的问题，还是说如何界定产品经理的工作职责与核心能力了；记得，我一开始是把自己当成类似系统分析员的工作方式来做产品经理的，把产品按子系统进行划分，当初写的功能需求说明书用计算机术语定义，也定义了数据属性；后来拿去给技术评审的时候，却被技术认为这些都不是我应该考虑的，当时的确很困惑，难道像很多产品经理那样，一上来就用WORD画UI示意图？我认为那样很不够严谨，很多需求无法被严格的定义； 虽然，个人认为不够严谨系统，从05年开始也随着整个门户平台的发展做了一系列的产品工作，从产品策划，运营，营销，商务各个角色的工作都做过，对行业的整体理解也逐渐摄入，逐步形成个人对产品经理专业素质的理解； 对产品经理专业核心能力的理解； 这里只谈专业领域方面的能力，对于商务谈判，沟通技巧，文档能力等方面暂时搁下； 个人认为一个领域的产品经理的专业能力表现在以下三个方面： 1. 行业理解能力； 行业分析师的素质； 2. 用户需求系统化分析能力；系统分析师的素质； 3. 用户体验细节把握的能力；交互设计师的素质； [...]]]></description>
			<content:encoded><![CDATA[<p>【本文系外部转载】 作者：腾讯产品总监- 蒋宁<br />
引言：<br />
产品经理是什么，最核心的能力KEY是哪些？如何获得？这个是自从担任产品经理以来就一直思索的问题；感觉产品经理的素质模型与培训体系不够系统化，特别是对于产品经理核心专业能力这块，感觉理解的不够清晰；打个比方，我想MS OFFICE的产品经理，WPS，或是Google的产品经理一定是很牛的人，那我们作为产品经理如果和他们换岗，能胜任吗？我们腾讯的产品经理需要哪些能力可以在更大的行业领域内流动，和业内的产品经理看齐？</p>
<p>首先，我想找到产品经理专业领域中的核心能力，这个能力不能是其他岗位所重叠覆盖的，比如领导力，商务沟通。。。等，虽然这些也属于产品经理素质模型；但我想需要一些能力用来标记和识别一个产品经理专业性的核心素质。</p>
<p>下面聊三点：<br />
1．是对产品经理个人专业能力的理解<br />
2．从系统分析员看产品经理工作的异同<br />
2. 无线互联网产品经理面临的更大要求和挑战</p>
<p>第一部分：对产品经理专业核心能力的理解；</p>
<p>记得2004加入公司做WAP产品开发工作，编码的时候就不由自主的去思考，我正在做的这个产品到底是给谁用户的，用户会怎么使用更合适；所以会不时地提出一些自己的个人意见，我想当初的产品经理应该觉得我挺烦的，呵呵；有次，当时的Leader找我聊天，问我有无兴趣转行做产品经理；我当时简单想了想就委婉拒绝了；原因有几个：<br />
首先，我还是很希望在技术领域中更深入一些；<br />
其次，我没有感到当时的产品经理工作有什么核心价值和含量；</p>
<p>2004年，个人对SP行业产品经理的看法与认知：</p>
<p>1）产品逻辑简单；感觉当时的那些WAP产品逻辑非常简单；有的是简单几个页面，放几个图铃就可以拿到移动梦网上收费；这里产品的主要工作还是在内容运营上；<br />
2）“面向运营商的产品策划”；那个阶段，SP的商务模式清晰暴利，移动绝对主导产业链，制定游戏规则，对产品模式，甚至连产品表现层都有限制，比如页面什么地方要加什么链接就要加；<br />
3）“面向渠道的产品运营”；运营商通过移动梦网把握营销渠道及计费渠道，产品经理更多的工作是以收入为中心进行渠道经营；对用户的行为分析做的比较少；回顾这个阶段，我想整个行业发展阶段就是如此，无所谓对错了；<br />
4）产品经理的进入门槛不高；要做开发至少要会写程序吧，但感觉产品经理门槛太低；BD,内容维护，美工，很多角色都可以转岗到产品经理；据了解，当时很多SP公司招一些专科生，甚至高中生做产品经理，也一样紧锣密鼓的赚钱。产品经理的工作内容琐碎而繁杂，但感觉不够系统和严谨，每天花用WORD画几个页面就扔过来开发；</p>
<p>我当时一直在考虑这种工作状态下，这个岗位沉淀的核心能力和价值是什么？</p>
<p>但客观的说，这个也不全是我们的问题，当时的整个SP行业氛围就是如此浮躁；也幸亏这个时期无线业务的造血功能，才养活了游戏，互联网等各个业务；但人才的价值在哪里呢？随着后续SP行业泡沫的破灭，很多公司的SP产品经理下岗，求职也到处碰壁；原因在于他们并没有建立起自己的核心竞争力，甚至不具备成为一个互联网行业产品经理的能力；</p>
<p>2005年WAP门户阶段的产品经理；初步转型的困惑。</p>
<p>到了2005年，部门决定做Wap门户了。我一开始在这个团队中作开发工作，比如资讯系统的建设；后来，又被当时的Leader建议去做WAP门户产品经理，这一次接受了：<br />
主要原因：<br />
1.       个人感觉，由于业务和市场导向的经营模式，产品经理对于WAP门户产品发展策略上话语权是比较大；<br />
2.       个人非常看好和认同WAP门户这个发展方向<br />
记得在2004年6月初，从事WAP开发的时候，同时在思考WAP，SMS,MMS 这几种无线产品的体验，个人感觉WAP的发展很有潜力，可为产品平台化提供支撑；有一天在公交车用手机看WAP新闻，突然有个想法，如果在将来车上每个人都拿着手机上网会是什么景象？我觉得有必要通过系统化思考，将自己的想法记录下来；于是用了三天的时间，反复的修改，写了一个14页的报告《关于发展免费WAP门户的思路与建议》；<br />
现在看来，文章中无非表达了几个观点：<br />
1.  WAP的未来发展潜力很大，有可能孕育内容平台<br />
2. 有线无线一体化会成为一种趋势；<br />
3. 腾讯公司的WEB上优势业务都可以逐步衍生到手机终端；<br />
4. 可以两条腿走路，一边发展免费WAP门户为未来布局；一边经营传统SP业务；。。。。。<br />
这个文章其实无所谓有无现实意义，权当当时自己的思考结果的一种记录了；</p>
<p>逐步转型的困惑：以系统分析员的角度来做产品</p>
<p>大概从2005年4月，跌跌撞撞开始了产品经理之路；当时，一直很困惑的问题，还是说如何界定产品经理的工作职责与核心能力了；记得，我一开始是把自己当成类似系统分析员的工作方式来做产品经理的，把产品按子系统进行划分，当初写的功能需求说明书用计算机术语定义，也定义了数据属性；后来拿去给技术评审的时候，却被技术认为这些都不是我应该考虑的，当时的确很困惑，难道像很多产品经理那样，一上来就用WORD画UI示意图？我认为那样很不够严谨，很多需求无法被严格的定义；</p>
<p>虽然，个人认为不够严谨系统，从05年开始也随着整个门户平台的发展做了一系列的产品工作，从产品策划，运营，营销，商务各个角色的工作都做过，对行业的整体理解也逐渐摄入，逐步形成个人对产品经理专业素质的理解；</p>
<p>对产品经理专业核心能力的理解；</p>
<p>这里只谈专业领域方面的能力，对于商务谈判，沟通技巧，文档能力等方面暂时搁下；<br />
个人认为一个领域的产品经理的专业能力表现在以下三个方面：<br />
1.       行业理解能力；           行业分析师的素质；</p>
<p>2.       用户需求系统化分析能力；系统分析师的素质；</p>
<p>3.       用户体验细节把握的能力；交互设计师的素质；</p>
<p>首先：行业理解能力，是做这个行业产品经理的前提；</p>
<p>宏观方面，行业的视野对于产品战略定位，产品策划，商务模式等有必然意义；<br />
微观方面，对这个行业内用户需求，行为，习惯，交互行为的理解。都需要在这个行业里逐步积累；<br />
提升方式：获取行业信息，思考加工，提炼观点；个人认为这个本质上属于知识层面，经过靠年深日久的积累，逐步转化成能力要素和外化为直觉层面；<br />
要像一个行业分析师那样了解这个行业；</p>
<p>其次，用户需求系统化分析能力；；</p>
<p>作为用户的代言人，产品经理左手是用户群，右手是技术人员；产品经理要在深刻理解用户需求的前提下，将他们系统整理，分析，转化成开发人员可理解的表达方式；<br />
用户需求分析的工作是系统，严谨的，而不是零散，琐碎，堆砌的；把产品看成一个系统，就可以理解各个功能之间的关系，而不是做简单的功能加法；<br />
需要use Case 的分析方法，进行业务建模；并能综合权衡用户需求度，可行性，方案成本的来评估需求的优先级；<br />
提升方式：掌握系统化分析的工具，比如业务建模，用例分析；习惯面向对象的思维方式；<br />
个人认为，这块能力需要比较严谨的逻辑思维；我们常见的问题是，产品经理一上来就画UI交互图，用户界面；其实这些在一个产品过程中属于最后的思考环节；会导致我们无法认知产品定位，产品全貌；在产品功能拓展过程中，没有方向感，容易做加法；<br />
个人认为，这个其实很适合系统分析师的工作特点和思维方式，在下面会讨论一下系统分析师和产品经理工作中的异同；</p>
<p>再者，用户体验的细节把握能力；</p>
<p>用户体验，这个名词姑且理解为使用者对产品的主观感受吧；这个感受可能是功能设计带来的，也可能是交互细节，或视觉设计方面带来的。特别是在竞争市场功能趋同的环境下，决定体验的往往是细节层面；最了解用户的人，是产品经理，他既是用户代言人，同时有时对行业理解比较深入的人；因此，他需要有很强的“用户使用场景还原能力”；这个“使用场景”，是对人，时间，空间的综合考虑；就是要能模仿用户的心态和使用环境，来检验产品的工作流程是否顺畅，体验是否OK；这个如果是习惯于用例分析的系统分析师，做这个还是会有优势的；<br />
在有的产品构建构成中，是有“交互设计师”这一岗位细分出来的，比如WEB或软件交互设计师；这是一群掌握了互联网UI交互基本原则，对用户心理及行为分析有理论沉淀的专业人才；<br />
因为产品经理对产品负责，因为要有交互设计的理论素养；虽然在具体的工作中，产品经理不一定亲自做交互设计，但要有判断能力，知道为什么好，或者哪里不好；<br />
有一些领域，比如WAP交互产品设计，因为行业发展初期，这一岗位还没分化，只能由产品经理搞定；</p>
<p>产品经理的“125”模型，只是换一种提法：</p>
<p>对于以上三种能力，我在团队内部有一些包装和提炼：<br />
“1”：一种能力。系统化需求分析及业务建模的能力；<br />
“2”：两种视角。<br />
一是宏观的行业视角；深入理解互联网及无线行业，这对产品战略定位，用户群行为需求，交互习惯，及商务模式的衍生都有意义；<br />
二是微观的用户视角；作为最了解用户的人，必须对产品体验负责，具备很强的用户场景化分析能力（use case 分析）。</p>
<p>“5”：是一个普遍产品设计方法论；之前是：战略层，范围层，结构层，框架层，UI层；<br />
这个来自于用户体验的要素一书<br />
这里特别说明一下：<br />
1）产品定位；根据外部市场及内部资源状况，从用户需求及公司战略角度阐述发展此产品的可行性，并明确产品发展策略，两个视角：1.用户视角；满足何种用户的何种需求（包含对目标用户群的锁定）；2. 公司视角；对公司利益价值何在；<br />
2）业务建模；通过use Case 分析，描述用户对产品的功能诉求；确定大致的服务范围；并识别需求的组织分类及优先级；通过这个工作输出业务模型描述，用户需求分析说明书；这个不涉及到细节交互及实现方案；</p>
<p>个人认为，产品经理的进入门槛虽然不高，但要成为很优秀很资深产品经理还是有比较大挑战的；从公司职业能力模型来看，素质的全面性是一方面；关键是要在专业能力上有深入的发展；个人认为要在以上3个能力点有突破的人，才称得上专业；</p>
<p>个人的一点想法与建议：</p>
<p>1.       产品经理专业能力的系统化培养机制；</p>
<p>产品经理的其他综合素质，比如项目，领导力，沟通。。。等能力素质各人都可以在不同的岗位实践中获取；公司这个方面也有一系列的培训课程，比如沟通技巧，谈判技巧，项目管理。。。等。但在产品经理专业能力方面，比如需求分析的能力，这个培训还是比较少；比如用通用的面向对象的思想做需求分析，用use case 做业务建模的方法，比如对于UML工具的了解；这个都比较少。我们自己的产品经理写的需求说明书，要么是直接就画交互设计；要么是采用传统面向过程系统设计中的《功能规格需求说明书》，包含了输入，输出，处理过程这些内容；希望，公司或有做的比较好的团队，能进行这个方面的系统化培训；<br />
对于交互设计原则，还不错，设计中心有相关培训；对于行业理解力，这个几次培训可能无法解决问题，可能得靠产品经理自己的日常信息积累和思考；</p>
<p>2.       对于产品经理岗位人才的建议；</p>
<p>还是不得不说，要成为一般产品经理并不难，要在业务领域很资深，个人观点是还是因人而异；一个建议是从系统分析员中招聘产品经理；或从会系统分析的开发人员中找；因为系统分析师的思维方式和综合素质和产品经理类似，相信再加上行业的理解，进入角色应该不难；<br />
另外一种就是靠从新人开始培养了，个人觉得要在专业层面有突破，首先逻辑思维能力要强一些，有利于掌握系统化分析的方法；其次是有一定的内敛气质，善于观察总结，能在用户体验细节上沉得住气；还要有强的学习领悟能力，擅长对行业方向进行思考；至于创意及发散性思维，个人觉得有更好，没有也不是非常关键，可以通过发现和收集别人或用户的IDEA来完成，反而太发散和跳跃的思维会影响对系统整体的思考；</p>
<p>第二部分：系统分析员和互联网产品经理工作的异同：</p>
<p>从我之前系统分析员的工作经理，聊一下个人浅显的看法；前面几年包括读研时期做项目，做过一些系统分析角色，包括面向过程的系统分析及后来尝试学习面向对象的系统分析；</p>
<p>首先，相同点；</p>
<p>1）系统分析的思维方式类似产品构建过程；</p>
<p>我们可以把一个产品看作一个系统，其内部的功能架构不是简单堆砌的，而是有依赖从属的，符合一个系统的视角；在面向对象系统分析中，无非就是分析清楚系统人，事，物体，规则了；这个人，是系统的使用者（Actor），相当于产品的目标用户群；事，指使用者通过系统要完成的事情；相当于产品中的功能特性建设了；物，系统中用户完成事情中所产出的东西，比如数据实体对象等；产品中也有这些，比如日志；</p>
<p>一般的系统分析是系统目标界定，相当于产品定位了；然后是业务建模，用例分析，系统建模；  前面相当于产品设计中的场景化分析，做功能化构建；而系统建模这个工作是用技术语言来描述系统模型，目前这个工作在产品工作中没有的，因为大多数的产品非技术背景，不考虑这些；但技术人员则应当输出完整的系统建模；但是可能很多团队省却掉这一步了；</p>
<p>2) 用户视角；</p>
<p>系统分析师和产品经理都要非常强化用户视角；系统分析，特别是面向对象的系统分析都是以人为核心的，首先就是找到系统的使用者，再研究他的需求及想完成的事情；做USE CASE分析，也必然以Actor的参与为核心来进行描述；这一点，和产品经理的场景化分析是一致的；</p>
<p>3）USE Case分析和用户的场景化分析能力相通；</p>
<p>我们描述用户的需求，不能简单的止步于对目标用户群社会属性的认知(年龄，职业，收入。。。等)，一个场景包含了对人，时间，空间等综合考虑，这种场景化的还原对分析用户的需求是有必要的；</p>
<p>4) 二者的职业素质模型类似；</p>
<p>综合素质要求都比较高，比如沟通能力，领导力，谈判能力。。等；</p>
<p>其次，差异化：</p>
<p>1）业务模型的复杂度；</p>
<p>一般系统分析师面对的商业系统设计的逻辑比较复杂，特别是涉及工作流环节；而互联网的产品相对比较轻量级，完成的功能简单；比如一个WPS的产品，OA系统比一个QZONE产品要简单一些；<br />
2）目标用户群及其需求界定方面；</p>
<p>一般的信息管理系统的用户角色很好阶段，逐个找到并做深度CE，调研，是尅一挖掘出所有需求的；而互联网产品一般面临千万级用户，需求很难明确界定，只有通过敏捷的开发过程，不断试探和反馈；<br />
3）业务模型上，互联网产品包含更多的创意文化；</p>
<p>系统分析师所面对的商业信息系统一般是解决现实工作中的问题，要客观忠实的反映符合传统工作规则；而互联网产品的更多是挖掘用户潜在需求，甚至通过创意来激发新的需求；</p>
<p>再者，系统分析师的额外优势：</p>
<p>系统化需求分析能力，及业务模型的建设能力；从业务模型推导出产品规划及版本节奏的时候，系统分析师一般有技术背景可以综合技术可行性，技术实施成本等进行综合考虑；</p>
<p>第三部分：无线互联网产品经理所面临的特殊挑战：</p>
<p>1. 产品经理系统分析能力和要求是一致的，业务模型的建设能力也是一致；<br />
至于其他的领导力，项目能力，商务谈判，沟通技巧。。。等产品模型方面都一致；甚至由于无线产品经理在某些能力上会更出色，比如商务谈判，沟通技巧；</p>
<p>2. 用户交互体验细节方面，由于移动终端的特性，这一块没有行业沉淀，需要自己摸索，<br />
自我沉淀；</p>
<p>3. 行业理解能力上，无线产品经理面临更大挑战：<br />
一方面需要了解当前有线互联网行业的业务形态，竞争状况，商务模式等；因为有线互联网向移动侧延伸和渗透，服务融合是趋势；<br />
另一方面，由于无线互联网还具有自己的行业特点，比如运营主导的长产业链；移动终端，无线网络，运营商政策对上层应用产品的影响都要综合权衡；我划了一个图，简单说明一下无线互联网行业的各种要素；</p>
<p>总之，前面路似乎还很长很长，我辈还需继续努力。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/%e5%85%b3%e4%ba%8e%e4%ba%a7%e5%93%81%e7%bb%8f%e7%90%86%e6%a0%b8%e5%bf%83%e4%b8%93%e4%b8%9a%e8%83%bd%e5%8a%9b%e7%9a%84%e6%80%9d%e8%80%83-%e8%85%be%e8%ae%af%e4%ba%a7%e5%93%81%e6%80%bb%e7%9b%91/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>http_build_query 的一个问题</title>
		<link>http://www.gosoa.com.cn/http_build_query-%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98</link>
		<comments>http://www.gosoa.com.cn/http_build_query-%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98#comments</comments>
		<pubDate>Mon, 06 Feb 2012 10:25:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP开发]]></category>
		<category><![CDATA[http_build_query]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=628</guid>
		<description><![CDATA[当我们使用CURL来post数据的时候，需要设置post的数据 curl_setopt($c, CURLOPT_POSTFIELDS, $post_data); 假如这里的$data是 $data = array( 'name'=>'scofield', 'time'=>'2012-2-3' ) 接下来，需要先将$data变成字符串 $post_data = http_build_query($data); 而采用 http_build_query 转换后再 curl_setopt($c, CURLOPT_POSTFIELDS, $post_data); 看起来没有什么问题。但在实际操作中，$post_data 并没有被post过去。于是，自己写了个转换的方法后就OK了。 function getStr($array,$Separator='&#038;') { if (empty($array)) return; if (!is_array($array)) { return $array; } $returnStr = ''; foreach ($array as $key => $val) { $temp = ''; if (is_array($val)) { for ($i = 0; [...]]]></description>
			<content:encoded><![CDATA[<p>当我们使用CURL来post数据的时候，需要设置post的数据<br />
curl_setopt($c, CURLOPT_POSTFIELDS, $post_data);</p>
<p>假如这里的$data是</p>
<pre name="php">
$data = array(
   'name'=>'scofield',
   'time'=>'2012-2-3'
)
</pre>
<p>接下来，需要先将$data变成字符串<br />
$post_data =  http_build_query($data);<br />
而采用 http_build_query 转换后再<br />
curl_setopt($c, CURLOPT_POSTFIELDS, $post_data); </p>
<p>看起来没有什么问题。但在实际操作中，$post_data 并没有被post过去。于是，自己写了个转换的方法后就OK了。</p>
<pre name="php">
 function getStr($array,$Separator='&#038;') {
        if (empty($array))
            return;
        if (!is_array($array)) {
            return $array;
        }
        $returnStr = '';
        foreach ($array as $key => $val) {
            $temp = '';
            if (is_array($val)) {
                for ($i = 0; $i < count($val); $i++) {
                    $returnStr .= $key . '[' . $i . ']' . '=' . $val[$i] . $Separator;
                }
            } else {
                $returnStr.= $key . '=' . $val . $Separator;
            }
        }
        $returnStr = substr(trim($returnStr), 0, -1);
        return $returnStr;
    }
</pre>
<p></p>
<p><b>感谢 黄斌-huangbin  童鞋的测试   http_build_query($data,"","&#038;");  即可，无需自己写方法解析了。</b></p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/http_build_query-%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个有意思的日期逻辑处理</title>
		<link>http://www.gosoa.com.cn/%e4%b8%80%e4%b8%aa%e6%9c%89%e6%84%8f%e6%80%9d%e7%9a%84%e6%97%a5%e6%9c%9f%e9%80%bb%e8%be%91%e5%a4%84%e7%90%86</link>
		<comments>http://www.gosoa.com.cn/%e4%b8%80%e4%b8%aa%e6%9c%89%e6%84%8f%e6%80%9d%e7%9a%84%e6%97%a5%e6%9c%9f%e9%80%bb%e8%be%91%e5%a4%84%e7%90%86#comments</comments>
		<pubDate>Tue, 19 Jul 2011 09:39:57 +0000</pubDate>
		<dc:creator>scofield</dc:creator>
				<category><![CDATA[PHP开发]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=617</guid>
		<description><![CDATA[今天处理了一个很小的问题。
需求是这样的，从周一到周日只能看到上周一到上周日的数据。
这里直接从数据库里根据 date 字段查询 范围即可。
但需要PHP生成 开始日期和结束日期。

最开始，我直接这么处理。
<pre name="code" class="php">
$start_date = date('Y-m-d' , strtotime("-2 week monday"));
$end_date = date('Y-m-d' , strtotime("$start_date +6 day"));
</pre>
假如日期是 2011-07-19，$start_date= 2011-07-11  这样处理没有问题。
如果日期是  2011-07-18 ，$start_date 则会等于 2011-07-04，还活在上周。]]></description>
			<content:encoded><![CDATA[<p>今天处理了一个很小的问题。<br />
需求是这样的，从周一到周日只能看到上周一到上周日的数据。<br />
这里直接从数据库里根据 date 字段查询 范围即可。<br />
但需要PHP生成 开始日期和结束日期。</p>
<p>最开始，我直接这么处理。</p>
<pre name="code" class="php">
$start_date = date('Y-m-d' , strtotime("-2 week monday"));
$end_date = date('Y-m-d' , strtotime("$start_date +6 day"));
</pre>
<p>假如日期是 2011-07-19，$start_date= 2011-07-11  这样处理没有问题。<br />
如果日期是  2011-07-18 ，$start_date 则会等于 2011-07-04，还活在上周。</p>
<p>于是换了种方法</p>
<pre name="code" class="php">
$getWeekDay = date("w");
$startDay = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - $getWeekDay + 1 - 7, date("Y")));
$endDay = date("Y-m-d", strtotime("+6 day $startDay"));
</pre>
<p>假如日期是 2011-07-19，$start_date= 2011-07-11  这样处理没有问题，和我们期望的一样。<br />
如果日期是 2011-07-24，我们期望的  $start_date 是 2011-07-11，但实际返回的是 2011-07-18。</p>
<p>不得已，我再改了下方法</p>
<pre name="code" class="php">
$getWeekDay = date("N") ;
$startDay = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - $getWeekDay + 1 - 7, date("Y")));
$endDay = date("Y-m-d", strtotime("+6 day $startDay"));
</pre>
<p>这下就OK 了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/%e4%b8%80%e4%b8%aa%e6%9c%89%e6%84%8f%e6%80%9d%e7%9a%84%e6%97%a5%e6%9c%9f%e9%80%bb%e8%be%91%e5%a4%84%e7%90%86/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP用CURL伪造IP和来源</title>
		<link>http://www.gosoa.com.cn/php%e7%94%a8curl%e4%bc%aa%e9%80%a0ip%e5%92%8c%e6%9d%a5%e6%ba%90</link>
		<comments>http://www.gosoa.com.cn/php%e7%94%a8curl%e4%bc%aa%e9%80%a0ip%e5%92%8c%e6%9d%a5%e6%ba%90#comments</comments>
		<pubDate>Tue, 19 Jul 2011 09:09:02 +0000</pubDate>
		<dc:creator>scofield</dc:creator>
				<category><![CDATA[PHP开发]]></category>
		<category><![CDATA[CURL]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=614</guid>
		<description><![CDATA[以前没有这么搞过。

今天群里一个朋友在问这个问题。

查了下，CURL确实很强悍的可以伪造IP和来源。

1.php 请求 2.php 。

1.php代码：]]></description>
			<content:encoded><![CDATA[<p>以前没有这么搞过。</p>
<p>今天群里一个朋友在问这个问题。</p>
<p>查了下，CURL确实很强悍的可以伪造IP和来源。</p>
<p>1.php 请求 2.php 。</p>
<p>1.php代码：</p>
<pre name="code" class="php">

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));  //构造IP
curl_setopt($ch, CURLOPT_REFERER, "http://www.gosoa.com.cn/ ");   //构造来路
curl_setopt($ch, CURLOPT_HEADER, 1);
$out = curl_exec($ch);
curl_close($ch);
</pre>
<p>2.php代码如下：</p>
<pre name="code" class="php">

function getClientIp() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"]))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "err";
    return $ip;
}

echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER["HTTP_REFERER"];
</pre>
<p>伪造成功，这是不是给“刷票”的朋友提供了很好的换IP的方案！！<br />
哈哈。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/php%e7%94%a8curl%e4%bc%aa%e9%80%a0ip%e5%92%8c%e6%9d%a5%e6%ba%90/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LAMPER主题分享交流会第七期：LAMP高性能实践</title>
		<link>http://www.gosoa.com.cn/lamper%e4%b8%bb%e9%a2%98%e5%88%86%e4%ba%ab%e4%ba%a4%e6%b5%81%e4%bc%9a%e7%ac%ac%e4%b8%83%e6%9c%9f%ef%bc%9alamp%e9%ab%98%e6%80%a7%e8%83%bd%e5%ae%9e%e8%b7%b5</link>
		<comments>http://www.gosoa.com.cn/lamper%e4%b8%bb%e9%a2%98%e5%88%86%e4%ba%ab%e4%ba%a4%e6%b5%81%e4%bc%9a%e7%ac%ac%e4%b8%83%e6%9c%9f%ef%bc%9alamp%e9%ab%98%e6%80%a7%e8%83%bd%e5%ae%9e%e8%b7%b5#comments</comments>
		<pubDate>Thu, 14 Jul 2011 03:40:35 +0000</pubDate>
		<dc:creator>scofield</dc:creator>
				<category><![CDATA[LAMP分享]]></category>
		<category><![CDATA[LAMPER]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=606</guid>
		<description><![CDATA[主题一、高性能Lamp程序设计 嘉宾：付超群 主题二：Sphinx构建全文搜索 嘉宾：李沫南 主题三：redis艺术 嘉宾：杨海潮 （* 特别鸣谢 新浪提供场地 *） ————————————————————————— 具体安排： 活动时间：2011年7月16日（周六），13:30  - 16:30 活动地点：北京市海淀区北四环西路理想国际大厦 15层 所需费用：免费 活动日程： 13:00-13:30：签到、入场 13:30-14:30：高性能Lamp程序设计 14:30-15:30：Sphinx构建全文搜索 15:30-16:30：redis艺术 16:30-16:40：Q &#38; A，合影，自由交流 联系人： 茹云峰 – 13141362151 潘少宁 – 13520286595 ————————————————————————— 嘉宾介绍： 付超群 工程师，主要兴趣方向是Lamp架构程序设计，全文检索以及数据挖掘，ColaPHP框架作者。 博客：http://www.fuchaoqun.com 新浪微博：http://weibo.com/fuchaoqun 李沫南 开源爱好者， coreseek.com 创始人。 杨海潮 新浪首席DBA 目前为新浪首席DBA，在大规模高并发，海量访问有丰富的管理经验。热衷于数据库设计，性能优化，分布式部署方案和高可用性方面的研究。 之前从事大访问量网站的部署以及优化工作，加入新浪后主要负责整个公司的数据库管理工作。 报名 请猛点这里。 LAMPER  点这里，点这里。。。!]]></description>
			<content:encoded><![CDATA[<p><strong>主题一、高性能Lamp程序设计</strong><br />
嘉宾：付超群</p>
<p><strong>主题二：Sphinx构建全文搜索</strong></p>
<p>嘉宾：李沫南</p>
<p><strong><strong>主题三：redis艺术</strong><br />
</strong>嘉宾：杨海潮<br />
（* 特别鸣谢 新浪提供场地 *）</p>
<p>—————————————————————————</p>
<p><strong>具体安排：</strong></p>
<p><strong>活动时间：</strong>2011年7月16日（周六），13:30  - 16:30<br />
<strong>活动地点：</strong>北京市海淀区北四环西路理想国际大厦 15层<br />
<strong>所需费用：</strong>免费<br />
<strong>活动日程：</strong><br />
13:00-13:30：签到、入场<br />
13:30-14:30：高性能Lamp程序设计<br />
14:30-15:30：Sphinx构建全文搜索<br />
15:30-16:30：redis艺术<br />
16:30-16:40：Q &amp; A，合影，自由交流<br />
<strong>联系人：</strong></p>
<p>茹云峰 – 13141362151</p>
<p>潘少宁 – 13520286595</p>
<p>—————————————————————————</p>
<p><strong>嘉宾介绍：</strong></p>
<p><strong>付超群</strong></p>
<p>工程师，主要兴趣方向是Lamp架构程序设计，全文检索以及数据挖掘，<a title="colaphp" href="http://code.google.com/p/colaphp/" target="_blank">ColaPHP</a>框架作者。</p>
<p>博客：<a title="付超群" href="http://www.fuchaoqun.com/" target="_blank">http://www.fuchaoqun.com</a></p>
<p>新浪微博：<a title="付超群" href="http://weibo.com/fuchaoqun" target="_blank">http://weibo.com/fuchaoqun</a></p>
<p><strong>李沫南</strong></p>
<p>开源爱好者， coreseek.com 创始人。</p>
<p><strong>杨海潮</strong></p>
<p>新浪首席DBA<br />
目前为新浪首席DBA，在大规模高并发，海量访问有丰富的管理经验。热衷于数据库设计，性能优化，分布式部署方案和高可用性方面的研究。 之前从事大访问量网站的部署以及优化工作，加入新浪后主要负责整个公司的数据库管理工作。</p>
<p><strong><span style="color: #ff0000;">报名 请猛点这里。</span><br />
<a title="lamper" href="http://www.lamper.cn" target="_self">LAMPER  点这里，点这里。。。!</a></strong></p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/lamper%e4%b8%bb%e9%a2%98%e5%88%86%e4%ba%ab%e4%ba%a4%e6%b5%81%e4%bc%9a%e7%ac%ac%e4%b8%83%e6%9c%9f%ef%bc%9alamp%e9%ab%98%e6%80%a7%e8%83%bd%e5%ae%9e%e8%b7%b5/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化PHP代码的40条建议[转]</title>
		<link>http://www.gosoa.com.cn/%e4%bc%98%e5%8c%96php%e4%bb%a3%e7%a0%81%e7%9a%8440%e6%9d%a1%e5%bb%ba%e8%ae%ae%e8%bd%ac</link>
		<comments>http://www.gosoa.com.cn/%e4%bc%98%e5%8c%96php%e4%bb%a3%e7%a0%81%e7%9a%8440%e6%9d%a1%e5%bb%ba%e8%ae%ae%e8%bd%ac#comments</comments>
		<pubDate>Fri, 01 Jul 2011 09:41:53 +0000</pubDate>
		<dc:creator>scofield</dc:creator>
				<category><![CDATA[PHP开发]]></category>
		<category><![CDATA[PHP优化]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=603</guid>
		<description><![CDATA[1.如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。

2.echo 比 print 快。

3.使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。

4.在执行for循环之前确定最大循环数，不要每循环一次都计算最大值。

5.注销那些不用的变量尤其是大数组，以便释放内存。

6.尽量避免使用__get，__set，__autoload。]]></description>
			<content:encoded><![CDATA[<p>1.如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。</p>
<p>2.echo 比 print 快。</p>
<p>3.使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。</p>
<p>4.在执行for循环之前确定最大循环数，不要每循环一次都计算最大值。</p>
<p>5.注销那些不用的变量尤其是大数组，以便释放内存。</p>
<p>6.尽量避免使用__get，__set，__autoload。</p>
<p>7.require_once()代价昂贵。</p>
<p>8.在包含文件时使用完整路径，解析操作系统路径所需的时间会更少。</p>
<p>9.如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p>
<p>10.函数代替正则表达式完成相同功能。</p>
<p>11.str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。</p>
<p>12.如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。</p>
<p>13.使用选择分支语句（译注：即switch case）好于使用多个if，else if语句。</p>
<p>14.用@屏蔽错误消息的做法非常低效。</p>
<p>15.打开apache的mod_deflate模块。</p>
<p>16.数据库连接当使用完毕时应关掉。</p>
<p>17.$row[‘id’]的效率是$row[id]的7倍。</p>
<p>18.错误消息代价昂贵。</p>
<p>19.尽量不要在for循环中使用函数，比如for ($x=0; $x &lt; count($array); $x)每循环一次都会调用count()函数。</p>
<p>20.在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p>
<p>21.递增一个全局变量要比递增一个局部变量慢2倍。</p>
<p>22.递增一个对象属性（如：$this-&gt;prop++）要比递增一个局部变量慢3倍。</p>
<p>23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p>
<p>24.仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。</p>
<p>25.方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。</p>
<p>26.派生类中的方法运行起来要快于在基类中定义的同样的方法。</p>
<p>27.调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p>
<p>28.用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会。当然，只有当你不需要在字符串中包含变量时才可以这么做。</p>
<p>29.输出多个字符串时，用逗号代替句点来分隔字符串，速度更快。注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。</p>
<p>30.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p>
<p>31.除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p>
<p>32.尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。</p>
<p>33.当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval 结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。</p>
<p>（举例如下）<br />
if (strlen($foo) &lt; 5) { echo “Foo is too short”; }<br />
（与下面的技巧做比较）<br />
if (!isset($foo)) { echo “Foo is too short”; }</p>
<p>调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。</p>
<p>34.当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。</p>
<p>35.并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
<p>36.并非要用类实现所有的数据结构，数组也很有用。</p>
<p>37.不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？</p>
<p>38.当你需要时，你总能把代码分解成方法。</p>
<p>39.尽量采用大量的PHP内置函数。</p>
<p>40.如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p>
<p>41.评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p>
<p>42.mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
<p>原文地址： <a href="http://www.builder.com.cn/2008/0203/728680.shtml">http://www.builder.com.cn/2008/0203/728680.shtml</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/%e4%bc%98%e5%8c%96php%e4%bb%a3%e7%a0%81%e7%9a%8440%e6%9d%a1%e5%bb%ba%e8%ae%ae%e8%bd%ac/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP几个不常用但很有用的函数</title>
		<link>http://www.gosoa.com.cn/php%e5%87%a0%e4%b8%aa%e4%b8%8d%e5%b8%b8%e7%94%a8%e4%bd%86%e5%be%88%e6%9c%89%e7%94%a8%e7%9a%84%e5%87%bd%e6%95%b0</link>
		<comments>http://www.gosoa.com.cn/php%e5%87%a0%e4%b8%aa%e4%b8%8d%e5%b8%b8%e7%94%a8%e4%bd%86%e5%be%88%e6%9c%89%e7%94%a8%e7%9a%84%e5%87%bd%e6%95%b0#comments</comments>
		<pubDate>Wed, 29 Jun 2011 13:26:43 +0000</pubDate>
		<dc:creator>scofield</dc:creator>
				<category><![CDATA[PHP开发]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.gosoa.com.cn/?p=593</guid>
		<description><![CDATA[glob() 直接print_r(glob(&#8216;*&#8217;)) 看看效果吧。 再  print_r(glob(&#8216;*.PHP&#8217;)) 再看看效果吧。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- PHP Filter函数 PHP自带的filter函数。直接可以用来验证email，IP等。也可以用来验证 INPUT等。 具体见这里 http://php.net/manual/en/book.filter.php &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- get_browser() 获得浏览器信息的。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- sys_getloadavg() 这个函数只针对linux系统有用。 可以用来监测系统的负载。 其值就是linux的 load average值。]]></description>
			<content:encoded><![CDATA[<ul>
<li><strong>glob()</strong></li>
</ul>
<p>直接print_r(glob(&#8216;*&#8217;)) 看看效果吧。</p>
<p>再  print_r(glob(&#8216;*.PHP&#8217;)) 再看看效果吧。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<ul>
<li><strong>PHP Filter函数</strong></li>
</ul>
<p><a href="http://php.net/manual/en/book.filter.php" target="_blank">PHP自带的filter函数</a>。直接可以用来验证email，IP等。也可以用来验证 INPUT等。</p>
<p>具体见这里 <a href="http://php.net/manual/en/book.filter.php">http://php.net/manual/en/book.filter.php</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<ul>
<li><strong>get_browser()</strong></li>
</ul>
<p>获得浏览器信息的。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<ul>
<li><strong>sys_getloadavg()</strong></li>
</ul>
<p>这个函数只针对linux系统有用。</p>
<p>可以用来监测系统的负载。 其值就是linux的 load average值。</p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gosoa.com.cn/php%e5%87%a0%e4%b8%aa%e4%b8%8d%e5%b8%b8%e7%94%a8%e4%bd%86%e5%be%88%e6%9c%89%e7%94%a8%e7%9a%84%e5%87%bd%e6%95%b0/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

