<?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>一个故事@MySQL DBA &#187; Linux</title>
	<atom:link href="http://www.orczhou.com/index.php/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.orczhou.com</link>
	<description>一个故事@MySQL DBA</description>
	<lastBuildDate>Tue, 20 Dec 2011 15:51:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>TCP/IP重传超时--RTO</title>
		<link>http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/</link>
		<comments>http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 12:19:27 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术细节]]></category>
		<category><![CDATA[retransmission timeout]]></category>
		<category><![CDATA[RTO]]></category>
		<category><![CDATA[TCP]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=3162</guid>
		<description><![CDATA[<p>概述：本文讨论主机在发送一个TCP数据包后，如果迟迟没有收到ACK，主机多久后会重传这个数据包。主机从发出数据包到第一次TCP重传开始，<a href="http://zh.wikipedia.org/wiki/RFC#RFC.E6.96.87.E4.BB.B6.E7.9A.84.E7.94.A2.E7.94.9F">RFC</a>中这段时间间隔称为retransmission timeout，缩写做RTO。本文会先看看RFC中如何定义RTO，然后看看Linux中如何实现。<strong>本文旨在分享</strong>：当遇到了TCP层问题改如何去查找、阅读文档，该如何去在Linux源码中寻求答案。</p>
<div class="myt1">1. 起源</div>
<p>在分析MySQL Semi-sync故障时，我们用Tcpdump+Wireshark（感谢淘宝雕梁）抓住当时的网络包传送细节，观察到了一次TCP重传最终导致了Semi-sync超时：</p>
<pre>
<div class="mycode">第一次传输
13:55:11.893291 master => slave	Binlog pos:319890197
重传：
13:55:12.094596	master => slave	Binlog pos:319890197
</div>
</pre>
<p>看到两次传送间隔约201毫秒，即第一次传输201毫秒后，还没有收到ACK响应，TCP认为传输超时，开始重传。</p>
<p>疑问：host和host之间的RTT大约是0.5毫秒，为什么第一次重传需要等200毫秒？（我希望是&#60;20ms）socket程序可以配置吗RTO吗？TCP有参数可配置RTO吗？</p>
<div class="myt1">2. Google/书籍/RFC</div>
<p>翻开TCP/IP详解找到关于TCP Retransmission章节，较详细的介绍TCP的超时机制，书中是个概述，于是又找到RFC1122。</p>
<p>RFC1122的4.2.2.15和4.2.3.1都介绍了Retransmission Timeout的处理（说来惭愧，这是第一次阅读TCP相关RFC）。</p>
<p>在<a href="http://www.ietf.org/rfc.html">RFC中搜索</a>Retransmission发现RFC 793 1122 2988 6298都有对重传算法、和初次重传超时的描述。于是开始阅读这个四个RFC，耗时约2小时，了解了大致的重传超时算法。[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>概述：本文讨论主机在发送一个TCP数据包后，如果迟迟没有收到ACK，主机多久后会重传这个数据包。主机从发出数据包到第一次TCP重传开始，<a href="http://zh.wikipedia.org/wiki/RFC#RFC.E6.96.87.E4.BB.B6.E7.9A.84.E7.94.A2.E7.94.9F">RFC</a>中这段时间间隔称为retransmission timeout，缩写做RTO。本文会先看看RFC中如何定义RTO，然后看看Linux中如何实现。<strong>本文旨在分享</strong>：当遇到了TCP层问题改如何去查找、阅读文档，该如何去在Linux源码中寻求答案。</p>
<div class="myt1">1. 起源</div>
<p>在分析MySQL Semi-sync故障时，我们用Tcpdump+Wireshark（感谢淘宝雕梁）抓住当时的网络包传送细节，观察到了一次TCP重传最终导致了Semi-sync超时：</p>
<pre>
<div class="mycode">第一次传输
13:55:11.893291 master => slave	Binlog pos:319890197
重传：
13:55:12.094596	master => slave	Binlog pos:319890197
</div>
</pre>
<p>看到两次传送间隔约201毫秒，即第一次传输201毫秒后，还没有收到ACK响应，TCP认为传输超时，开始重传。</p>
<p>疑问：host和host之间的RTT大约是0.5毫秒，为什么第一次重传需要等200毫秒？（我希望是<20ms）socket程序可以配置吗RTO吗？TCP有参数可配置RTO吗？</p>
<div class="myt1">2. Google/书籍/RFC</div>
<p>翻开TCP/IP详解找到关于TCP Retransmission章节，较详细的介绍TCP的超时机制，书中是个概述，于是又找到RFC1122。</p>
<p>RFC1122的4.2.2.15和4.2.3.1都介绍了Retransmission Timeout的处理（说来惭愧，这是第一次阅读TCP相关RFC）。</p>
<p>在<a href="http://www.ietf.org/rfc.html">RFC中搜索</a>Retransmission发现RFC 793 1122 2988 6298都有对重传算法、和初次重传超时的描述。于是开始阅读这个四个RFC，耗时约2小时，了解了大致的重传超时算法。<span id="more-3162"></span></p>
<div class="myt1">3. RFC中如何计算RTO(Retransmission Timeout)</div>
<div class="myt2">3.1 RFC-793如何计算RTO</div>
<p>概述：先根据该socket的RTT计算出SRTT（Smoothed Round Trip Time），然后根据一个最大、最小超时时间确定当前RTO。说明：srtt可以理解为“平滑化”的RTT，即在保持计算简单的情况尽量考虑历史RTT。</p>
<p>详细计算：SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)</p>
<p>基于SRTT，我们再来计算RTO：RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]]</p>
<p>UBOUND是RTO上线，ALPHA是平滑因子（smoothing factor， e.g., .8 to .9），BETA是一个延迟方差因子（BETA is a delay variance factor (e.g., 1.3 to 2.0)）。</p>
<p>仔细看这两个公式大概就能理解了RTO的计算了。</p>
<p>这里对上面两个公式做一个简单的注释：公式1中计算SRTT，ALPHA越接近于0，则表示SRTT越相信这一次的RTT；越接近于1，则表示SRTT越相信上次统计的RTT。公式二给RTO分别设置了一个上限和下限。</p>
<div class="myt2">3.2 RTO重传间隔是指数增加的</div>
<p>上面我们介绍的是初次重传时的RTO，如果重传后还没收到另一端的响应，下一次重传RTO则会指数增加，例如第一次重传RTO是1，之后分别2，4，8，16...。</p>
<div class="myt2">3.3 RFC-2988和RFC-6298中的RTO计算</div>
<p>在RFC-2988和RFC-6298中又重新改进了RTO的计算方法，Linux中的实现即使参考RFC-2988。算法核心公式：</p>
<pre>
<div class="mycode">初始：
SRTT <- R
RTTVAR <- R/2
RTO <- SRTT + max (G, K*RTTVAR)
where K = 4.

根据RTT计算SRTT：
RTTVAR <- (1 - beta) * RTTVAR + beta * |SRTT - R'|
SRTT <- (1 - alpha) * SRTT + alpha * R'

最后RTO：
RTO <- SRTT + max (G, K*RTTVAR)
</div>
</pre>
<div class="myt1">4. Linux中的RTO(Retransmission Timeout)</div>
<p>这里说的是RHEL5.4的2.6.18内核，RFC-2988实现参考net/ipv4/tcp_input.c中的tcp_rtt_estimator和tcp_set_rto。可以看到，在Linux中alpha=1/8，RTO最小为TCP_RTO_MIN。因为我们的系统中RTT总是很小，所以RTO取值总是能够取到TCP_RTO_MIN。</p>
<p>在看看TCP_RTO_MIN在Linux中的定义：</p>
<pre>
<div class="mycode">123#define TCP_RTO_MAX     ((unsigned)(120*HZ))
124#define TCP_RTO_MIN     ((unsigned)(HZ/5))
</div>
</pre>
<p>(这里简单的介绍介绍一下HZ，HZ可以理解为1s，所以120*HZ就是120秒，HZ/5就是200ms。详细的：HZ表示CPU一秒种发出多少次时间中断--IRQ-0，Linux中通常用HZ来做时间片的计算，<a href="http://blog.csdn.net/bdc995/article/details/4144031">参考</a>)</p>
<div class="myt1">5. 其他：Linux中可配置重传参数</div>
<p>/proc/sys/net/ipv4/tcp_retries1  (integer; default: 3)</p>
<p>TCP尝试了3次（tcp_retries1默认3）重传后，还没有收到ACK的话，则后续每次重传都需要network layer先更新路由。</p>
<p>/proc/sys/net/ipv4/tcp_retries2  (integer; default: 15)</p>
<p>TCP默认最多做15次重传。根据RTO(retransmission timeout)不同，最后一次重传间隔大概是13到30分钟左右。如果15次重传都做完了，TCP/IP就会告诉应用层说：“搞不定了，包怎么都传不过去！”</p>
<div class="myt1">6. 最后</div>
<p>回答前面的问题：即使RTT很小（0.8ms），但是因为RTO有下限，最小必须是200ms，所以这是RTT再小也白搭；RTO最小值是内核编译是决定的，socket程序中无法修改，Linux TCP也没有任何参数可以改变这个值。</p>
<p>好了，不容易。</p>
<p><script type="text/javascript" src="http://www.xiami.com/widget/player-single?uid=318706&#038;sid=382457&#038;mode=js"></script></p>
<p>广告：<a href="http://www.orczhou.com/index.php/projects/we-are-hunting-mysql-hacker/">我们寻找靠谱的人</a> | <a href="http://www.orczhou.com/index.php/wish-list/">感谢作者</a></p>
<p>参考文献</p>
<p>1. RFC 1122 ... (<a href="http://www.ietf.org/rfc.html">在哪儿查找RFC</a>) TCP协议相关的RFC：<br />
RFC 675 - Specification of Internet Transmission Control Program, December 1974 Version<br />
RFC 793 - TCP v4<br />
RFC 1122 - includes some error corrections for TCP<br />
RFC 1323 - TCP-Extensions<br />
RFC 1379 - Extending TCP for Transactions—Concepts<br />
RFC 1948 - Defending Against Sequence Number Attacks<br />
RFC 2018 - TCP Selective Acknowledgment Options<br />
RFC 2988 - Computing TCP's Retransmission Timer<br />
RFC 4614 - A Roadmap for TCP Specification Documents<br />
RFC 5681 - TCP Congestion Control</p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linux内存管理学习笔记--物理内存分配</title>
		<link>http://www.orczhou.com/index.php/2011/02/linux-memory-management-3/</link>
		<comments>http://www.orczhou.com/index.php/2011/02/linux-memory-management-3/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 14:33:30 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux kernel]]></category>
		<category><![CDATA[Linux MM]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2793</guid>
		<description><![CDATA[<p>每次深入了解一个技术问题，随着挖据的深入，都发现其背后总非常深的背景知识，甚至需要深入到很多底层系统，这个过程有时会让自己迷失，会让自己忘了当初的目的。</p>
<p>在<a href="http://www.orczhou.com/index.php/2011/02/linux-memory-management-1/">前篇</a>中介绍系统启动时内存的使用情况，本篇将介绍简要Linux如何接管主机的物理内存、组织内存，最后会较为详细的介绍Linux分配内存的一段代码。[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2011/02/linux-memory-management-3/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>每次深入了解一个技术问题，随着挖据的深入，都发现其背后总非常深的背景知识，甚至需要深入到很多底层系统，这个过程有时会让自己迷失，会让自己忘了当初的目的。</p>
<p>在<a href="http://www.orczhou.com/index.php/2011/02/linux-memory-management-1/">前篇</a>中介绍系统启动时内存的使用情况，本篇将介绍简要Linux如何接管主机的物理内存、组织内存，最后会较为详细的介绍Linux分配内存的一段代码。</p>
<p>前面说了，Linux MM系统细节非常多，自己在探究的时候，也是尝试尽量抓住主线，这里也只能抽取了一些“主线剧情”介绍，其中还可以扩展出很多细节，看客感兴趣可以自己深究，后续如果兴趣还在，我也还会继续写出来。内核版本如果没有特别说明，就是使用2.6.33版本。</p>
<div class="myt1">1. 物理内存组织</div>
<p>先声明一下，这里说的Linux都是运行Intel X86架构的。从80386开始，为了更好支持内存管理、虚拟内存技术，x86架构开始支持处理器的分页模式（分页是基于分段）。系统将内存分为一个个固定大小的块，称作“page frames”，x86架构每一个“page frames”大小为4096字节。Linux中使用<a href="http://lxr.linux.no/linux+v2.6.18/include/linux/mm.h#L223">struct page</a>结构来描述一个“page frames”【链接中给出了2.6.18内核下的Page结构】，一个Page结构对应了一个物理内存页。</p>
<p>在Linux中，所有的struct page对象都放在一个数组mem_map，mem_map每一个元素对应一个Page。</p>
<p><img src="http://www.orczhou.com/wp-content/uploads/2011/02/Linux-mem_map.jpg" alt="" title="Linux-mem_map" width="500" height="305" class="alignleft size-full wp-image-2849" /></p>
<div class="myt1">2. NUMA下的内存结构</div>
<p>在NUMA架构下，系统根据CPU的物理颗数，将内存分成对应的Node。例如，两颗物理CPU，16GB内存的硬件：系统则将内存分成两个8GB，分别分配给两颗CPU：</p>
<div class="mycode">my111.cm3:/root>#numactl --hardware<br />
available: 2 nodes (0-1)<br />
node 0 size: 8065 MB<br />
node 1 size: 8080 MB
</div>
<p>每一个Node，系统又将其分为多个Zone，<strong>64位</strong>x86架构下（参考:8.1.5），分为两个ZONE_DMA（低16MB，）、ZONE_NORMAL（其余内存）。所以NUMA架构下的内存分配，也就是在各个zone分配内存。</p>
<div class="myt1">3. 内存分配函数栈</div>
<p>从底层系统的角度，内存分配有如下函数（这里介绍的底层函数，和上层函数的关系，以后再介绍）：</p>
<p><img src="http://www.orczhou.com/wp-content/uploads/2011/02/funcion-allocate.png" alt="" title="funcion-allocate" width="619" height="182" class="alignleft size-full wp-image-2843" /></p>
<p>这里来调查一下函数alloc_pages都做了些什么，都调用了哪些函数：</p>
<p><img src="http://www.orczhou.com/wp-content/uploads/2011/02/function-stack1.png" alt="" title="function-stack" width="616" height="332" class="alignleft size-full wp-image-2847" /></p>
<p>free_area是一个底层保存空闲内存页的数组，有着特殊的结构，它也是内存分配<a href="http://www.google.com/search?sclient=psy&#038;hl=en&#038;site=&#038;source=hp&#038;q=Linux+buddy+system&#038;btnG=Google+Search">Buddy system</a>的核心变量。</p>
<div class="myt1">4. get_page_from_freelist和zone_reclaim_mode</div>
<p>上面函数get_page_from_freelist【mm/page_alloc.c】通过遍历系统中各个zone，来寻找可用内存，根据Linux系统中zone_reclaim_mode的设置不同，遍历时的行为略有不同。zone_reclaim_mode是Linux中的一个可配置参数，为了解该参数如何影响内存分配，那就打开get_page_from_freelist的代码，仔细看看遍历各个zone的流程：</p>
<p><img src="http://www.orczhou.com/wp-content/uploads/2011/02/Linux-mm-4.jpg" alt="" title="Linux-mm-4" width="600"  class="alignleft size-full wp-image-2798" /></p>
<p>上面看到，zone_reclaim_mode非零时，如果某个zone内存不够，则会尝试出发一次内存回收工作（zone_reclaim），等于零时，则直接尝试写一个zone。</p>
<p>上面是2.6.33内核的代码流程图，2.6.18（RHEL5.4的内核）中则因为没有zcl相对简单一些：</p>
<p><img src="http://www.orczhou.com/wp-content/uploads/2011/02/Linux-get_free_page.png" alt="" title="Linux-get_free_page" width="690" height="520" class="alignleft size-full wp-image-2852" /></p>
<p>流程图中可以看到，zone_reclaim_mode非零时，get_page_from_freelist【mm/page_alloc.c】函数中会调用zone_watermark_ok扫描free_area，如果当面有没有足够的可用内存，就会调用zone_reclaim【mm/vmscan.c】函数回收内存，zone_reclaim实际调用zone_reclaim【mm/vmscan.】收回内存。</p>
<div class="myt1">最后</div>
<p>每次深入了解一个技术问题，随着挖据的深入，都发现其背后总非常深的背景知识，甚至需要深入到很多底层系统，这个过程有时会让自己迷失，会让自己忘了当初的目的。如果是Linux方面的技术问题，一般最后会收缩到“体系结构”、“Linux原理”和“算法”，这恰恰对应了计算机系考研时候的三门课程：体系结构、操作系统、和数据结构</p>
<p>参考：</p>
<p><a href="http://www.cs.usfca.edu/~cruse/cs635s05/lesson04.ppt">Managing physical memory</a></p>
<p><a href="http://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/ref=sr_1_1?ie=UTF8&#038;qid=1297494046&#038;sr=8-1">Understanding the Linux Kernel, 3rd Edition</a></p>
<p>广告时间：<a href="http://www.orczhou.com/index.php/projects/we-are-hunting-mysql-hacker/">工作机会--MySQL Hacker</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2011/02/linux-memory-management-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux内存管理学习笔记--概述</title>
		<link>http://www.orczhou.com/index.php/2011/02/linux-memory-management-1/</link>
		<comments>http://www.orczhou.com/index.php/2011/02/linux-memory-management-1/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 14:44:28 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2773</guid>
		<description><![CDATA[<p>随着要维护的服务器增多，遇到的各种稀奇古怪的问题也会增多，要想彻底解决这些“小”问题往往需要更深的Linux方面的知识。越专业、分工越细的工程师，在这方面的要求也就越高。这次，对MySQL Swap的问题的探索过程，就一不小心掉进了Linux Memory Managemant（Linux MM）的[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2011/02/linux-memory-management-1/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>随着要维护的服务器增多，遇到的各种稀奇古怪的问题也会增多，要想彻底解决这些“小”问题往往需要更深的Linux方面的知识。越专业、分工越细的工程师，在这方面的要求也就越高。这次，对MySQL Swap的问题的探索过程，就一不小心掉进了Linux Memory Managemant（Linux MM）的研究中去了，爬了很久才出来，这里做一个系列笔记。</p>
<p>笔记中很多内容都是参考《<a href="http://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/ref=sr_1_1?ie=UTF8&#038;qid=1297494046&#038;sr=8-1">Understanding the Linux Kernel, 3rd Edition</a>》、Linux Source Code等地方，自己再做了一些总结，觉得有意义的总结这里记录一下，供参考。</p>
<div class="myt1">1. 写在前面</div>
<p>Linux MM是一个比较猥琐的体系，虽然理论不太多，但是细节非常多。要从底层物理内存管理到上层虚拟内存管理整个关节打通，一方面需要较多底层架构知识、还需要很深的Linux知识。既然是学习笔记，先说一下我的学习资料：</p>
<p>1. <a href="http://tldp.org/LDP/tlk/mm/memory.html">Linux Memory Management</a> David A Rusling 这本书很老了，当时的Kernel还是2.0.33版本的；这本书的优点在于抽象得很到位，把Linux_MM的基本模块、思想都通俗易懂的介绍了一遍。这也是kernel-docs.txt中推荐的读物之一；</p>
<p>2. 《<a href="http://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/ref=sr_1_1?ie=UTF8&#038;qid=1297494046&#038;sr=8-1">Understanding the Linux Kernel, 3rd Edition</a>》中的第二、八、十七章  这是基于2.6内核，非常有参考价值，介绍得非常细致，可以结合内核的源代码一起来看。</p>
<p>3. Linux Source Code  只看了几个自己关心的函数，没那么难:)</p>
<p>我不是计算机科班出身，体系结构的基础比较差，所以刚开始入门的时间相对较长，前后大概历时一个月，实际伏案时间约50小时，而这也只是一个开始</p>
<div class="myt1">2. 基本框架</div>
<p><img src="http://www.orczhou.com/wp-content/uploads/2011/02/Linux-MM-1.jpg" alt="" title="Linux-MM-1" width="580"  class="alignleft size-full wp-image-2777" /></p>
<p>上面是一幅简图，后面会分别介绍，Kernel如何使用内存、Kernel如何管理分配内存、用户空间的内存管理。对于其中的一些细节则会单独介绍，例如大页内存，内存回收算等等。</p>
<div class="myt1">2. Linux启动与内存管理</div>
<p>开机的第一个过程是BIOS自检，BIOS使用0x00000000到0x10000（1MB）内存，这1MB内存包括了自检程序、自检结果、还留一部分给显示设备使用；自检完成后，开始载入Linux内核，Linux从1MB开始使用物理内存，一般5MB就足够了，在内核的符号信息中可以看到，Linux内核从_text开始，_edata处结束</p>
<div class="mycode">$more /boot/System.map-2.6.9-55.ELsmp|grep "\ _text$\|_etext$\| _edata$\| _end$"<br />
ffffffff80100000 A _text<br />
ffffffff80310399 A _etext<br />
ffffffff80456aa8 A _edata
</div>
<p>简图：</p>
<p><img src="http://www.orczhou.com/wp-content/uploads/2011/02/Linux-mm-2.jpg" alt="" title="Linux-mm-2" width="475" height="392" class="alignleft size-full wp-image-2782" /></p>
<p>这里不涉及x86架构下的分页、分段细节，后面会单独介绍之。</p>
<p>这一篇很简单，是一个开始:)</p>
<p>【update 2011-03-29】</p>
<p>在<strong>64位系统</strong>中，Linux(2.6.18)从2MB开始使用物理内存。(32位系统，仍然是从1MB开始)</p>
<div class="mycode">file: ./arch/x86_64/defconfig<br />
CONFIG_PHYSICAL_START=0x200000<br />
//This gives the physical address where the kernel is loaded.
</div>
<p>参考文献：</p>
<p>[1]. <a href="http://cateee.net/lkddb/web-lkddb/PHYSICAL_START.html">http://cateee.net/lkddb/web-lkddb/PHYSICAL_START.html</a></p>
<p>广告时间：<a href="http://www.orczhou.com/index.php/projects/we-are-hunting-mysql-hacker/">工作机会--MySQL Hacker</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2011/02/linux-memory-management-1/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Linux Top命令学习</title>
		<link>http://www.orczhou.com/index.php/2010/12/linux-top-tips/</link>
		<comments>http://www.orczhou.com/index.php/2010/12/linux-top-tips/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 15:43:57 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2726</guid>
		<description><![CDATA[<p>也忘了第一次用Top观察Linux运行状态是什么时候了，不过最近吧Top的文档收获不少。</p>
<div class="myt1">1. 有用的命令top-z-x</div>
<div class="mycode">
<pre>
z    :打开/关闭彩色显示
x    :高亮显示排序列
</pre>
</div>
<p>在使用top命令后，“先按z键，再按x键”，这时屏幕会彩色显示输出，白色显示的列是当前排序的列；偶尔还会有一些[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2010/12/linux-top-tips/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>也忘了第一次用Top观察Linux运行状态是什么时候了，不过最近吧Top的文档收获不少。</p>
<div class="myt1">1. 有用的命令top-z-x</div>
<div class="mycode">
<pre>
z    :打开/关闭彩色显示
x    :高亮显示排序列
</pre>
</div>
<p>在使用top命令后，“先按z键，再按x键”，这时屏幕会彩色显示输出，白色显示的列是当前排序的列；偶尔还会有一些白色显示行，这些行是当前正在运行进程。使用该参数可以帮助我们更清楚的看到排序列。例如，我想按照cpu使用排序来查看进程：</p>
<p><a href="http://www.flickr.com/photos/26825745@N06/5263726748/" title="top-z-x by orczhou, on Flickr"><img src="http://farm6.static.flickr.com/5007/5263726748_ea49a86290.jpg" width="500" height="176" alt="top-z-x" /></a></p>
<p>使用了top-z-x命令后是不是看得清晰了一些:)</p>
<div class="myt1">2. 有用的命令top-1</div>
<div class="mycode">
<pre>
1    :SMP的系统，会单独显示各个CPU的运行状态
</pre>
</div>
<p><a href="http://www.flickr.com/photos/26825745@N06/5263751592/" title="top-1 by orczhou, on Flickr"><img src="http://farm6.static.flickr.com/5286/5263751592_016743a967.jpg" width="287" height="299" alt="top-1" /></a></p>
<div class="myt1">3. 选择排序列top-z-x-&lt;</div>
<div class="mycode">
<pre>
<    :改变排序列
>    :改变排序列
</pre>
</div>
<p>top-z-x-&lt; 试试就知道是什么意思了:) 。例如，默认是按照cpu使用率排序的，现在我想看看安装使用的虚拟内存排序看看，使用命令top-z-x-&lt;-&lt;-&lt;-&lt;-&lt; ：</p>
<p><a href="http://www.flickr.com/photos/26825745@N06/5263760668/" title="top-z-x-lt by orczhou, on Flickr"><img src="http://farm6.static.flickr.com/5004/5263760668_3278706d02.jpg" width="500" height="196" alt="top-z-x-lt" /></a></p>
<div class="myt1">4. 其他技巧</div>
<div class="mycode">
<pre>
W    :把当前配置文件到home目录下.toprc配置文件中
F or O :支持更强的选择排序列的方式

-b   :参数可以帮你在脚本中使用top命令
-n   :配合-b使用，表示重新刷新一定次数后退出
-d   :刷新延时时间。例如-d 5 表示top每隔5秒刷新一次。（默认是3秒）
</pre>
</div>
<p>就这些吧，更多请查看top-h或者<a href="http://en.wikipedia.org/wiki/RTFM">RTFM</a>。</p>
<p>最后，各位看官，工作之余别忘了多多运动，没什么比健康更重要了:)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2010/12/linux-top-tips/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Flashcache配置</title>
		<link>http://www.orczhou.com/index.php/2010/11/flashcache-configuration-how-to/</link>
		<comments>http://www.orczhou.com/index.php/2010/11/flashcache-configuration-how-to/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 16:14:03 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Flashcache]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2527</guid>
		<description><![CDATA[<p>前面写了两篇文章，分别介绍了<a href="http://www.orczhou.com/index.php/2010/09/flachcache-first-view/">Flashcache</a>的基本原理和<a href="http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/">编译安装</a>，本文介绍一下Flashcache的配置。</p>
<p>假设现在你已经<a href="http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/">编译好了</a>Flashcache，已经装好了ssd盘（假设是/dev/sdb）和sas盘（假设需要使用的是分区/dev/sda12，这可能是一个RAID组）。接下来，看看如何使用Flashcache将上面两个设备虚拟成一个带缓存的块设备。</p>
<div class="myt1">1. 首次创建Flashcach设备</div>
<p>注：请备份你的数据先！！！特别是/dev/sdb，这个设备上的数据将会被清空；理论上/dev/sda12上的数据不会有任何丢失。</p>
<p>首先确保sda12没有被挂载，如果挂载了，使用umount卸载之，然后使用flashcache_create创建设备：</p>
<div class="mycode">./flashcache_create cachedev /dev/sdb /dev/sda12</div>
<p>如果是sudo帐号可能会遇到如下的报错：[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2010/11/flashcache-configuration-how-to/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>前面写了两篇文章，分别介绍了<a href="http://www.orczhou.com/index.php/2010/09/flachcache-first-view/">Flashcache</a>的基本原理和<a href="http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/">编译安装</a>，本文介绍一下Flashcache的配置。</p>
<p>假设现在你已经<a href="http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/">编译好了</a>Flashcache，已经装好了ssd盘（假设是/dev/sdb）和sas盘（假设需要使用的是分区/dev/sda12，这可能是一个RAID组）。接下来，看看如何使用Flashcache将上面两个设备虚拟成一个带缓存的块设备。</p>
<div class="myt1">1. 首次创建Flashcach设备</div>
<p>注：请备份你的数据先！！！特别是/dev/sdb，这个设备上的数据将会被清空；理论上/dev/sda12上的数据不会有任何丢失。</p>
<p>首先确保sda12没有被挂载，如果挂载了，使用umount卸载之，然后使用flashcache_create创建设备：</p>
<div class="mycode">./flashcache_create cachedev /dev/sdb /dev/sda12</div>
<p>如果是sudo帐号可能会遇到如下的报错：<span id="more-2527"></span></p>
<blockquote><p>sh: dmsetup: command not found</p></blockquote>
<p>可以设置PATH变量的办法，来避免：（感谢<a href="http://blog.yufeng.info/about">余峰</a>帮助）</p>
<div class="mycode">sudo PATH=/sbin ./flashcache_create cachedev /dev/sdb /dev/sda12</div>
<p>这样Linux就虚拟除了一个带缓存的块设备：</p>
<div class="mycode">$ls -lah /dev/mapper/cachedev<br />
brw-rw---- 1 root disk 253, 0 Oct  8 15:46 /dev/mapper/cachedev</div>
<div class="myt1">2. 使用该设备</div>
<p>这样就可以像使用一般的块设备一样，来使用该设备了。如果原来分区/dev/sda12上已经有文件系统，mount后还可以正常使用；如果没有文件系统，也可以和一般的设备一样做先做文件系统，然后mount并使用之。</p>
<div class="mycode">mount /dev/mapper/cachedev /u01</div>
<p>很简单吧:)</p>
<div class="myt1">3. 如何重做Flashcache</div>
<p>首先需要umount相应分区，然后如果需要重新做Flashcache：</p>
<div class="mycode">umount /u01<br />
dmsetup remove cachedev<br />
./flashcache_destroy /dev/sdb
</div>
<p>如果需要重建，再安装上面的flashcache_create重建就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2010/11/flashcache-configuration-how-to/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>一个有趣的perl函数</title>
		<link>http://www.orczhou.com/index.php/2010/11/a-interesting-sub-of-perl-random-quote/</link>
		<comments>http://www.orczhou.com/index.php/2010/11/a-interesting-sub-of-perl-random-quote/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 12:44:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[代码细节]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2653</guid>
		<description><![CDATA[<p>入职已经<a href="http://www.orczhou.com/index.php/2009/07/tomorrow_entry/">489天</a>了，新鲜事很多，不过更多应该是无趣、枯燥的日常：装很多的数据库、反复的测试、写很多的脚本...... 不过，在这繁忙工作中，还是希望自己能够保持一份趣味。</p>
<p>下面这个perl函数就是帮你保持脚本有趣的一个办法。</p>
<p>在你的Perl脚本中下面的函数，并在脚本的第一行调用之。函数会在你的输出前[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2010/11/a-interesting-sub-of-perl-random-quote/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>入职已经<a href="http://www.orczhou.com/index.php/2009/07/tomorrow_entry/">489天</a>了，新鲜事很多，不过更多应该是无趣、枯燥的日常：装很多的数据库、反复的测试、写很多的脚本...... 不过，在这繁忙工作中，还是希望自己能够保持一份趣味。</p>
<p>下面这个perl函数就是帮你保持脚本有趣的一个办法。</p>
<p>在你的Perl脚本中下面的函数，并在脚本的第一行调用之。函数会在你的输出前随机的输出一条“名言”，让你在枯燥的调试程序时，仍然保持一份清醒：</p>
<pre>
<div class="mycode">use MIME::Base64;
#######################################################
#  This is a interesting function by orczhou@gmail.com
#  It outputs a random quote
#######################################################
sub randomQuote{
        my @quote;
        push(@quote,"S2VlcCBpdCBzaW1wbGUsIFN0dXBpZA==");
        push(@quote,"VG9tb3Jyb3cgaXMgYW5vdGhlciBkYXk=");
        push(@quote,"TGlmZSBpcyBsaWtlIGEgYm94IG9mY2hvY29sYXRlcw==");
        push(@quote,"VGhlIGFuZ3J5IGlzIHRoYXQgdGFraW5nIHRoZSBvdGhlcidzIG1pc3Rha2UgdG8gcHVuaXNoIG9uZXNlbGY=");
        push(@quote,"VGhlIGhvcGUgb2YgdG9tb3Jyb3cgbGV0cyB1cyBmb3JnZXQgdG9kYXkncyBwYWlu");
        push(@quote,"VGhlIHBsYWNlIHdoaWNoIHRoZSBpZGVhbCBpcyBpbiwgdGhlIGhlbGwgbWF5YmUgYSBoZWF2ZW4=");
        push(@quote,"Rm9yIGhpcyBsb25nIGFuZCBub24tdmlvbGVudCBzdHJ1Z2dsZSBmb3IgZnVuZGFtZW50YWwgaHVtYW4gcmlnaHRzIGluIENoaW5h");
        push(@quote,"V2hhdCBpcyBkb25lIGJ5IG5pZ2h0IGFwcGVhcnMgYnkgZGF5");
        push(@quote,"SWYgeW91IHdhbnQgdG8gaGF2ZSB0aGUgcGVyZmVjdCBmcmllbmRzaGlwLCBwb3NzaWJseSB5b3UgbWF5IGZpbmQgbm8gZnJpZW5kIGZvciBhbGw
gbGlmZXRpbWU=");
        push(@quote,"VGhlIGV4cGVyaWVuY2UgdGFrZXMgb3V0IGJ5IHRoZSBlc3NlbmNlIG9mIHBhaW4=");
        push(@quote,"VGhlIGJpZ2dlc3QgbWlzdGFrZSBpbiBsaWZlIGlzIHRoZSB1bmNlYXNpbmdseSB3b3JyaWVkIGFib3V0IG1ha2luZyBtaXN0YWtl");
        push(@quote,"TGF6aW5lc3Mgd2lsbCBjYXVzZSB5b3UgcGFpbg==");
        push(@quote,"S2VlcCB0aGUgcGFzc2lvbiBmb3IgeW91ciBqb2I=");
        push(@quote,"VGhlcmUgaXMgb2Z0ZW4gbGVzcyBkYW5nZXIgaW4gdGhlIHRoaW5ncyB3ZSBmZWFyIHRoYW4gaW4gdGhlIHRoaW5ncyB3ZSBkZXNpcmU=");
        push(@quote,"WW91IGNhbiB1c2Ugc2NyaXB0IGRvIG1vcmUgd29yayxidXQgc2FkZGx5IGl0IG1ha2UgbW9yZSBqb2JzIGNvbWUgdG8gdQ==");
        push(@quote,"TXkgbmFtZSBpcyBteXNxbGRhdXRvLkkgd2FzIGNyZWF0ZWQgYnkgb3JjemhvdQ==");
        #push(@quote,"");
        my $count = scalar(@quote);
        my $rand_num = int(rand($count));
        print decode_base64($quote[$rand_num])."\n";
}

randomQuote();
</div>
</pre>
<p>如果觉得上面的代码，破坏了脚本的输出，可以使用参数控制其是否输出。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2010/11/a-interesting-sub-of-perl-random-quote/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flashcace安装 How-to</title>
		<link>http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/</link>
		<comments>http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 10:28:44 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Flashcache]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2503</guid>
		<description><![CDATA[<p><a href="http://www.facebook.com/note.php?note_id=388112370932">Flashcache</a>的安装在其<a href="http://github.com/facebook/flashcache/blob/master/README">README</a>和<a href="http://github.com/facebook/flashcache/blob/master/README-CentOS5.4">README-CentOS5.4</a>已经有一个很详细的说明了，但是实际操作并不是很顺利，而且有些同事表示在编译过程中<a href="http://www.orczhou.com/index.php/2010/09/flachcache-first-view/#comment-1310">仍遇到了一些问题</a>，这里详细的记录一下自己的编译、安装过程。</p>
<div class="myt1">1. 环境说明</div>
<p>使用的是RHEL5.4的系统：</p>
<div class="mycode">$cat /etc/issue<br />
Red Hat Enterprise Linux Server release 5.4 (Tikanga)<br />
$uname -a<br />
Linux myhost 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
</div>
<p>[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.facebook.com/note.php?note_id=388112370932">Flashcache</a>的安装在其<a href="http://github.com/facebook/flashcache/blob/master/README">README</a>和<a href="http://github.com/facebook/flashcache/blob/master/README-CentOS5.4">README-CentOS5.4</a>已经有一个很详细的说明了，但是实际操作并不是很顺利，而且有些同事表示在编译过程中<a href="http://www.orczhou.com/index.php/2010/09/flachcache-first-view/#comment-1310">仍遇到了一些问题</a>，这里详细的记录一下自己的编译、安装过程。</p>
<div class="myt1">1. 环境说明</div>
<p>使用的是RHEL5.4的系统：</p>
<div class="mycode">$cat /etc/issue<br />
Red Hat Enterprise Linux Server release 5.4 (Tikanga)<br />
$uname -a<br />
Linux myhost 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
</div>
<p><span id="more-2503"></span></p>
<div class="myt1">2. 需要的RPM包</div>
<p>安装基本工具包：rpm-build redhat-rpm-config unifdef。一般情况这三个包都是安装过的，检查一下即可。</p>
<div class="mycode">$sudo yum install rpm-build<br />
Package rpm-build-4.4.2.3-18.el5.x86_64 already installed and latest version<br />
$sudo yum install redhat-rpm-config<br />
Package redhat-rpm-config-8.0.45-32.el5.noarch already installed and latest version<br />
$sudo yum install unifdef<br />
Package unifdef-1.171-5.fc6.x86_64 already installed and latest version</div>
<div class="myt1">3. 下载并安装源码包</div>
<p>现在的RHEL发行版中，已经不再带源码包，所以需要单独下载，供Flashcache编译使用。</p>
<div class="myt2">3.1 准备目录</div>
<div class="mycode">[supu@host]$ cd<br />
[supu@host]$ mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}<br />
[supu@host]$ echo '%_topdir %(echo $HOME)/rpmbuild' &gt; .rpmmacros</div>
<div class="myt2">3.2 下载源码包</div>
<p>可以在<a href="ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS">ftp://ftp.redhat.com/</a>下载到对应的源码包。这里的内核版本号是：</p>
<div class="mycode">$uname -r<br />
2.6.18-164.el5</div>
<p>所以需要下载的是kernel-2.6.18-164.el5.src.rpm，完整的URL是：</p>
<div class="mycode">ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/kernel-2.6.18-164.el5.src.rpm</div>
<p>注：最好<a href="http://sitka.triumf.ca/pub/linux/redhat-mirror2.html">选择合适</a>的镜像下载，速度会差很多的。</p>
<div class="myt2">3.3 安装源码包</div>
<p>有了前面的目录准备，现在可以安装源码包了</p>
<div class="mycode">sudo rpm -i kernel-2.6.18-164.el5.src.rpm<br />
cd ~/rpmbuild/SPECS<br />
rpmbuild -bp --target=`uname -m` kernel-2.6.spec 2> prep-err.log | tee prep-out.log</div>
<p>OK，这时候源码包就安装到了如下目录：/home/supu/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64</p>
<div class="myt2">3.4 准备模块编译</div>
<p>在源码目录执行如下命令，主备Flashcache模块编译</p>
<div class="mycode">cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64<br />
make oldconfig<br />
make prepare<br />
make modules_prepare</div>
<div class="myt1">4. 编译Flashcache</div>
<p>可以在<a href="http://github.com/facebook/flashcache">github</a>上下载Flashcache的源代码，和Linux源码一起编译，编译完成后会生成三个可执行程序和一个可动态加载的内核模块：</p>
<div class="mycode">flashcache_create<br />
flashcache_load<br />
flashcache_destroy<br />
flashcache.ko</div>
<div class="myt2">4.1 下载并准备编译</div>
<p>在在<a href="http://github.com/facebook/flashcache">github</a>上可以下载到Flashcache最新的源码。这里下载的是flashcache-1.0.11，解压后，有如下目录：</p>
<div class="mycode">[supu@host facebook-flashcache-15adea8]$ ls<br />
doc  flashcache-wt  LICENSE  Makefile  README  README-CentOS5.4  README-DKMS  src</div>
<p>其中src包含了普通的Flashcache（这里的普通指的是Write-back版本的Flashcache），flashcache-wt包含了Write-Through版本的源码；文件README-CentOS5.4中包含了在RHEL5.4下编译的注意事项，本文主要参考该文件。</p>
<p>按照README-CentOS5.4中的说明，修改文件src/Makefile，将行EXTRA_CFLAGS（第一行），用如下内容替换：</p>
<pre>
<div class="mycode">EXTRA_CFLAGS=-I$(KERNEL_TREE)/drivers/md -I$(KERNEL_TREE)/include/linux  -I./</div>
</pre>
<div style="color:red">注意：这里没有换行。</div>
<div class="myt2">4.2 编译之</div>
<div class="mycode">make KERNEL_TREE=/home/supu/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/</div>
<div class="myt2">4.3 动态加载模块</div>
<p>最后需要将模块flashcache.ko加载到内核，这里可以将flashcache.ko拷贝到相应目录：</p>
<div class="mycode">sudo cp flashcache.ko /lib/modules/2.6.18-164.el5/kernel/drivers/block</div>
<p>或者使用insmod命令，动态加载之：</p>
<div class="mycode">sudo insmod flashcache.ko </div>
<p>Job Done! Enjoy!</p>
<p>参考：</p>
<p>1. <a href="http://github.com/facebook/flashcache/blob/master/README-CentOS5.4">Flashcache README-CentOS5.4</a></p>
<p>2. <a href="http://github.com/facebook/flashcache/blob/master/README">Flashcache README</a></p>
<p>3. <a href="http://www.cyberciti.biz/faq/rhel5-installing-kernel-source-code/">Redhat enterprise Linux / CentOS installing kernel source code</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flachcache初探</title>
		<link>http://www.orczhou.com/index.php/2010/09/flachcache-first-view/</link>
		<comments>http://www.orczhou.com/index.php/2010/09/flachcache-first-view/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 03:38:34 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Flashcache]]></category>
		<category><![CDATA[图解]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2368</guid>
		<description><![CDATA[<p>Flashcache是Facebook技术团队的又一力作，最初是为加速MySQL设计的。Flashcache是在Linux层面的，所以任何受磁盘IO困绕的软件或应用都可以方便的使用之。</p>
<div class="myt1">1. Why Flashcache</div>
<p>随着时间的流逝，网站上的数据一直在不停的积累。如果你经营的只是一个博客的话，这不会是问题，因为10G的空间，大概就够你写一辈子了（如果放在硬盘上，其实一辈子很短）。如果你恰巧在一个快速增长的公司，数据会越来越多，从MB，到GB，再到TB。</p>
<p>如果将这些数据全部放在大容量的SATA、SAS盘上时，会发现性能（响应时间）不够；如果全放在SSD上时，又会发现成本很高。即使公司能够大气到都放到SSD上，你会发现1TB的数据里面可能只有200G是经常被访问的，300G可能偶尔被访问到，最后剩下的500G可能已经成为历史数据了，几乎不被访问到，如果全部都放在SSD上有略有浪费。于是就有了<a href="http://www.facebook.com/note.php?note_id=388112370932">Flashcache</a>。</p>
<p>Flashcache一个非常不错的软件（准确的说是一个<a href="http://tldp.org/LDP/lkmpg/2.6/html/">Linux的模块</a>），可以动态加载。Flashcache通过在文件系统（VFS）和设备驱动之间新增了一次缓存层，来实现对热门的缓存。Flashcache是另一种缓存，一般用SSD作为介质的缓存（一般的缓存用的是内存），通过将传统硬盘上的热门数据缓存到SSD上，然后利用SSD优秀的读性能，来加速系统。这个方法较之内存缓存，没有内存快，但是空间可以比内存大很多。</p>
<p>本文是一个关于Flashcache的初步介绍。[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2010/09/flachcache-first-view/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>Flashcache是Facebook技术团队的又一力作，最初是为加速MySQL设计的。Flashcache是在Linux层面的，所以任何受磁盘IO困绕的软件或应用都可以方便的使用之。</p>
<div class="myt1">1. Why Flashcache</div>
<p>随着时间的流逝，网站上的数据一直在不停的积累。如果你经营的只是一个博客的话，这不会是问题，因为10G的空间，大概就够你写一辈子了（如果放在硬盘上，其实一辈子很短）。如果你恰巧在一个快速增长的公司，数据会越来越多，从MB，到GB，再到TB。</p>
<p>如果将这些数据全部放在大容量的SATA、SAS盘上时，会发现性能（响应时间）不够；如果全放在SSD上时，又会发现成本很高。即使公司能够大气到都放到SSD上，你会发现1TB的数据里面可能只有200G是经常被访问的，300G可能偶尔被访问到，最后剩下的500G可能已经成为历史数据了，几乎不被访问到，如果全部都放在SSD上有略有浪费。于是就有了<a href="http://www.facebook.com/note.php?note_id=388112370932">Flashcache</a>。</p>
<p>Flashcache一个非常不错的软件（准确的说是一个<a href="http://tldp.org/LDP/lkmpg/2.6/html/">Linux的模块</a>），可以动态加载。Flashcache通过在文件系统（VFS）和设备驱动之间新增了一次缓存层，来实现对热门的缓存。Flashcache是另一种缓存，一般用SSD作为介质的缓存（一般的缓存用的是内存），通过将传统硬盘上的热门数据缓存到SSD上，然后利用SSD优秀的读性能，来加速系统。这个方法较之内存缓存，没有内存快，但是空间可以比内存大很多。</p>
<p>本文是一个关于Flashcache的初步介绍。<span id="more-2368"></span></p>
<div class="myt1">2. 谁适合用Flashcache</div>
<p>数据量很大（例如4TB），热门数据也很大（800GB），不必要或者不舍得全部买内存来缓存。</p>
<div class="myt1">3. 谁<strong>不</strong>适合用Flashcache</div>
<p>数据量不大的话，一般Flashcache就没什么用武之地了，内存就可以帮你解决问题了；</p>
<p>不差钱，买内存呗；</p>
<p>另外Flashcache的加入也使得系统的复杂度增加了一层，如果你坚持<a href="http://en.wikipedia.org/wiki/KISS_principle">KISS原则</a>（Keep it simple, Stupid!），也可以弃用之。</p>
<div class="myt1">4. 基本原理图</div>
<p><a href="http://www.flickr.com/photos/26825745@N06/5023251788/" title="Flashcache_orczhou by orczhou, on Flickr"><img src="http://farm5.static.flickr.com/4146/5023251788_f67a46dc7d.jpg" width="500" height="296" alt="Flashcache_orczhou" /></a></p>
<p>上图中，Flashcache将普通的SAS盘（/dev/sda）和一个高速的SSD(/dev/sdb)虚拟成一个带缓存的块设备（/dev/mapper/cachedev）。后续还将会有更多关于Flashcache相关的文章出现，敬请期待。</p>
<div class="myt1">5. Flashcache是否只是一个过渡产品</div>
<p>对于当前，PCI接口的SSD价格还十分昂贵，而随着时间的推移，价格会降；另外，根据<a href="http://zh.wikipedia.org/zh-hk/%E6%91%A9%E5%B0%94%E5%AE%9A%E5%BE%8B">摩尔定律</a>，未来会有更快的设备出现，所以Flashcache是一个“持久的”产品，还只是一个过渡软件，这并不好说。</p>
<p>关注未来新技术的发展吧:)</p>
<p>参考：</p>
<p>1. <a href="http://github.com/facebook/flashcache/">Facebook / Flashcache</a></p>
<p>2. <a href="http://www.facebook.com/note.php?note_id=388112370932">Releasing Flashcache of Facebook</a></p>
<p>3. <a href="http://github.com/facebook/flashcache/blob/master/doc/flashcache-doc.txt">flashcache-doc.txt</a></p>
<p>PS：写完整篇文章，最大的收获是：发现人的一生其实很短、很短，可能连1GB都不到。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2010/09/flachcache-first-view/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Linux下使用od查看文件</title>
		<link>http://www.orczhou.com/index.php/2010/08/linux-od-data-file/</link>
		<comments>http://www.orczhou.com/index.php/2010/08/linux-od-data-file/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 10:44:35 +0000</pubDate>
		<dc:creator>orczhou</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2407</guid>
		<description><![CDATA[<p><font color="red">
<pre>        "不积跬步，无以至千里"
                                 《劝学》
</pre>
<p></p></font></p>
<p>查看文本文件使用vim/less就足够了，但如果想要查看一些其他二进制文件（例如DB的数据文件、程序的二进制代码）则借助于od/hexdump这些工具会很方便，这里会通过一些实例来详细介绍od命令的相关参数。</p>
<div class="myt1">1. od参数详解</div>
<pre>
<div class="mycode">$od -j 49152 -N 38 -w4 -A d -t x1 -v tmp_test.ibd
0049152 fd 6f fb 70
0049156 00 00 00 03
0049160 ff ff ff ff
0049164 ff ff ff ff
0049168 00 00 00 03
0049172 ba 92 ac 0c
0049176 45 bf 00 00
0049180 00 00 00 00
0049184 00 00 00 00
</div>
</pre>
<p>[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2010/08/linux-od-data-file/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><font color="red">
<pre>        "不积跬步，无以至千里"
                                 《劝学》
</pre>
<p></font></p>
<p>查看文本文件使用vim/less就足够了，但如果想要查看一些其他二进制文件（例如DB的数据文件、程序的二进制代码）则借助于od/hexdump这些工具会很方便，这里会通过一些实例来详细介绍od命令的相关参数。</p>
<div class="myt1">1. od参数详解</div>
<pre>
<div class="mycode">$od -j 49152 -N 38 -w4 -A d -t x1 -v tmp_test.ibd
0049152 fd 6f fb 70
0049156 00 00 00 03
0049160 ff ff ff ff
0049164 ff ff ff ff
0049168 00 00 00 03
0049172 ba 92 ac 0c
0049176 45 bf 00 00
0049180 00 00 00 00
0049184 00 00 00 00
</div>
</pre>
<p><span id="more-2407"></span></p>
<p>-j 49152 跳过前49152个字节（bytes）</p>
<p>-N 38 仅显示38个字节</p>
<p>-w4 每一行显示4个字节</p>
<p>-A d 表示最左侧的偏移量按十进制显示；-A还可以接[doxn]，其中d表示十进制，o表示8进制，x表示16进制，n表示不显示该偏移量，如：</p>
<pre>
<div class="mycode">od -j 49152 -N 8 -w4 -A n -t x1 -v ibdata1
 b4 0b c7 31
 00 00 00 03
</div>
</pre>
<p>-t x1表示如何显示文件内容。这里，x表示按照16进制输出文件内容，x后面跟的“1”表示一次显示一个字节。下面是一个-t x2的输出：</p>
<pre>
<div class="mycode">od -j 49152 -N 8 -w4 -A n -t x2 -v ibdata1
 0bb4 31c7    # 0bb4是十进制表示的两个字节
 0000 0300    #
</div>
</pre>
<p>另外，注意到这里是0bb4和前面的b40b略有不同，这是因为我这里的测试平台是little-endian的（x86_64 Linux）。</p>
<p>最后，参数-v表示，即使连续多行都是完全相同的字符0，仍然原样输出；不加该参数，则会使用星号（*）跳过多个相同的行。</p>
<p>好了，再回头看看最前面的命令，已经没那么难理解了吧。</p>
<p>参考文献：man od</p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2010/08/linux-od-data-file/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linux下使用screen工作How-to</title>
		<link>http://www.orczhou.com/index.php/2010/08/linux-screen-how-to/</link>
		<comments>http://www.orczhou.com/index.php/2010/08/linux-screen-how-to/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 05:02:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.orczhou.com/?p=2396</guid>
		<description><![CDATA[<p>通过ssh在Linux终端下工作，有一个很烦的事情就是，如果需要执行一个长时间的命令（例如拷贝一个大文件，或者做DDL）时，如果终端意外断开（网络或者别的原因），一般命令就会终止，当然你可以使用nohup命令，这里提供另一个办法：使用<a href="http://www.gnu.org/software/screen/">screen</a>。</p>
<p>一般，我们创建一个screen会话，然后连接会话并在会话下工作，这时候，我们可以随时挂起会话，去做别的事情，而且这个挂起的会话会一直在后台执行。而后又可以重新连接会话。下面是一个简单的How-to：</p>
<div class="myt1">1. How-to</div>
<div class="myt2">1.1 创建一个screen会话</div>
<div class="mycode">screen -dmS supu</div>
<p>该命令，创建一个名为supu的会话，当时并不立刻进入会话。[......]</p><p class='read-more'><a href='http://www.orczhou.com/index.php/2010/08/linux-screen-how-to/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>通过ssh在Linux终端下工作，有一个很烦的事情就是，如果需要执行一个长时间的命令（例如拷贝一个大文件，或者做DDL）时，如果终端意外断开（网络或者别的原因），一般命令就会终止，当然你可以使用nohup命令，这里提供另一个办法：使用<a href="http://www.gnu.org/software/screen/">screen</a>。</p>
<p>一般，我们创建一个screen会话，然后连接会话并在会话下工作，这时候，我们可以随时挂起会话，去做别的事情，而且这个挂起的会话会一直在后台执行。而后又可以重新连接会话。下面是一个简单的How-to：</p>
<div class="myt1">1. How-to</div>
<div class="myt2">1.1 创建一个screen会话</div>
<div class="mycode">screen -dmS supu</div>
<p>该命令，创建一个名为supu的会话，当时并不立刻进入会话。<span id="more-2396"></span></p>
<div class="myt2">1.2 连入会话</div>
<div class="mycode">screen -r supu</div>
<p>连入会话后，就可以做任何想做的工作了。</p>
<div class="myt2">1.3 挂起该终端</div>
<p>如果你在会话中，做了某个需要等很久的操作，或者你需要离开一段时间，这时就需要执行挂起操作了：</p>
<p>(ctrl+a) + D  先按下Ctr+a然后按D键（screen捕获ctrl+a，后面跟一个命令键D，可以通过ctrl+a ?查看更多）</p>
<div class="t2">1.4 其他相关</div>
<p>而后，可以重新使用-r参数回到会话；在会话中，用exit可以退出并关闭这个会话；还可以使用screen -ls命令来查看当前的全部会话状态。</p>
<div class="myt1">2. 一些名词</div>
<div class="myt2">Attached和Detached</div>
<p>一般screen -ls可以看到多个会话状态，例如：</p>
<pre>
<div class="mycode">[admin@my174 ~]$ screen -ls
There are screens on:
        22872.supu      (Detached)
        18283.pts-3.my174       (Attached)
2 Sockets in /var/run/screen/S-admin.</div>
</pre>
<p>Detached表示会话处于挂起状态，Attached表示有终端在连接会话。</p>
<p>“22872.supu”这是会话名。22872是一个唯一会话ID，后面supu是自定义的会话名，可以使用screen -r 22872等同于screen -r supu。</p>
<p>Enjoy！</p>
<p>参考：<a href="http://www.ibm.com/developerworks/cn/linux/l-cn-screen/">linux 技巧：使用 screen 管理你的远程会话</a> | man screen</p>
<p>Update(2010-10-08) ： </p>
<pre>
<div class="mycode">[supu@host u01]$ screen -ls<br />
There is a screen on:<br />
        9348.supu       (Detached)<br />
1 Socket in /var/run/screen/S-supu.</div>
<p>可以通过kill -9 9348杀死该会话，然后通过screen -wipe清理被杀死的会话。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.orczhou.com/index.php/2010/08/linux-screen-how-to/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

