<?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>Erlang非业余研究 &#187; stap</title>
	<atom:link href="http://blog.yufeng.info/archives/tag/stap/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.yufeng.info</link>
	<description>Erlang系统深度探索和应用</description>
	<lastBuildDate>Tue, 17 Jan 2012 06:05:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Linux下谁在切换我们的进程</title>
		<link>http://blog.yufeng.info/archives/747</link>
		<comments>http://blog.yufeng.info/archives/747#comments</comments>
		<pubDate>Fri, 08 Oct 2010 02:59:12 +0000</pubDate>
		<dc:creator>Yu Feng</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[context switch]]></category>
		<category><![CDATA[csw]]></category>
		<category><![CDATA[dstat]]></category>
		<category><![CDATA[lmbench]]></category>
		<category><![CDATA[stap]]></category>
		<category><![CDATA[vmstat]]></category>
		<category><![CDATA[上下文切换]]></category>

		<guid isPermaLink="false">http://blog.yufeng.info/?p=747</guid>
		<description><![CDATA[原创文章，转载请注明： 转载自Erlang非业余研究 本文链接地址: Linux下谁在切换我们的进程 我们在做Linux服务器的时候经常会需要知道谁在做进程切换，什么原因需要做进程切换。 因为进程切换的代价很高，我给出一个LMbench测试出来的数字： Context switching &#8211; times in microseconds &#8211; smaller is better &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Host OS 2p/0K 2p/16K 2p/64K 8p/16K 8p/64K 16p/16K 16p/64K ctxsw ctxsw ctxsw ctxsw ctxsw ctxsw ctxsw &#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;- &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212;- &#8212;&#8212;- my174.cm4 Linux 2.6.18- 6.1100 7.0200 6.1100 8.7400 7.7200 8.96000 9.62000 在我的很高端的服务器上，进程切换的开销在8us左右， 这个相对于高性能的服务器是不可接受的， 所以我们要在一个时间片内尽可能的多做事情，而不是把时间浪费在无谓的切换上。 [...]]]></description>
			<content:encoded><![CDATA[<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://blog.yufeng.info/">Erlang非业余研究</a></p>
<p><strong>本文链接地址:</strong> <a href="http://blog.yufeng.info/archives/747">Linux下谁在切换我们的进程</a></p>
</div>
<p>我们在做Linux服务器的时候经常会需要知道谁在做进程切换，什么原因需要做进程切换。 因为进程切换的代价很高，我给出一个LMbench测试出来的数字：<br />
Context switching &#8211; times in microseconds &#8211; smaller is better<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;-<br />
Host OS 2p/0K 2p/16K 2p/64K 8p/16K 8p/64K 16p/16K 16p/64K<br />
ctxsw ctxsw ctxsw ctxsw ctxsw ctxsw ctxsw<br />
&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;- &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212;- &#8212;&#8212;-<br />
my174.cm4 Linux 2.6.18- 6.1100 7.0200 6.1100 8.7400 7.7200 8.96000 9.62000 </p>
<p>在我的很高端的服务器上，进程切换的开销在8us左右， 这个相对于高性能的服务器是不可接受的， 所以我们要在一个时间片内尽可能的多做事情，而不是把时间浪费在无谓的切换上。</p>
<p>好奇害死猫，我们来调查下谁在切换我们的进程：</p>
<pre class="brush: bash; title: ; notranslate">
[root@my174 admin]# dstat 1
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
  0   0 100   0   0   0|   0     0 | 796B 1488B|   0     0 |1004   128
  0   0 100   0   0   0|   0     0 | 280B  728B|   0     0 |1005   114
  0   0 100   0   0   0|   0     0 | 280B  728B|   0     0 |1005   128
  0   0 100   0   0   0|   0     0 | 280B  728B|   0     0 |1005   114
  0   0 100   0   0   0|   0   320k| 280B  728B|   0     0 |1008   143
...
</pre>
<p>我们可以看到 csw的数目是 120/S, 但是dstat或者vmstat类似的工具并没有告诉我们谁在干坏事。好吧！我们自己动手行吧。<br />
祭出我们可爱的systemtap!</p>
<pre class="brush: bash; title: ; notranslate">
[root@my174 admin]# cat &gt;cswmon.stp
#! /usr/bin/env stap
#
#

global csw_count
global idle_count

probe scheduler.cpu_off {
  csw_count[task_prev, task_next]++
  idle_count+=idle
}

function fmt_task(task_prev, task_next)
{
   return sprintf(&quot;%s(%d)-&gt;%s(%d)&quot;,
                                task_execname(task_prev),
                                task_pid(task_prev),
                                task_execname(task_next),
                                task_pid(task_next))
}

function print_cswtop () {
  printf (&quot;%45s %10s\n&quot;, &quot;Context switch&quot;, &quot;COUNT&quot;)
  foreach ([task_prev, task_next] in csw_count- limit 20) {
    printf(&quot;%45s %10d\n&quot;, fmt_task(task_prev, task_next), csw_count[task_prev, task_next])
  }
  printf(&quot;%45s %10d\n&quot;, &quot;idle&quot;, idle_count)

  delete csw_count
  delete idle_count
}

probe timer.s($1) {
  print_cswtop ()
  printf(&quot;--------------------------------------------------------------\n&quot;)
}
CTRL+D
</pre>
<p>这个脚本会每隔设定的时间打印出TOP 20切换最多的进程和他的pid, 我们来看下结果把：</p>
<pre class="brush: bash; title: ; notranslate">
[root@my174 admin]# stap cswmon.stp 5
                               Context switch      COUNT
                swapper(0)-&gt;systemtap/11(908)        500
                systemtap/11(908)-&gt;swapper(0)        498
                swapper(0)-&gt;fct1-worker(2492)         50
                fct1-worker(2492)-&gt;swapper(0)         50
                swapper(0)-&gt;fct0-worker(2191)         50
                fct0-worker(2191)-&gt;swapper(0)         50
                      swapper(0)-&gt;bond0(3432)         50
                      bond0(3432)-&gt;swapper(0)         50
                      stapio(879)-&gt;swapper(0)         26
                      swapper(0)-&gt;stapio(879)         25
                      stapio(879)-&gt;swapper(0)         19
                      swapper(0)-&gt;stapio(879)         17
                   swapper(0)-&gt;watchdog/9(31)          5
                   watchdog/9(31)-&gt;swapper(0)          5
                    swapper(0)-&gt;mysqld(18346)          5
                    mysqld(18346)-&gt;swapper(0)          5
                  swapper(0)-&gt;watchdog/13(43)          5
                  watchdog/13(43)-&gt;swapper(0)          5
                  swapper(0)-&gt;watchdog/14(46)          5
                  watchdog/14(46)-&gt;swapper(0)          5
                                         idle        859
--------------------------------------------------------------
...
</pre>
<p>我们可以看到进程从哪里切换到哪里，并且发生了多少次， 最后一行，我打印出来idle的次数，也就是说这时候系统没啥事情做，就切换到idle(0)这个进程去休息去了。</p>
<p>通过上面的调查，我们会很清楚的了解到我们系统的开销发生在那里，方便我们定位问题。<br />
玩的开心！</p>
<div style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">
<p>Post Footer automatically generated by <a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl plugin</a> for wordpress.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.yufeng.info/archives/747/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Linux下谁在消耗我们的cache</title>
		<link>http://blog.yufeng.info/archives/688</link>
		<comments>http://blog.yufeng.info/archives/688#comments</comments>
		<pubDate>Sat, 25 Sep 2010 07:47:15 +0000</pubDate>
		<dc:creator>Yu Feng</dc:creator>
				<category><![CDATA[工具介绍]]></category>
		<category><![CDATA[buffer]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[fincore]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[mincore]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[stap]]></category>
		<category><![CDATA[systemtap]]></category>
		<category><![CDATA[vfs]]></category>

		<guid isPermaLink="false">http://blog.yufeng.info/?p=688</guid>
		<description><![CDATA[原创文章，转载请注明： 转载自Erlang非业余研究 本文链接地址: Linux下谁在消耗我们的cache Linux下对文件的访问和设备的访问通常会被cache起来加快访问速度，这个是系统的默认行为。 而cache需要耗费我们的内存，虽然这个内存最后可以通过echo 3>/proc/sys/vm/drop_caches这样的命令来主动释放。但是有时候我们还是需要理解谁消耗了我们的内存。 我们来先了解下内存的使用情况: 有了伟大的systemtap, 我们可以用stap脚本来了解谁在消耗我们的cache了： 这时候我们拷贝个大文件： 此外加入我们想了解下系统的cache都谁在用呢, 那个文件用到多少页了呢？ 我们有个脚本可以做到，这里非常谢谢 子团 让我使用他的代码。 非常清楚的看出来每个inode占用了多少页，用工具转换下就知道哪个文件耗费了多少内存。 点击下载viewcache.stp 另外小TIPS： 从inode到文件名的转换 find / -inum your_inode 从文件名到inode的转换 stat -c &#8220;%i&#8221; your_filename 或者 ls -i your_filename 我们套用了下就马上知道那个文件占用的cache很多。 玩的开心。 参考资料: page cache和buffer cache的区别: 这篇文章总结的最靠谱: http://blog.chinaunix.net/u/1595/showart.php?id=2209511 后记: linux下有个这样的系统调用可以知道页面的状态:mincore &#8211; determine whether pages are resident in memory 同时有人作个脚本fincore更方便大家的使用, 点击下载fincore 后来子团告诉我还有这个工具: https://code.google.com/p/linux-ftools/ [...]]]></description>
			<content:encoded><![CDATA[<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://blog.yufeng.info/">Erlang非业余研究</a></p>
<p><strong>本文链接地址:</strong> <a href="http://blog.yufeng.info/archives/688">Linux下谁在消耗我们的cache</a></p>
</div>
<p>Linux下对文件的访问和设备的访问通常会被cache起来加快访问速度，这个是系统的默认行为。 而cache需要耗费我们的内存，虽然这个内存最后可以通过echo 3>/proc/sys/vm/drop_caches这样的命令来主动释放。但是有时候我们还是需要理解谁消耗了我们的内存。</p>
<p>我们来先了解下内存的使用情况:</p>
<p><a href="http://blog.yufeng.info/wp-content/uploads/2010/09/free.jpg"><img src="http://blog.yufeng.info/wp-content/uploads/2010/09/free-300x204.jpg" alt="" title="free" width="300" height="204" class="alignnone size-medium wp-image-719" /></a></p>
<pre class="brush: bash; title: ; notranslate">
[root@my031045 ~]# free
             total       used       free     shared    buffers     cached
Mem:      24676836     626568   24050268          0      30884     508312
-/+ buffers/cache:      87372   24589464
Swap:      8385760
</pre>
<p>有了伟大的systemtap, 我们可以用stap脚本来了解谁在消耗我们的cache了：</p>
<pre class="brush: bash; title: ; notranslate">
#这个命令行用来调查谁在加数据入page_cache
[root@my031045 ~]# stap -e 'probe vfs.add_to_page_cache {printf(&quot;dev=%d, devname=%s, ino=%d, index=%d, nrpages=%d\n&quot;, dev, devname, ino, index, nrpages )}'
...
dev=2, devname=N/A, ino=0, index=2975, nrpages=1777
dev=2, devname=N/A, ino=0, index=3399, nrpages=2594
dev=2, devname=N/A, ino=0, index=3034, nrpages=1778
dev=2, devname=N/A, ino=0, index=3618, nrpages=2595
dev=2, devname=N/A, ino=0, index=1694, nrpages=106
dev=2, devname=N/A, ino=0, index=1703, nrpages=107
dev=2, devname=N/A, ino=0, index=1810, nrpages=210
dev=2, devname=N/A, ino=0, index=1812, nrpages=211
...
</pre>
<p>这时候我们拷贝个大文件：</p>
<pre class="brush: bash; title: ; notranslate">
[chuba@my031045 ~]$ cp huge_foo.file  bar

#这时候我们可以看到文件的内容被猛的添加到cache去：
...
dev=8388614, devname=sda6, ino=2399271, index=39393, nrpages=39393
dev=8388614, devname=sda6, ino=2399271, index=39394, nrpages=39394
dev=8388614, devname=sda6, ino=2399271, index=39395, nrpages=39395
dev=8388614, devname=sda6, ino=2399271, index=39396, nrpages=39396
dev=8388614, devname=sda6, ino=2399271, index=39397, nrpages=39397
dev=8388614, devname=sda6, ino=2399271, index=39398, nrpages=39398
dev=8388614, devname=sda6, ino=2399271, index=39399, nrpages=39399
dev=8388614, devname=sda6, ino=2399271, index=39400, nrpages=39400
dev=8388614, devname=sda6, ino=2399271, index=39401, nrpages=39401
dev=8388614, devname=sda6, ino=2399271, index=39402, nrpages=39402
dev=8388614, devname=sda6, ino=2399271, index=39403, nrpages=39403
dev=8388614, devname=sda6, ino=2399271, index=39404, nrpages=39404
dev=8388614, devname=sda6, ino=2399271, index=39405, nrpages=39405
dev=8388614, devname=sda6, ino=2399271, index=39406, nrpages=39406
dev=8388614, devname=sda6, ino=2399271, index=39407, nrpages=39407
dev=8388614, devname=sda6, ino=2399271, index=39408, nrpages=39408
dev=8388614, devname=sda6, ino=2399271, index=39409, nrpages=39409
dev=8388614, devname=sda6, ino=2399271, index=39410, nrpages=39410
dev=8388614, devname=sda6, ino=2399271, index=39411, nrpages=39411
...
</pre>
<p>此外加入我们想了解下系统的cache都谁在用呢, 那个文件用到多少页了呢？<br />
我们有个脚本可以做到，这里非常谢谢<strong> 子团</strong> 让我使用他的代码。</p>
<pre class="brush: bash; title: ; notranslate">
[chuba@my031045 ~]# stap -g viewcache.stp

在另外的shell里面
[chuba@my031045 ~]# dmesg
...
inode: 116397109, num: 5
inode: 116397111, num: 2
inode: 116397112, num: 1
inode: 116397149, num: 2
inode: 116397152, num: 1
inode: 116397336, num: 2
inode: 116397343, num: 1
inode: 116397371, num: 4
inode: 116397372, num: 2
...
</pre>
<p>非常清楚的看出来每个inode占用了多少页，用工具转换下就知道哪个文件耗费了多少内存。</p>
<p><a href='http://blog.yufeng.info/wp-content/uploads/2010/09/viewcache.stp_.txt'>点击下载viewcache.stp</a></p>
<p>另外小TIPS：</p>
<p>从inode到文件名的转换<br />
find / -inum your_inode</p>
<p>从文件名到inode的转换<br />
stat -c &#8220;%i&#8221; your_filename<br />
或者 ls -i your_filename</p>
<p>我们套用了下就马上知道那个文件占用的cache很多。</p>
<pre class="brush: bash; title: ; notranslate">
[chuba@my031045 ~]$ sudo find / -inum 2399248
/home/chuba/kernel-debuginfo-2.6.18-164.el5.x86_64.rpm
</pre>
<p>玩的开心。</p>
<p>参考资料:<br />
page cache和buffer cache的区别:<br />
这篇文章总结的最靠谱: <a href="http://blog.chinaunix.net/u/1595/showart.php?id=2209511">http://blog.chinaunix.net/u/1595/showart.php?id=2209511</a></p>
<p>后记:<br />
linux下有个这样的系统调用可以知道页面的状态:mincore &#8211; determine whether pages are resident in memory<br />
同时有人作个脚本<a href=" http://net.doit.wisc.edu/~plonka/fincore/">fincore</a>更方便大家的使用, <a href='http://blog.yufeng.info/wp-content/uploads/2010/09/fincore.txt'>点击下载fincore</a></p>
<p>后来子团告诉我还有这个工具: <a href="https://code.google.com/p/linux-ftools/">https://code.google.com/p/linux-ftools/</a>
<div style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">
<p>Post Footer automatically generated by <a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl plugin</a> for wordpress.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.yufeng.info/archives/688/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>用systemtap来修改下linux内核变量的值</title>
		<link>http://blog.yufeng.info/archives/102</link>
		<comments>http://blog.yufeng.info/archives/102#comments</comments>
		<pubDate>Thu, 29 Oct 2009 11:07:20 +0000</pubDate>
		<dc:creator>Yu Feng</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[调优]]></category>
		<category><![CDATA[-g]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[global]]></category>
		<category><![CDATA[guru]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[stap]]></category>
		<category><![CDATA[systemtap]]></category>

		<guid isPermaLink="false">http://blog.yufeng.info/?p=102</guid>
		<description><![CDATA[原创文章，转载请注明： 转载自Erlang非业余研究 本文链接地址: 用systemtap来修改下linux内核变量的值 我们在探索linux内核的时候，经常需要调整下变量的值，看它对系统的影响。如果这个值没有透过/proc来修改的话，那只能编译内核。这个步骤是非常繁琐的。现在我们有systemtap这个利器来帮忙了。 演示如下： 我们通过修改过 extern int sysctl_tcp_fin_timeout;的值来达到目的。是因为这个值是proc导出的 我们好验证是否成功。 这个时候 stap在运行， 只是还没有触发do_tcp_setsockopt. 现在我们来触发 Ok,这时候回头可以看到stap打出来以下： sysctl_tcp_fin_timeout = 18000 我们来验证下： OK,成功。 Tips： 1. stap对全局变量的写需要-g guru模式。 2. 全局变量必须在一个单元内的函数里面才可以修改， 而且必须是在内核上下文。 PS. 这样写的话会更好,因为这个变量是单元可见的,这个模块里面的任何函数被触发都可以看到这个变量. 因为这是tcp的核心模块随时都会被出发的,免除了以上的麻烦! Post Footer automatically generated by wp-posturl plugin for wordpress.]]></description>
			<content:encoded><![CDATA[<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://blog.yufeng.info/">Erlang非业余研究</a></p>
<p><strong>本文链接地址:</strong> <a href="http://blog.yufeng.info/archives/102">用systemtap来修改下linux内核变量的值</a></p>
</div>
<p>我们在探索linux内核的时候，经常需要调整下变量的值，看它对系统的影响。如果这个值没有透过/proc来修改的话，那只能编译内核。这个步骤是非常繁琐的。现在我们有systemtap这个利器来帮忙了。</p>
<p>演示如下：<br />
我们通过修改过<br />
extern int sysctl_tcp_fin_timeout;的值来达到目的。是因为这个值是proc导出的 我们好验证是否成功。</p>
<pre class="brush: bash; title: ; notranslate">
root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
15000
[root@localhost ~]# cat test.stp
probe begin
{
        printf(&quot;ready go\n&quot;);
}

probe kernel.function(&quot;do_tcp_setsockopt&quot;)
{
        $sysctl_tcp_fin_timeout = $1
        printf(&quot;sysctl_tcp_fin_timeout = %d\n&quot;, $sysctl_tcp_fin_timeout);
        exit()
}

[root@localhost ~]# stap -g test.stp 18000
ready go
</pre>
<p>这个时候 stap在运行， 只是还没有触发do_tcp_setsockopt.<br />
现在我们来触发</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# erl
Erlang R13B02 (erts-5.7.3) 1 [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.3  (abort with ^G)
1&gt; {ok, LSock} = gen_tcp:listen(0, []).
{ok,#Port&lt;0.437&gt;}
2&gt;
2&gt; inet:setopts(LSock, [{nodelay,true}]).
ok
3&gt;
</pre>
<p>Ok,这时候回头可以看到stap打出来以下：<br />
sysctl_tcp_fin_timeout = 18000</p>
<p>我们来验证下：</p>
<pre class="brush: bash; title: ; notranslate">
root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
18000
</pre>
<p>OK,成功。</p>
<p>Tips：<br />
1. stap对全局变量的写需要-g guru模式。<br />
2. 全局变量必须在一个单元内的函数里面才可以修改， 而且必须是在内核上下文。 </p>
<p>PS. 这样写的话会更好,因为这个变量是单元可见的,这个模块里面的任何函数被触发都可以看到这个变量. 因为这是tcp的核心模块随时都会被出发的,免除了以上的麻烦!</p>
<pre class="brush: bash; title: ; notranslate">
$ cat test.stp
probe begin
{
        printf(&quot;ready go\n&quot;);
}
probe kernel.function(&quot;*@net/ipv4/tcp.c&quot;)
//probe kernel.function(&quot;do_tcp_setsockopt&quot;)
{
        $sysctl_tcp_fin_timeout = $1
        printf(&quot;sysctl_tcp_fin_timeout = %d\n&quot;, $sysctl_tcp_fin_timeout);
        exit()
}
</pre>
<div style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">
<p>Post Footer automatically generated by <a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl plugin</a> for wordpress.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.yufeng.info/archives/102/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

