<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_feisky</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/53116/rss</id><updated>2012-05-31T02:14:51Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/53116/rss"/><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/27/2473330.html</id><title type="text">解决linux下/etc/rc.local开机器不执行的原因</title><summary type="text">前不久因项目需要写了开机启动其他程序的shell脚本,因工作忙，调试完给了技术支持人员，也没去注意过。到后来，有几台服务器突然被重启了，这时候领导问，怎么开机启动的脚本没起作用，还被批了一顿，哎，做事虎头蛇尾,活该！然后去查，一直没查到原因，手动执行都是正确的，在排除了权限原因和脚本问题后，很郁闷，怎么放到开机启动项目中就无法执行了呢。于是去查linux开机启动过程信息。google下，看了下关于一些开机启动启的资料，发现了开机启动程序的级别为3.果断顺藤莫瓜，找到了这个目录 /etc/rc.d/rc3.d，进去一看恍然大悟。我的rc.local文件是在 /etc/rc.local中（网上都是</summary><published>2012-04-27T04:39:00Z</published><updated>2012-04-27T04:39:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/27/2473330.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/27/2473330.html"/><content type="html">&lt;p&gt;前不久因项目需要写了开机启动其他程序的shell脚本,因工作忙，调试完给了技术支持人员，也没去注意过。&lt;/p&gt;&lt;p&gt;到后来，有几台服务器突然被重启了，这时候领导问，怎么开机启动的脚本没起作用，还被批了一顿，哎，做事虎头蛇尾,活该！&lt;/p&gt;&lt;p&gt;然后去查，一直没查到原因，&lt;/p&gt;&lt;p&gt;手动执行都是正确的，在排除了权限原因和脚本问题后，很郁闷，怎么放到开机启动项目中就无法执行了呢。&lt;/p&gt;&lt;p&gt;于是去查linux开机启动过程信息。google下，看了下关于一些开机启动启的资料，发现了开机启动程序的级别为3.&lt;/p&gt;&lt;p&gt;果断顺藤莫瓜，找到了这个目录 /etc/rc.d/rc3.d，进去一看恍然大悟。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/329605/2011090900361119.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;我的rc.local文件是在 /etc/rc.local中（网上都是说写在这里，我是按照网上来弄的），而我查看了系统指向rc.local文件的路径是 /etc/rc.d/rc.local&lt;/p&gt;&lt;p&gt;后来把开机启动的脚本配置到/etc/rc.d/rc.local中（或者把S99local指向 /etc/rc.local也行），重启检查，成功！&lt;/p&gt;&lt;p&gt;总结:主要还是对linux系统不熟悉，这是个漫长的过程，有时间得多看看这方面的书籍。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;原文：&lt;a href="http://www.cnblogs.com/montya/archive/2011/09/09/2172001.html"&gt;http://www.cnblogs.com/montya/archive/2011/09/09/2172001.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2473330.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/27/2473330.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/27/2473197.html</id><title type="text">关于dd命令输出结果无法重定向到文件的问题</title><summary type="text">先以time为例：解决time命令输出信息的重定向问题time命令的输出信息是打印在标准错误输出上的，我们通过一个简单的尝试来验证一下。[root@web186 root]#time find . -name "mysql.sh" &gt;1.txtreal 0m0.081suser 0m0.060ssys 0m0.020s[root@web186 root]#time find . -name "mysql.sh" 2&gt;2.txt./work186/sms/bin/mysql.sh./work186/sms/src/scripts/mysql.s</summary><published>2012-04-27T03:20:00Z</published><updated>2012-04-27T03:20:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/27/2473197.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/27/2473197.html"/><content type="html">&lt;p&gt;&lt;span&gt;先以time为例：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决time命令输出信息的重定向问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;time命令的输出信息是打印在标准错误输出上的，&lt;/span&gt;&amp;nbsp;&lt;span&gt;我们通过一个简单的尝试来验证一下。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;time find . -name "mysql.sh" &amp;gt;1.txt&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;real&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.081s&lt;br /&gt;user&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.060s&lt;br /&gt;sys&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.020s&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;time find . -name "mysql.sh" 2&amp;gt;2.txt&lt;/span&gt;&amp;nbsp;&lt;br /&gt;./work186/sms/bin/mysql.sh&lt;br /&gt;./work186/sms/src/scripts/mysql.sh&lt;br /&gt;./work186/sms/src/scripts1/mysql.sh&lt;br /&gt;&lt;br /&gt;real&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.068s&lt;br /&gt;user&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.040s&lt;br /&gt;sys&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.030s&lt;/p&gt;&lt;p&gt;&lt;span&gt;通过上面的尝试，发现无法将time的输出信息重定向到文件里面，为什么？因为time是shell的关键字，shell做了特殊处理，它会把time命令后面的命令行作为一个整体来进行处理，在重定向时，实际上是针对后 面的命令来的，time命令本身的输出并不会被重定向的。那现在怎么办呢？网上提供了两种解决方法【2，3】，我们一一尝试一下。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;第一种解决方法，就是将time命令和将要执行的命令行放到一个shell代码块中，也就是一对大括号中，要注意空格和分号的使用。&lt;/span&gt;&amp;nbsp;&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;{time find . -name "mysql.sh"} 2&amp;gt;2.txt&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;好像成功了。慢，看一下对不对。&lt;/span&gt;&amp;nbsp;&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;cat 2.txt&amp;nbsp;&lt;/span&gt;&lt;br /&gt;-bash: {time: command not found&lt;/p&gt;&lt;p&gt;&lt;span&gt;原来bash把 {time 作为一个整体来处理了，前后都加上空格试试。&lt;/span&gt;&amp;nbsp;&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;{ time find . -name "mysql.sh" } 2&amp;gt;2.txt&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;gt;&amp;nbsp;&lt;span&gt;Ctrl+C&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;这次Bash认为命令都没有输入完成，少了分号。因为Bash认为后面的 } 是find命令的参数。&lt;/span&gt;&amp;nbsp;&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;{ time find . -name "mysql.sh"; } 2&amp;gt;2.txt&lt;/span&gt;&amp;nbsp;&lt;br /&gt;./work186/sms/bin/mysql.sh&lt;br /&gt;./work186/sms/src/scripts/mysql.sh&lt;br /&gt;./work186/sms/src/scripts1/mysql.sh&lt;br /&gt;./work186/sms1/bin/mysql.sh&lt;br /&gt;./work186/sms1/src/scripts/mysql.sh&lt;br /&gt;./temp/sms/bin/mysql.sh&lt;br /&gt;./temp/sms/src/scripts/mysql.sh&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;cat 2.txt&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;real&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.068s&lt;br /&gt;user&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.030s&lt;br /&gt;sys&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.040s&lt;/p&gt;&lt;p&gt;&lt;span&gt;第一种方式的尝试成功了，总结起来就是 { time command-line; } 2&amp;gt;file&amp;nbsp; 注意分隔符的使用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;另外一种方式就是使用子Shell的方式，如下所示：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;(time find . -name "mysql.sh") 2&amp;gt;2.txt&lt;/span&gt;&amp;nbsp;&lt;br /&gt;./work186/sms/bin/mysql.sh&lt;br /&gt;./work186/sms/src/scripts/mysql.sh&lt;br /&gt;./work186/sms/src/scripts1/mysql.sh&lt;br /&gt;./work186/sms1/bin/mysql.sh&lt;br /&gt;./work186/sms1/src/scripts/mysql.sh&lt;br /&gt;./temp/sms/bin/mysql.sh&lt;br /&gt;./temp/sms/src/scripts/mysql.sh&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;span&gt;cat 2.txt&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;real&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.083s&lt;br /&gt;user&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.040s&lt;br /&gt;sys&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0m0.020s&lt;br /&gt;[root@web186 root]#&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;第二种方式的尝试也成功了，总结起来就是 (time command-line) 2&amp;gt;file 这里time紧贴着小括号(也可以的，命令行结束也不必带分号。当然最好还是用第一种方式，毕竟启动一个子shell是要多占些资源的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff; font-size: large;"&gt;针对dd命令。同time命令，dd命令包括了time命令。&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;br /&gt;故 dd if=/dev/zero of=/mnt/test bs=1k count=100 &amp;gt;&amp;gt;output.txt&lt;br /&gt;&lt;br /&gt;此时并不能把dd命令显示的时间和速度保存到output.txt里。因为dd命令的输出是到标准错误输出上的。&lt;br /&gt;&lt;br /&gt;必须采用dd if=/dev/zero of=/mnt/test bs=1k count=100&amp;nbsp; 2&amp;gt;&amp;gt;output.txt 才可以。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: large;"&gt;转自：&lt;a href="http://dylan602.blog.163.com/blog/static/167974276201172121823753/"&gt;http://dylan602.blog.163.com/blog/static/167974276201172121823753/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2473197.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/27/2473197.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/24/2468058.html</id><title type="text">一个诡异的bash问题</title><summary type="text">一个诡异的bash问题今天写的一个bash脚本运行发现：test.sh: 1: #!/bin/bash: not found本以为是由于在windows下编辑导致的问题，执行dos2unix之后问题依旧。后来想到用file命令查看，文件居然是UTF-8 Unicode (with BOM) text格式# file test.sh test.sh: UTF-8 Unicode (with BOM) text而正常的bash脚本格式应该为 Bourne-Again shell script text executable用vim -b test.sh删除开头的&lt;feff&gt;即可。</summary><published>2012-04-24T06:44:00Z</published><updated>2012-04-24T06:44:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/24/2468058.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/24/2468058.html"/><content type="html">&lt;p&gt;一个诡异的bash问题&lt;/p&gt;&lt;p&gt;今天写的一个bash脚本运行发现：&lt;br /&gt;test.sh: 1: #!/bin/bash: not found&lt;/p&gt;&lt;p&gt;本以为是由于在windows下编辑导致的问题，执行dos2unix之后问题依旧。&lt;/p&gt;&lt;p&gt;后来想到用file命令查看，文件居然是UTF-8 Unicode (with BOM) text格式&lt;/p&gt;&lt;p&gt;# file test.sh &lt;br /&gt;test.sh: UTF-8 Unicode (with BOM) text&lt;/p&gt;&lt;p&gt;而正常的bash脚本格式应该为 Bourne-Again shell script text executable&lt;/p&gt;&lt;p&gt;用vim -b test.sh删除开头的&amp;lt;feff&amp;gt;即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2468058.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/24/2468058.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/16/2451376.html</id><title type="text">用 grep 恢复误删的文本文件</title><summary type="text">作为长期的电脑使用者，肯定会有误删文件的经历，在 Mac OS X 和 Windows 上删除的文件都会默认进 “回收站”。在 Linux 上如果事先没有用别名（alias）修改默认的 rm 功能，rm 后文件就会丢失，幸运的是，在一般的删除文件操作中，Linux 并不会立即清空存储该文件的 block 内容，而只会释放该文件所占用的 inode 和 data block，Linux 上 rm 的过程其实就是将 inode bitmap 和 data block bitmap 中的相应标识设为空闲状态的过程，并不涉及到真正的数据，这也是为什么在 Linux 下删除大文件这么快速的原因，因为大文</summary><published>2012-04-16T02:54:00Z</published><updated>2012-04-16T02:54:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/16/2451376.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/16/2451376.html"/><content type="html">&lt;p&gt;作为长期的电脑使用者，肯定会有误删文件的经历，在 Mac OS X 和 Windows 上删除的文件都会默认进 &amp;ldquo;回收站&amp;rdquo;。在 Linux 上如果事先没有用别名（alias）修改默认的 rm 功能，rm 后文件就会丢失，幸运的是，在一般的删除文件操作中，Linux 并不会立即清空存储该文件的 block 内容，而只会释放该文件所占用的 inode 和 data block，Linux 上 rm 的过程其实就是将 inode bitmap 和 data block bitmap 中的相应标识设为空闲状态的过程，并不涉及到真正的数据，这也是为什么在 Linux 下删除大文件这么快速的原因，因为大文件所占的磁盘根本就没有清空。所以，如果我们能找到文件对应的 inode，由此查到相应的 data block，就可能从磁盘上把已删除的文件恢复出来，很多文件/磁盘恢复工具都是这么做的。&lt;/p&gt;&lt;p&gt;一般来说二进制文件、库文件等删除后都可以从其他 Linux 拷贝恢复，不是很要紧，如果自己辛苦写的脚本或者配置文件误删了就杯具了。误删这种蠢事经常在 VPSee 身上发生，最近一次是在今年年初的时候，开了 screen 多次 ssh 到不同服务器上，在前后切换的过程中删除了一个很肯定的配置文件，后来发现删的文件是对的，可惜在一台错误的服务器上，本来应该在 A 服务器上删除 file.txt 结果在 B 服务器上删除了 file.txt，多个 screen 和 ssh 把自己搞晕了，而且主机名没有安排好，多台机器都是用的 localhost，不利于识别当时的环境。如果使用 Linux 的时候不幸误删了一个文本文件怎么办呢？&lt;/p&gt;&lt;p&gt;先临时建一个文本文件 vpsee.log 做测试，然后删除这个文件：&lt;/p&gt;$ echo "important log file for vpsee.com" &amp;gt; vpsee.log&lt;br/&gt;&lt;br/&gt;$ cat vpsee.log&lt;br/&gt;important log file for vpsee.com&lt;br/&gt;&lt;br/&gt;$ rm vpsee.log&lt;br/&gt;&lt;p&gt;如果能记住刚才删除文件中的某个关键字的话可以用 grep 搜索整个 /dev/sda1，-a 标志位的意思是把 /dev/sda1 这个分区看成是文本形式的（分区本身是二进制形式的），-B 10 -A 100 的意思是如果找到关键字就打印出其前10行和后100行的内容：&lt;/p&gt;# grep -a -B 10 -A 100 'vpsee.com' /dev/sda1 &amp;gt; tmp.txt&lt;br/&gt;&lt;p&gt;在一堆 @ 之间可以找到我们刚才删除的内容：&lt;/p&gt;$ vi tmp.txt&lt;br/&gt;...&lt;br/&gt;@$^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@&amp;Ccedil;^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@&amp;Egrave;^K^@^@^@&lt;br/&gt;^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^Q^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@&amp;Egrave;^K^@^@&amp;times;^@&lt;br/&gt;^@^@important log file for vpsee.com&lt;br/&gt;@&lt;br/&gt;@&lt;br/&gt;...&lt;br/&gt;&lt;p&gt;当然，如果误删了二进制、doc、png/jpg/gif 之类的文件，可以用一些第三方 ext2/ext3 文件恢复工具帮助恢复文件，比如 TestDisk, PhotoRec 等。&lt;/p&gt;&lt;p&gt;原文：&lt;a href="http://www.vpsee.com/2010/08/using-grep-to-recover-text-files/"&gt;http://www.vpsee.com/2010/08/using-grep-to-recover-text-files/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2451376.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/16/2451376.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/14/2447503.html</id><title type="text">转一篇Linux可用内存的统计方法</title><summary type="text">背景由于Linux缓存机制的设计，系统对缓存的使用是非常狠的，所以经常会看到某些环境内存只剩几十兆了，而应用只用了不到一半。所以在计算可用内存的时候，一定要算上缓存的部分。通常方法，就是通过free命令首行free+cached+buffers计算，或者直接使用第二行的free字段。但这个方法有时仍然会造成比较大的误差，导致性能监控等方面的问题。比如系统中使用了大量的共享内存会造成多计算可用内存；再比如对大量的文件做了查询（find / ?!!!），会导致少计算可用内存。对于这点我在《说说free命令》中有详细的说明。这里就不再赘述了。SUSE11 SP1基于2.6.32内核，内核暴露了更多的</summary><published>2012-04-14T12:11:00Z</published><updated>2012-04-14T12:11:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/14/2447503.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/14/2447503.html"/><content type="html">&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;背景&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;由于&lt;span&gt;Linux&lt;/span&gt;缓存机制的设计，系统对缓存的使用是非常狠的，所以经常会看到某些环境内存只剩几十兆了，而应用只用了不到一半。所以在计算可用内存的时候，一定要算上缓存的部分。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;通常方法，就是通过&lt;span&gt;free&lt;/span&gt;命令首行&lt;span&gt;free+cached+buffers&lt;/span&gt;计算，或者直接使用第二行的&lt;span&gt;free&lt;/span&gt;字段。但这个方法有时仍然会造成比较大的误差，导致性能监控等方面的问题。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;比如系统中使用了大量的共享内存会造成多计算可用内存；再比如对大量的文件做了查询（&lt;span&gt;find / ?!!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;），会导致少计算可用内存。对于这点我在&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;a href="http://yalung929.blog.163.com/blog/static/20389822520122310205151/" target="_blank"&gt;《说说free命令》&lt;/a&gt;中有详细的说明。这里就不再赘述了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;span&gt;SUSE11 SP1&lt;/span&gt;基于&lt;span&gt;2.6.32&lt;/span&gt;内核，内核暴露了更多的统计接口给用户空间，把&lt;span&gt;slab&lt;/span&gt;分为可回收和不可回收两类指标来统计。&lt;span&gt;free&lt;/span&gt;命令也对应做了修改。解决了&lt;span&gt;free&lt;/span&gt;命令少计算可用内存的问题。但多计算的问题还是存在。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;因此，在这里对统计可用内存的方法做了个总结。供需要的同学参考。（后面有空可能会开发一个统计工具）&lt;span&gt;&lt;br /&gt;&lt;/span&gt;其中&lt;span&gt;SUSE10&lt;/span&gt;由于内核版本过低（&lt;span&gt;2.6.16&lt;/span&gt;）暴露信息不足，下面的方法仍然不能很精确，但相比通过&lt;span&gt;free&lt;/span&gt;命令简单统计而言，一般不会造成比较大的误差。&lt;span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;可用内存定义&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;包括未被使用的空闲内存，以及已经被使用但用作缓存可以自动回收的部分。&lt;span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span&gt; &lt;br /&gt;SUSE 10&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;可用内存统计方法&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;总内存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;free&lt;/span&gt;命令首行&lt;span&gt;total&lt;/span&gt;字段。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;空闲内存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;free&lt;/span&gt;命令首行&lt;span&gt;free&lt;/span&gt;字段。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;缓存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;free&lt;/span&gt;命令首行&lt;span&gt;buffers&lt;/span&gt;字段&lt;span&gt;+cached&lt;/span&gt;字段。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;修正值&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;cached&lt;/span&gt;字段包含了共享内存和&lt;span&gt;tmpfs&lt;/span&gt;内存文件系统占用的内存。需要减去这两部分。这两部分内存可通过&lt;span&gt;ipcs -m -u&lt;/span&gt;和&lt;span&gt;df &lt;/span&gt;命令获取。&lt;span&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;修正值&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;cached&lt;/span&gt;字段漏掉了内核&lt;span&gt;slab&lt;/span&gt;中可以自动回收的内存，比如&lt;span&gt;xxx_inode_cache&lt;/span&gt;和&lt;span&gt;dentry_cache&lt;/span&gt;。这两部分的内存的计算方法是解析&lt;span&gt;/proc/slabinfo&lt;/span&gt;。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;最终的可用内存计算方法：&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;空闲内存&lt;span&gt;+&lt;/span&gt;缓存&lt;span&gt;-&lt;/span&gt;修正值&lt;span&gt;1+&lt;/span&gt;修正值&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;span&gt; &lt;br /&gt;SUSE 11&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;可用内存统计方法&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;总内存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;free&lt;/span&gt;命令首行&lt;span&gt;total&lt;/span&gt;字段。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;空闲内存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;free&lt;/span&gt;命令首行&lt;span&gt;free&lt;/span&gt;字段。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;缓存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;free&lt;/span&gt;命令首行&lt;span&gt;buffers&lt;/span&gt;字段&lt;span&gt;+cached&lt;/span&gt;字段。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;修正值&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;：&lt;span&gt;cached&lt;/span&gt;字段包含了共享内存和&lt;span&gt;tmpfs&lt;/span&gt;内存文件系统占用的内存。需要减去这两部分。这两部分内存之和可通过&lt;span&gt;/proc/meminfo&lt;/span&gt;的&lt;span&gt;Shmem&lt;/span&gt;字段直接获取。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;最终的可用内存计算方法：&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: red; font-family: 宋体;"&gt;空闲内存&lt;span&gt;+&lt;/span&gt;缓存&lt;span&gt;-&lt;/span&gt;修正值&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;br /&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;附&lt;span&gt;1&lt;/span&gt;：&lt;span&gt;ipcs&lt;/span&gt;获取共享内存占用物理内存大小&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;# ipcs -m -u&lt;br /&gt;------ Shared Memory Status --------&lt;br /&gt;segments allocated 4&lt;br /&gt;pages allocated 786433&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;pages resident 2 #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;使用这个字段，单位是页，&lt;span&gt;X86&lt;/span&gt;下一个页是&lt;span&gt;4kB&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;pages swapped 0&lt;br /&gt;Swap performance: 0 attempts 0 successes&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;附&lt;span&gt;2&lt;/span&gt;：&lt;span&gt;df&lt;/span&gt;获取&lt;span&gt;tmpfs&lt;/span&gt;占用物理内存大小&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt; # df&lt;br /&gt;Filesystem 1K-blocks Used Available Use% Mounted on&lt;br /&gt;/dev/sda2 20972152 4427900 16544252 22% /&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;devtmpfs 24711780 &lt;strong&gt;160&lt;/strong&gt; 24711620 1% /dev #Used&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;字段表示实际占用物理内存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;tmpfs 24711780 &lt;strong&gt; 0&lt;/strong&gt; 24711780 0% /dev/shm #Used&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;字段表示实际占用物理内存&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;/dev/sda5 1052184 59188 992996 6% /boot&lt;br /&gt;/dev/sda9 83888824 16852500 67036324 21% /iso&lt;br /&gt;/dev/sda7 10490040 1142876 9347164 11% /opt&lt;br /&gt;/dev/sda10 83888824 9421200 74467624 12% /src&lt;br /&gt;/dev/sda8 20972152 3475104 17497048 17% /usr&lt;br /&gt;/dev/sda6 5245016 328392 4916624 7% /var&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: black; font-family: 宋体;"&gt;///////////////////&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: black; font-family: 宋体;"&gt;增加统计工具&lt;span&gt;////////2011.6.29///////////////////////////////////////////////////&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;统计工具&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;在&lt;span&gt;SUSE10&lt;/span&gt;、&lt;span&gt;SUSE11&lt;/span&gt;验证通过&lt;span&gt;)&lt;br /&gt;1. &lt;/span&gt;修正可用内存多计算的情况（&lt;span&gt;SUSE10 SUSE11&lt;/span&gt;）&lt;span&gt;&lt;br /&gt;&lt;/span&gt;如下环境，在进行了大量共享内存创建使用后，&lt;span&gt;free&lt;/span&gt;命令统计可用内存，出现了很大的误差。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;#echo 3 &amp;gt;/proc/sys/vm/drop_caches #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;清理可回收的内存&lt;span&gt;&lt;br /&gt;# free&lt;br /&gt; total used free shared buffers cached&lt;br /&gt;Mem: 49423560 13609680 35813880 0 26764 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;11686608 #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;仍有&lt;span&gt;11G&lt;/span&gt;不可以回收，因为是共享内存，不具备回收属性。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;-/+ buffers/cache: 1896308 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;47527252 # free&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;计算可用内存，算入了共享内存，得到&lt;span&gt;47G&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;Swap: 2104472 0 2104472&lt;br /&gt;# ipcs -m -u&lt;br /&gt;------ Shared Memory Status --------&lt;br /&gt;segments allocated 20&lt;br /&gt;pages allocated 4980737&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;pages resident 2883591 #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;共享内存有&lt;span&gt;2883591 * 4 = 11534364 kB ~= 11G &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;pages swapped 0&lt;br /&gt;Swap performance: 0 attempts 0 successes&lt;br /&gt; # afree&lt;br /&gt;Total: 49423560 kB #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;物理内存总计&lt;span&gt;&lt;br /&gt;Free: 35816908 kB #&lt;/span&gt;未被使用的内存&lt;span&gt;&lt;br /&gt;Reclaimable: 179348 kB #&lt;/span&gt;被使用了但是可以自动回收的内存&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;Available: 35996256 kB #afree&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;统计出来的可用内存去除了&lt;span&gt;11G&lt;/span&gt;的共享内存。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;br /&gt;2. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;修正可用内存少计算的情况（&lt;span&gt;SUSE10&lt;/span&gt;）&lt;span&gt; &lt;br /&gt;&lt;/span&gt;如下环境，在进行了大量文件访问操作后，系统中缓存了大概&lt;span&gt;600M&lt;/span&gt;的&lt;span&gt;inode&lt;/span&gt;和&lt;span&gt;dentry&lt;/span&gt;。&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;# free&lt;br /&gt; total used free shared buffers cached&lt;br /&gt;Mem: 3987316 1080908 2906408 0 163056 163848 &lt;br /&gt;-/+ buffers/cache: 754004 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;3233312 #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;没有统计&lt;span&gt;slab&lt;/span&gt;中的可以回收的&lt;span&gt;inode&lt;/span&gt;和&lt;span&gt;dentry&lt;/span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;Swap: 2104472 0 2104472&lt;br /&gt; # afree&lt;br /&gt;Total: 3987316 kB&lt;br /&gt;Free: 2906384 kB&lt;br /&gt;Reclaimable: 958888 kB&lt;br /&gt;Available: &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt; 3865272 kB #afree&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;统计了&lt;span&gt;slab&lt;/span&gt;中的可以回收的&lt;span&gt;inode&lt;/span&gt;和&lt;span&gt;dentry&lt;/span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;# echo 3 &amp;gt;/proc/sys/vm/drop_caches #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;释放&lt;span&gt;600M&lt;/span&gt;的&lt;span&gt;inode&lt;/span&gt;和&lt;span&gt;dentry&lt;/span&gt;缓存。&lt;span&gt;&lt;br /&gt; # free&lt;br /&gt; total used free shared buffers cached&lt;br /&gt;Mem: 3987316 93628 3893688 0 17780 8948&lt;br /&gt;-/+ buffers/cache: 66900 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;3920416 #&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #e53333; font-family: 宋体; font-size: 9pt;"&gt;执行&lt;span&gt;drop_caches&lt;/span&gt;后，增加了&lt;span&gt;600M&lt;/span&gt;，说明&lt;span&gt;cached&lt;/span&gt;少统计了可回收的&lt;span&gt;slab&lt;/span&gt;缓存。这&lt;span&gt;600M&lt;/span&gt;即使不执行&lt;span&gt;drop_caches&lt;/span&gt;也都是可用的，系统在需要的时候会自动回收。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体; font-size: 9pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;注：&lt;span&gt;afree&lt;/span&gt;通过解析&lt;span&gt;slabinfo&lt;/span&gt;文件统计可回收的&lt;span&gt;slab&lt;/span&gt;，其实&lt;span&gt;suse10&lt;/span&gt;的内核有一个全局变量&lt;span&gt;slab_reclaim_pages&lt;/span&gt;维护了准确的可回收数量，但没有暴露给给用户空间，因此更准确的方法其实就是写一个模块，把这个变量导出到来。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #333333; font-family: 宋体;"&gt;&lt;span&gt;afree代码如下：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #0000ff;"&gt;#!/bin/sh&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#Get accurate available memory. &lt;/span&gt;&lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #008080;"&gt;function&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008080;"&gt;get_meminfo()&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; grep -w &lt;span style="color: #a020f0;"&gt;$1&lt;/span&gt;&amp;nbsp;/proc/meminfo &lt;span style="color: #804040;"&gt;&lt;strong&gt;|&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;awk -F&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;{print $2}&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;function&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008080;"&gt;show_meminfo()&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; printf &lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;%s&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;\t&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;%10d kB&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;\n&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$1&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$2&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #008080;"&gt;PAGE_SIZE&lt;/span&gt;=&lt;span style="color: #ff00ff;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;#kB, for x86 &lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;function&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008080;"&gt;get_shmem_from_ipcs()&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; local &lt;span style="color: #008080;"&gt;_shm&lt;/span&gt;=&lt;span style="color: #ff00ff;"&gt;0&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #008080;"&gt;_shm&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;ipcs -m -u &lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;|&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;grep &lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;pages resident&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;|&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;awk -F&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;{print $3}&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #804040;"&gt;&lt;strong&gt;echo&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;_shm * PAGE_SIZE&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;function&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008080;"&gt;get_tmpfs_from_df()&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; local &lt;span style="color: #008080;"&gt;_size&lt;/span&gt;=&lt;span style="color: #804040;"&gt;&lt;strong&gt;""&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #008080;"&gt;_size&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;df -k &lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;|&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;awk -F&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;BEGIN{total=0} {if ($1 == "tmpfs" || $1 == "devtmpfs" || $1 == "shm")total+=$3}END{print total}&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #804040;"&gt;&lt;strong&gt;echo&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$_size&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#inode, dentry and buffer_head is reclaimable &lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;function&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008080;"&gt;get_slab_reclaimable_from_slabinfo()&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; local &lt;span style="color: #008080;"&gt;_size&lt;/span&gt;=&lt;span style="color: #804040;"&gt;&lt;strong&gt;""&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #008080;"&gt;_size&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;awk -F&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;BEGIN{total=0} {if ($1~/inode/ || $1~"dentry" || $1 == "buffer_head")total+=($3 * $4)}END{printf "%d\n", total / 1024}&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;'&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;/proc/slabinfo&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #804040;"&gt;&lt;strong&gt;[&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;-z&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$_size&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;]&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;&amp;amp;&amp;amp;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008080;"&gt;_size&lt;/span&gt;=&lt;span style="color: #ff00ff;"&gt;0&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #804040;"&gt;&lt;strong&gt;echo&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$_size&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #008080;"&gt;free&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo MemFree&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;total&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo MemTotal&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt; &lt;span style="color: #008080;"&gt;cached&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo Cached&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;buffer&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo Buffers&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;swapcached&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo SwapCached&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;shmem&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo Shmem&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;slab_reclaimable&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo SReclaimable&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;nfs_unstable&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_meminfo NFS_Unstable&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#the kernel does not support, no 'Shmem' field in /proc/meminfo, we use ipc and df.&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #804040;"&gt;&lt;strong&gt;if &lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;[&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;-z&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$shmem&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;]&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;then&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #008080;"&gt;shmem&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_shmem_from_ipcs&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;+ &lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_tmpfs_from_df&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #804040;"&gt;&lt;strong&gt;fi&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#the kernel does not support, no 'SReclaimable' field in /proc/meminfo, we use /proc/slabinfo.&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #804040;"&gt;&lt;strong&gt;if &lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;[&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;-z&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$slab_reclaimable&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;]&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;then&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #008080;"&gt;slab_reclaimable&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;get_slab_reclaimable_from_slabinfo&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #804040;"&gt;&lt;strong&gt;fi&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#the kernel does not support, no 'NFS_Unstable' field in /proc/meminfo, we use null. :)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #804040;"&gt;&lt;strong&gt;if &lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;[&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;-z&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;$nfs_unstable&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;]&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #804040;"&gt;&lt;strong&gt;then&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #008080;"&gt;nfs_unstable&lt;/span&gt;=&lt;span style="color: #ff00ff;"&gt;0&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #804040;"&gt;&lt;strong&gt;fi&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;span style="color: #008080;"&gt;reclaimable&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;cached + buffer + slab_reclaimable + swapcached + nfs_unstable - shmem&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #008080;"&gt;available&lt;/span&gt;=&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #6a5acd;"&gt;free + reclaimable&lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #ff0000;"&gt;&lt;span style="color: #ffffff;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; show_meminfo &lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;Total: &lt;/span&gt;&lt;span style="color: #804040;"&gt;&lt;strong&gt;"&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;说说free命令&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14px; font-weight: normal; line-height: 22px;"&gt;free是个常用命令，几乎每个接触、使用linux的用户都会用到它。但往往对它的统计输出会有一些困惑，这一方面和Linux内存管理机制有关，另一方面Linux在内存统计上也确实有些不足和问题。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;关键在于两个字段，buffers和cached。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你经常会发现Linux系统用了一段时间后，内存所剩无几，free命令，一看，内存全跑到 buffers和cached里面了；这个现象是正常的。访问过的磁盘文件的元数据及内容，内核都会缓存起来。这些缓存就是磁盘缓存。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Linux磁盘缓存设计特点（设计理念）：&lt;br /&gt;除了系统运行必须的一小部分保留外，只要有剩余内存，只要需要，就会用给磁盘缓存&lt;span style="font-size: x-small;"&gt;。（没有一个参数可以让你限定缓存的上限。2.6内核之前有一个限定参数，后来给取消了）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small;"&gt;所以会经常看到内存所剩无几的现象，这是缓存机制导致的，对应用是透明，在有内存需要时，这些内存会释放。这个过程对应用是透明的，应用可以认为系统的可用内存包括buffers和cached。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;这种设计，在大多数服务器应用场景下都有比较好的性能表现。可以说是比较可取的。&lt;/p&gt;&lt;p&gt;设计本身没有问题，但free命令显示的buffers和cached并不能和磁盘缓存完全对应，这是实现细节上的不足和问题。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;1. buffers和cached包含了不属于磁盘缓存的内容。&lt;br /&gt;由于buffers和cached实际上就是内核为所有文件映射分配的物理页的总和（page cache）。&lt;br /&gt;但内核中的&amp;ldquo;文件概念&amp;rdquo;是广泛的，不仅包含了真正位于磁盘上的文件，还包含了为特殊需要创建的虚拟文件，比如：&lt;/p&gt;&lt;p&gt;进程间的共享内存（通过shmget API创建的内存），内核建立一个虚拟的文件和共享内存关联起来&lt;span style="font-size: x-small;"&gt;。（通过pmap命令你可以看到进程拥有的共享内存地址空间的映射字段是/SYSVXXXX字样，不是匿名的）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;非常的不幸，这些虚拟文件映射关联的page，也被算入了free命令显示的cached字段。但这部分内存没有缓存属性，在内存不足时不能按缓存的方式来回收&lt;span style="font-size: x-small;"&gt;。(使用echo 3 &amp;gt;/proc/sys/vm/drop_caches，无法释放掉这部分内存）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这个问题，会带来一些麻烦。比如，按照常规理解，某产品设计内存占用过高告警的条件是，空闲内存+buffers+cached小于内存总和的20% 。一般情况下没有问题，但如果产品使用了大量的共享内存，告警将失去作用。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2. buffers和cached遗漏了部分属于磁盘缓存的内容。&lt;br /&gt;还 是由于buffers和cached只是内核为所有文件映射分配的物理页的总和。在文件系统方面，还有一部分缓存是不和文件映射相关联的，比如内核分配的 inode对象，在文件关闭时，并不会立即释放，具备缓存的属性。这部分不在基于文件映射的页面里，而是通过slab（内核内存池）分配的。&lt;/p&gt;&lt;p&gt;原文：http://yalung929.blog.163.com/blog/static/203898225201223102617451/&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2447503.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/14/2447503.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/14/2447469.html</id><title type="text">转一篇Instagram的架构分享</title><summary type="text">One of the questions we always get asked at meet-ups and conversations with other engineers is, “what’s your stack?” We thought it would be fun to give a sense of all the systems that power Instagram, at a high-level; you can look forward to more in-depth descriptions of some of these systems in the</summary><published>2012-04-14T11:46:00Z</published><updated>2012-04-14T11:46:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/14/2447469.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/14/2447469.html"/><content type="html">&lt;p&gt;One of the questions we always get asked at meet-ups and conversations with other engineers is, &amp;ldquo;what&amp;rsquo;s your stack?&amp;rdquo; We thought it would be fun to give a sense of all the systems that power Instagram, at a high-level; you can look forward to more in-depth descriptions of some of these systems in the future. This is how our system has evolved in the just-over-1-year that we&amp;rsquo;ve been live, and while there are parts we&amp;rsquo;re always re-working, this is a glimpse of how a startup with a small engineering team can scale to our 14 million+ users in a little over a year. Our core principles when choosing a system are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Keep it very simple&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t re-invent the wheel&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Go with proven and solid technologies when you can&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We&amp;rsquo;ll go from top to bottom:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OS / Hosting&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We run Ubuntu Linux 11.04 (&amp;ldquo;Natty Narwhal&amp;rdquo;) on Amazon EC2. We&amp;rsquo;ve found previous versions of Ubuntu had all sorts of unpredictable freezing episodes on EC2 under high traffic, but Natty has been solid. We&amp;rsquo;ve only got 3 engineers, and our needs are still evolving, so self-hosting isn&amp;rsquo;t an option we&amp;rsquo;ve explored too deeply yet, though is something we may revisit in the future given the unparalleled growth in usage.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Load Balancing&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Every request to Instagram servers goes through load balancing machines; we used to run 2&amp;nbsp;&lt;a href="http://nginx.org/"&gt;nginx&lt;/a&gt; machines and DNS Round-Robin between them. The downside of this approach is the time it takes for DNS to update in case one of the machines needs to get decomissioned. Recently, we moved to using Amazon&amp;rsquo;s Elastic Load Balancer, with 3 NGINX instances behind it that can be swapped in and out (and are automatically taken out of rotation if they fail a health check). We also terminate our SSL at the ELB level, which lessens the CPU load on nginx. We use Amazon&amp;rsquo;s Route53 for DNS, which they&amp;rsquo;ve recently added a pretty good GUI tool for in the AWS console.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Application Servers&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Next up comes the application servers that handle our requests. We run &lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; on Amazon High-CPU Extra-Large machines, and as our usage grows we&amp;rsquo;ve gone from just a few of these machines to over 25 of them (luckily, this is one area that&amp;rsquo;s easy to horizontally scale as they are stateless). We&amp;rsquo;ve found that our particular work-load is very CPU-bound rather than memory-bound, so the High-CPU Extra-Large instance type provides the right balance of memory and CPU.&lt;/p&gt;&lt;p&gt;We use &lt;a href="http://gunicorn.org/"&gt;http://gunicorn.org/&lt;/a&gt; as our WSGI server; we used to use mod_wsgi and Apache, but found Gunicorn was much easier to configure, and less CPU-intensive. To run commands on many instances at once (like deploying code), we use &lt;a href="http://fabric.readthedocs.org/en/1.3.3/index.html"&gt;Fabric&lt;/a&gt;, which recently added a useful parallel mode so that deploys take a matter of seconds.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Data storage&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Most of our data (users, photo metadata, tags, etc) lives in PostgreSQL; we&amp;rsquo;ve &lt;a href="http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram"&gt;previously written&lt;/a&gt; about how we shard across our different Postgres instances. Our main shard cluster involves 12 Quadruple Extra-Large memory instances (and twelve replicas in a different zone.)&lt;/p&gt;&lt;p&gt;We&amp;rsquo;ve found that Amazon&amp;rsquo;s network disk system (EBS) doesn&amp;rsquo;t support enough disk seeks per second, so having all of our working set in memory is extremely important. To get reasonable IO performance, we set up our EBS drives in a software RAID using mdadm.&lt;/p&gt;&lt;p&gt;As a quick tip, we&amp;rsquo;ve found that &lt;a href="http://hoytech.com/vmtouch/vmtouch.c"&gt;vmtouch&lt;/a&gt; is a fantastic tool for managing what data is in memory, especially when failing over from one machine to another where there is no active memory profile already. &lt;a href="https://gist.github.com/1424540"&gt;Here is the script&lt;/a&gt; we use to parse the output of a vmtouch run on one machine and print out the corresponding vmtouch command to run on another system to match its current memory status.&lt;/p&gt;&lt;p&gt;All of our PostgreSQL instances run in a master-replica setup using Streaming Replication, and we use EBS snapshotting to take frequent backups of our systems. We use XFS as our file system, which lets us freeze &amp;amp; unfreeze the RAID arrays when snapshotting, in order to guarantee a consistent snapshot (our original inspiration came from &lt;a href="http://alestic.com/2009/09/ec2-consistent-snapshot"&gt;ec2-consistent-snapshot&lt;/a&gt;. To get streaming replication started, our favorite tool is &lt;a href="https://github.com/greg2ndQuadrant/repmgr"&gt;repmgr&lt;/a&gt; by the folks at 2ndQuadrant.&lt;/p&gt;&lt;p&gt;To connect to our databases from our app servers, we made early on that had a huge impact on performance was using&amp;nbsp;&lt;a href="http://pgfoundry.org/projects/pgbouncer/"&gt;Pgbouncer&lt;/a&gt;&amp;nbsp;to pool our connections to PostgreSQL. We found&amp;nbsp;&lt;a href="http://thebuild.com/blog/"&gt;Christophe Pettus&amp;rsquo;s blog&lt;/a&gt;&amp;nbsp;to be a great resource for Django, PostgreSQL and Pgbouncer tips.&lt;/p&gt;&lt;p&gt;The photos themselves go straight to Amazon S3, which currently stores several terabytes of photo data for us. We use Amazon CloudFront as our CDN, which helps with image load times from users around the world (like in Japan, our second most-popular country).&lt;/p&gt;&lt;p&gt;We also use &lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt; extensively; it powers our main feed, our activity feed, our sessions system (&lt;a href="https://gist.github.com/910392"&gt;here&amp;rsquo;s our Django session backend&lt;/a&gt;), and other &lt;a href="http://instagram-engineering.tumblr.com/post/12202313862/storing-hundreds-of-millions-of-simple-key-value-pairs"&gt;related systems&lt;/a&gt;. All of Redis&amp;rsquo; data needs to fit in memory, so we end up running several Quadruple Extra-Large Memory instances for Redis, too, and occasionally shard across a few Redis instances for any given subsystem. We run Redis in a master-replica setup, and have the replicas constantly saving the DB out to disk, and finally use EBS snapshots to backup those DB dumps (we found that dumping the DB on the master was too taxing). Since Redis allows writes to its replicas, it makes for very easy online failover to a new Redis machine, without requiring any downtime.&lt;/p&gt;&lt;p&gt;For our &lt;a href="http://instagram.com/developer/endpoints/media/#get_media_search"&gt;geo-search API&lt;/a&gt;, we used PostgreSQL for many months, but once our Media entries were sharded, moved over to using &lt;a href="http://lucene.apache.org/solr/"&gt;Apache Solr&lt;/a&gt;. It has a simple JSON interface, so as far as our application is concerned, it&amp;rsquo;s just another API to consume.&lt;/p&gt;&lt;p&gt;Finally, like any modern Web service, we use Memcached for caching, and currently have 6 Memcached instances, which we connect to using pylibmc &amp;amp; libmemcached. Amazon has an Elastic Cache service they&amp;rsquo;ve recently launched, but it&amp;rsquo;s not any cheaper than running our instances, so we haven&amp;rsquo;t pushed ourselves to switch quite yet.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Task Queue &amp;amp; Push Notifications&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When a user decides to share out an Instagram photo to Twitter or Facebook, or when we need to notify one of our &lt;a href="http://instagram.com/developer/realtime/"&gt;Real-time subscribers&lt;/a&gt; of a new photo posted, we push that task into &lt;a href="http://gearman.org/"&gt;Gearman&lt;/a&gt;, a task queue system originally written at Danga. Doing it asynchronously through the task queue means that media uploads can finish quickly, while the &amp;lsquo;heavy lifting&amp;rsquo; can run in the background. We have about 200 workers (all written in Python) consuming the task queue at any given time, split between the services we share to. We also do our feed fan-out in Gearman, so posting is as responsive for a new user as it is for a user with many followers.&lt;/p&gt;&lt;p&gt;For doing push notifications, the most cost-effective solution we found was &lt;a href="https://github.com/samuraisam/pyapns"&gt;https://github.com/samuraisam/pyapns&lt;/a&gt;, an open-source Twisted service that has handled over a billion push notifications for us, and has been rock-solid.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;With 100+ instances, it&amp;rsquo;s important to keep on top of what&amp;rsquo;s going on across the board. We use &lt;a href="http://munin-monitoring.org/"&gt;Munin&lt;/a&gt; to graph metrics across all of our system, and also alert us if anything is outside of its normal range. We write a lot of custom Munin plugins, building on top of &lt;a href="http://samuelks.com/python-munin/"&gt;Python-Munin&lt;/a&gt;, to graph metrics that aren&amp;rsquo;t system-level (for example, signups per minute, photos posted per second, etc). We use &lt;a href="http://pingdom.com/"&gt;Pingdom&lt;/a&gt; for external monitoring of the service, and &lt;a href="http://pagerduty.com/"&gt;PagerDuty&lt;/a&gt; for handling notifications and incidents.&lt;/p&gt;&lt;p&gt;For Python error reporting, we use &lt;a href="http://pypi.python.org/pypi/django-sentry"&gt;Sentry&lt;/a&gt;, an awesome open-source Django app written by the folks at Disqus. At any given time, we can sign-on and see what errors are happening across our system, in real time.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;You?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If this description of our systems interests you, or if you&amp;rsquo;re hopping up and down ready to tell us all the things you&amp;rsquo;d change in the system, we&amp;rsquo;d love to hear from you. &lt;a href="http://instagr.am/about/jobs/"&gt;We&amp;rsquo;re looking for a DevOps person to join us and help us tame our EC2 instance herd&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;原文：http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of&lt;/p&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2447469.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/14/2447469.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/13/2446105.html</id><title type="text">xm list和xl list显示内存不一致的问题</title><summary type="text">xm list和xl list显示内存不一致的问题 在xen4.1.2上一台windows虚机碰到这个问题： # xm list test6 Name ID Mem VCPUs State Time(s) test6 16 512 2 -b---- 158.0 # xl list test6 Name ID Mem VCPUs State Time(s) test6 16 2048 2 -b---- 158.6 同一台虚机，用两个不同的工具查看，内存居然差了将近2GB。 由于xm和xl的实现机制不同，所以从源码分析开始，分别查看xm list和xl list的源码 xm list: 前文（h.</summary><published>2012-04-13T09:16:00Z</published><updated>2012-04-13T09:16:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/13/2446105.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/13/2446105.html"/><content type="html">&lt;div&gt;&lt;span&gt;xm list和xl list显示内存不一致的问题&lt;br /&gt;&lt;br /&gt; 在xen4.1.2上一台windows虚机碰到这个问题：&lt;br /&gt; # xm list test6&lt;br /&gt; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; Mem VCPUs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; State&amp;nbsp;&amp;nbsp; Time(s)&lt;br /&gt; test6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 16&amp;nbsp; 512&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -b----&amp;nbsp;&amp;nbsp;&amp;nbsp; 158.0&lt;br /&gt; # xl list test6&lt;br /&gt; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; Mem VCPUs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; State&amp;nbsp;&amp;nbsp; Time(s)&lt;br /&gt; test6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 16&amp;nbsp;&amp;nbsp; 2048&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -b----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 158.6&lt;br /&gt;&lt;br /&gt; 同一台虚机，用两个不同的工具查看，内存居然差了将近2GB。&lt;br /&gt;&lt;br /&gt; 由于xm和xl的实现机制不同，所以从源码分析开始，分别查看xm list和xl list的源码&lt;br /&gt;&lt;br /&gt; xm list:&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 前文（http://www.cnblogs.com/feisky/archive/2011/11/27/2265053.html）已经分析过xm list的源码，它得到的内存是xend和xenstore中的内存（两者总是保持一致）&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; xenstore中的内存可以通过下面的命令读出：&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; xenstore-read /vm/[uuid]/memory&lt;br /&gt;&lt;br /&gt; xl list:&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xl.c::main() --&amp;gt; cmdtable_lookup() --&amp;gt; main_list()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xl_cmdimpl.c::main_list()&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; libxl_domain_info(&amp;amp;ctx, &amp;amp;info_buf, domid);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xc_domain_getinfolist(ctx-&amp;gt;xch, domid, 1, &amp;amp;xcinfo)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xcinfo2xlinfo(&amp;amp;xcinfo, info_r)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xlinfo-&amp;gt;current_memkb = PAGE_TO_MEMKB(xcinfo-&amp;gt;tot_pages);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xc_domain_getinfolist(ctx-&amp;gt;xch, domid, 1, &amp;amp;xcinfo);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以看到xl list最终是通过XEN_SYSCTL_getdomaininfolist超级调用实现的&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xen/common/sysctl.c::do_sysctl()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;gt;&amp;nbsp; xen/common/domctl.c::getdomaininfo(d, &amp;amp;info)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; info-&amp;gt;tot_pages&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = d-&amp;gt;tot_pages;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; info-&amp;gt;max_pages&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = d-&amp;gt;max_pages;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; info-&amp;gt;shr_pages&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = atomic_read(&amp;amp;d-&amp;gt;shr_pages);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; info-&amp;gt;shared_info_frame = mfn_to_gmfn(d, __pa(d-&amp;gt;shared_info)&amp;gt;&amp;gt;PAGE_SHIFT);&lt;br /&gt;&lt;br /&gt; 可以看出，xl list得到的是hypervisor为该domain分配的内存。&lt;br /&gt;&lt;br /&gt; 通常情况下hypervisor为该domain分配的内存比xend传进去的内存多2MB（在xen3.4.3上也有同样的问题，多余的2MB应该是hypervisor占用）&lt;br /&gt; [root@localhost ~]# xm li test6&lt;br /&gt; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; Mem VCPUs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; State&amp;nbsp;&amp;nbsp; Time(s)&lt;br /&gt; test6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 21&amp;nbsp;&amp;nbsp; 512&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -b----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 79.4&lt;br /&gt; [root@localhost ~]# xl list test6&lt;br /&gt; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; Mem VCPUs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; State&amp;nbsp;&amp;nbsp; Time(s)&lt;br /&gt; test6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 21&amp;nbsp;&amp;nbsp; 514&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -b----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 79.4&lt;br /&gt;&lt;br /&gt; 上面碰到的问题是由于虽然通过xm mem-set为虚机重新调整了内存，新的内存值写入到了xend和xenstore中，但hypervisor并没有立即为该虚机ballon内存。此时，如果多次执行xl list可以看到test6虚机的内存一点点减少，直至514MB。&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2446105.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/13/2446105.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/11/2442152.html</id><title type="text">Xen4.2增加新的CPU调度参数</title><summary type="text">Xen 4.2 will contain two new scheduling parameters for the credit1 scheduler which significantly increase its confurability and performance for cloud-based workloads:timeslice_msandratelimit_us. This blog post describes what they do, and how to configure them for best performance.TimesliceThe timesl</summary><published>2012-04-11T05:01:00Z</published><updated>2012-04-11T05:01:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/11/2442152.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/11/2442152.html"/><content type="html">&lt;p&gt;Xen 4.2 will contain two new scheduling parameters for the credit1 scheduler which significantly increase its confurability and performance for cloud-based workloads:&lt;code&gt;timeslice_ms&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;ratelimit_us&lt;/code&gt;. This blog post describes what they do, and how to configure them for best performance.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Timeslice&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The timeslice for the credit1 has historically been fixed at 30ms. This is actually a fairly long time &amp;mdash; it&amp;rsquo;s great for computationally-intensive workloads, but not so good for latency-sensitive workloads, particularly ones involving network traffic or audio.&lt;/p&gt;&lt;p&gt;Xen 4.2 introduces the&amp;nbsp;&lt;code&gt;tslice_ms&lt;/code&gt;&amp;nbsp;parameter, which sets the timeslice of the scheduler in milliseconds. This can be set either using the Xen command-line option,&lt;code&gt;sched_credit_tslice_ms&lt;/code&gt;, or by using the new scheduling parameter interface to&amp;nbsp;&lt;code&gt;xl sched-credit&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# xl sched-credit -t [n]&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Interesting values you might give try are 10ms, 5ms, and 1ms. One millisecond might be a good choice for particularly latency-sensitive workloads; but beware that reducing the timeslice also increases the overhead from context switching and reduces the effectiveness of the CPU cache. Values of 5ms or 10ms give a good balance. The default, 30ms, is probably too long; but we&amp;rsquo;re going to do some more experimentation and probably switch the default in 4.3. If you try any values that turn out to be particularly good or bad, let us know.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Schedule rate limiting&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Hui Lv over at Intel did some fascinating work analyzing the performance overhead of running SpecVirt inside of Xen. What he discovered was that under certain circumstances, some VMs were waking up, doing a few microseconds worth of work, and going back to sleep, only to be woken up microseconds later. The credit1 scheduler correctly identified that these were probably latency-sensitive applications and gave them priority to run whenever they needed to. The problem was that they were causing thousands of schedules per second &amp;mdash; in some cases up to 15,000 schedules per second. This meant that there was a very significant amount of time actually spent in the scheduler switching back and forth between the two tasks, rather than doing the actual work.&lt;/p&gt;&lt;p&gt;The credit1 scheduler was giving these processes microsecond latency; but there are very few network-based workloads that require sub-millisecond latency. Hui worked with the Xen development community to introduce a simple mechanism that would be predictable and robust, and improve the performance for this workload without degrading the performance of other workloads. The result was&amp;nbsp;&lt;code&gt;ratelimit_us&lt;/code&gt;. The ratelimit is a value in microseconds. It is a minimum amount of time which a VM is allowed to run without being preempted. The default value is 1000 (that is, 1ms). So if a VM starts running, and another VM with higher priority wakes up, if the first VM has run for less than 1ms, it is allowed to continue to run until its 1ms is up; only after that will the higher-priority VM be allowed to run.&lt;/p&gt;&lt;p&gt;One millisecond is not generally too long for network-based workloads to wait; and the effect is to have more &amp;ldquo;batching&amp;rdquo;, so the whole system is used more effectively. This caused significant increase in SpecVirt performance in Hui&amp;rsquo;s tests.&lt;/p&gt;&lt;p&gt;This feature can be disabled by setting the ratelimit to 0. One could imagine, on a computation-heavy workload, setting this to something higher, like 5ms or 10ms; or if you have a particularly latency-sensitive workload, bringing it down to 500us or even 100us.&lt;/p&gt;&lt;p&gt;This value can be set either on the Xen command-line using&amp;nbsp;&lt;code&gt;sched_ratelimit_us&lt;/code&gt;&amp;nbsp;(Note no &amp;ldquo;credit&amp;rdquo; in this one &amp;mdash; it&amp;rsquo;s meant to be consumed by other schedulers as well) or the xl command-line:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# xl sched-credit -r [n]&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Curent values of both can also be viewed using xl:&lt;/p&gt;# xl sched-credit&lt;br/&gt;Cpupool Pool-0: tslice=30ms ratelimit=1000us&lt;br/&gt;Name                                ID Weight  Cap&lt;br/&gt;Domain-0                             0    256    0&lt;br/&gt;&lt;p&gt;Wait, what&amp;rsquo;s this &amp;ldquo;cpupool&amp;rdquo; thing, you say? That&amp;rsquo;s another new feature in Xen 4.2 &amp;mdash; but the topic of another blog post. Watch this space!&lt;/p&gt;&lt;p&gt;来自：&lt;a href="http://blog.xen.org/index.php/2012/04/10/xen-4-2-new-scheduler-parameters-2/"&gt;http://blog.xen.org/index.php/2012/04/10/xen-4-2-new-scheduler-parameters-2/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2442152.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/11/2442152.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/10/2441331.html</id><title type="text">python epoll</title><summary type="text">python epoll用法import socket, selectEOL1 = b'\n\n'EOL2 = b'\n\r\n'response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n'response += b'Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n'response += b'Hello, world!'serversocket = socket.socke</summary><published>2012-04-10T13:28:00Z</published><updated>2012-04-10T13:28:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/10/2441331.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/10/2441331.html"/><content type="html">&lt;p&gt;python epoll用法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; socket, select&lt;br/&gt;&lt;br/&gt;EOL1 &lt;/span&gt;= b&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;EOL2 &lt;/span&gt;= b&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;response  &lt;/span&gt;= b&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;response &lt;/span&gt;+= b&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;response &lt;/span&gt;+= b&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello, world!&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&lt;br/&gt;serversocket &lt;/span&gt;=&lt;span style="color: #000000;"&gt; socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br/&gt;serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, &lt;/span&gt;1&lt;span style="color: #000000;"&gt;)&lt;br/&gt;serversocket.bind((&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0.0.0.0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;, 8080&lt;span style="color: #000000;"&gt;))&lt;br/&gt;serversocket.listen(&lt;/span&gt;1&lt;span style="color: #000000;"&gt;)&lt;br/&gt;serversocket.setblocking(0)&lt;br/&gt;&lt;br/&gt;epoll &lt;/span&gt;=&lt;span style="color: #000000;"&gt; select.epoll()&lt;br/&gt;epoll.register(serversocket.fileno(), select.EPOLLIN &lt;/span&gt;|&lt;span style="color: #000000;"&gt; select.EPOLLET)&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;    connections &lt;/span&gt;= {}; requests = {}; responses =&lt;span style="color: #000000;"&gt; {}&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; True:&lt;br/&gt;        events &lt;/span&gt;= epoll.poll(1&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; fileno, event &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; events:&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; fileno ==&lt;span style="color: #000000;"&gt; serversocket.fileno():&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; True:&lt;br/&gt;                        connection, address &lt;/span&gt;=&lt;span style="color: #000000;"&gt; serversocket.accept()&lt;br/&gt;                        connection.setblocking(0)&lt;br/&gt;                        epoll.register(connection.fileno(), select.EPOLLIN &lt;/span&gt;|&lt;span style="color: #000000;"&gt; select.EPOLLET)&lt;br/&gt;                        connections[connection.fileno()] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; connection&lt;br/&gt;                        requests[connection.fileno()] &lt;/span&gt;= b&lt;span style="color: #800000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                        responses[connection.fileno()] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; response&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;except&lt;/span&gt;&lt;span style="color: #000000;"&gt; socket.error:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;pass&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; event &amp;amp;&lt;span style="color: #000000;"&gt; select.EPOLLIN:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; True:&lt;br/&gt;                        requests[fileno] &lt;/span&gt;+= connections[fileno].recv(1024&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;except&lt;/span&gt;&lt;span style="color: #000000;"&gt; socket.error:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;pass&lt;/span&gt;&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; EOL1 &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; requests[fileno] &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; EOL2 &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; requests[fileno]:&lt;br/&gt;                    epoll.modify(fileno, select.EPOLLOUT &lt;/span&gt;|&lt;span style="color: #000000;"&gt; select.EPOLLET)&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;*40 + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + requests[fileno].decode()[:-2&lt;span style="color: #000000;"&gt;])&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; event &amp;amp;&lt;span style="color: #000000;"&gt; select.EPOLLOUT:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; len(responses[fileno]) &amp;gt;&lt;span style="color: #000000;"&gt; 0:&lt;br/&gt;                        byteswritten &lt;/span&gt;=&lt;span style="color: #000000;"&gt; connections[fileno].send(responses[fileno])&lt;br/&gt;                        responses[fileno] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; responses[fileno][byteswritten:]&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;except&lt;/span&gt;&lt;span style="color: #000000;"&gt; socket.error:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;pass&lt;/span&gt;&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; len(responses[fileno]) ==&lt;span style="color: #000000;"&gt; 0:&lt;br/&gt;                    epoll.modify(fileno, select.EPOLLET)&lt;br/&gt;                    connections[fileno].shutdown(socket.SHUT_RDWR)&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt; event &amp;amp;&lt;span style="color: #000000;"&gt; select.EPOLLHUP:&lt;br/&gt;                epoll.unregister(fileno)&lt;br/&gt;                connections[fileno].close()&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;del&lt;/span&gt;&lt;span style="color: #000000;"&gt; connections[fileno]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;    epoll.unregister(serversocket.fileno())&lt;br/&gt;    epoll.close()&lt;br/&gt;    serversocket.close()&lt;/span&gt;&lt;/div&gt;&lt;p&gt;参考：&lt;a href="http://scotdoyle.com/python-epoll-howto.html"&gt;http://scotdoyle.com/python-epoll-howto.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2441331.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/10/2441331.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/feisky/archive/2012/04/10/2441307.html</id><title type="text">xen-4.1.2+Linux-3.1.2源码编译安装</title><summary type="text">xen-4.1.2+Linux-3.1.2源码编译安装以下所有命令均在CentOS6.2系统上操作。下载xen源码wget http://bits.xensource.com/oss-xen/release/4.1.2/xen-4.1.2.tar.gz安装必备软件包yum groupinstall "Development Libraries"yum groupinstall "Development Tools"yum install transfig wget texi2html libaio-devel dev86 glibc-devel e2fs</summary><published>2012-04-10T13:10:00Z</published><updated>2012-04-10T13:10:00Z</updated><author><name>feisky</name><uri>http://www.cnblogs.com/feisky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/feisky/archive/2012/04/10/2441307.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/feisky/archive/2012/04/10/2441307.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;span&gt;xen-4.1.2+Linux-3.1.2源码编译安装&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;以下所有命令均在CentOS6.2系统上操作。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;下载xen源码&amp;nbsp;&lt;/span&gt;&lt;hr /&gt;&lt;div&gt;&lt;span&gt;wget http://bits.xensource.com/oss-xen/release/4.1.2/xen-4.1.2.tar.gz&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;安装必备软件包&lt;/span&gt;&lt;/div&gt;&lt;hr /&gt;&lt;span&gt;&lt;span lang="EN-US"&gt;yum groupinstall "Development Libraries"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;yum groupinstall "Development Tools"&lt;/span&gt;&lt;span lang="EN-US"&gt;yum install transfig wget texi2html libaio-devel dev86 glibc-devel e2fsprogs-devel gitk mkinitrd iasl xz-devel bzip2-devel pciutils-libs pciutils-devel SDL-devel libX11-devel gtk2-devel bridge-utils PyXML qemu-common qemu-img mercurial libidn-devel&lt;/span&gt;&lt;span lang="EN-US"&gt;yum -y install glibc-devel.i686&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;texinfo &lt;/span&gt;&lt;span&gt;libuuid-devel &lt;/span&gt;&lt;span style="color: #2c2c2c;"&gt;&lt;span&gt;iasl python-lxml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2c2c2c; font-family: 'Courier New';"&gt;&lt;span&gt;yum -y install openssl openssl-devel&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2c2c2c; font-family: 'Courier New';"&gt;&lt;span&gt;yum -y install ncurses ncurses-*&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2c2c2c; font-family: 'Courier New';"&gt;&lt;span&gt;yum install python-devel -y&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2c2c2c; font-family: 'Courier New';"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;编译安装xen hypervisor&lt;/span&gt;&lt;hr /&gt;&lt;span lang="EN-US"&gt;tar zxvf xen-4.1.2.tar.gz&lt;/span&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #333333; font-family: Courier; font-size: small;"&gt;&lt;span&gt;&lt;span&gt;make world&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: Courier; font-size: small;"&gt;&lt;span&gt;&lt;span&gt;make install&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: Courier; font-size: small;"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: Courier; font-size: small;"&gt;&lt;span&gt;&lt;span&gt;/boot下多了xen-4.1.2.gz和xen-syms-4.1.2文件&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #333333; font-family: Courier; font-size: small;"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;将Xen加入到启动脚本：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif;"&gt;&lt;span&gt;/sbin/chkconfig --add xend&lt;br /&gt;/sbin/chkconfig --add xencommons&lt;br /&gt;/sbin/chkconfig --add xendomains&lt;br /&gt;/sbin/chkconfig xend on&lt;br /&gt;/sbin/chkconfig xendomains on&lt;br /&gt;/sbin/chkconfig xencommons on&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif;"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;&lt;strong&gt;编译安装Linux3.1.2内核&lt;/strong&gt;&lt;/span&gt;&lt;hr /&gt;wget&amp;nbsp;http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.1.2.tar.bz2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;#&lt;strong&gt;make oldconfig # 全部默认&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;#&lt;strong&gt;make menuconfig&amp;nbsp;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Processor type and features --- &amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;选中Paravirtualized Guest Support&lt;/div&gt;&lt;div&gt;&amp;nbsp; Device Drivers ---&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Xen driver support ---&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 全部选*&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;修改：CONFIG_XEN_DEV_EVTCHN=y（&lt;strong&gt;&lt;span style="color: #2d4fc9;"&gt;如果是m，开机时无法启动xencommons&lt;/span&gt;&lt;/strong&gt;）&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;make&lt;br /&gt; make modules&lt;br /&gt; make modules_install&lt;br /&gt; make install （&lt;span style="color: #2d4fc9;"&gt;会报找不到xen-evtchn模块，忽略&lt;/span&gt;）&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;depmod 3.1.2&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;strong&gt;mkinitrd -v -f --with=aacraid --with=sd_mod --with=scsi_mod initramfs-3.1.2.img 3.1.2&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;配置grub&lt;/strong&gt;：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;title CentOS (3.1.2-xen)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root (hd0,0)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; kernel /boot/xen-4.1.2.gz&amp;nbsp; dom0_mem=1024M&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module /boot/vmlinuz-3.1.2 ro root=/dev/sda1&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module /boot/initramfs-3.1.2.img&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Georgia; font-size: small;"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Georgia; font-size: small;"&gt;&lt;span&gt;&lt;strong&gt;参考：&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://linuxme.blog.51cto.com/1850814/390778"&gt;http://linuxme.blog.51cto.com/1850814/390778&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://share.blog.51cto.com/278008/723828"&gt;http://share.blog.51cto.com/278008/723828&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://blog.chinaunix.net/space.php?uid=147142&amp;amp;do=blog&amp;amp;id=2788048"&gt;http://blog.chinaunix.net/space.php?uid=147142&amp;amp;do=blog&amp;amp;id=2788048&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://wiki.xen.org/xenwiki/2.6.18-to-2.6.31-and-higher"&gt;http://wiki.xen.org/xenwiki/2.6.18-to-2.6.31-and-higher&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Georgia; font-size: small;"&gt;&lt;span&gt;&lt;a href="http://wiki.xen.org/wiki/Migrate_from_Linux_2.6.18_to_2.6.31_and_higher"&gt;http://wiki.xen.org/wiki/Migrate_from_Linux_2.6.18_to_2.6.31_and_higher&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Georgia; font-size: small;"&gt;&lt;span&gt;&lt;a href="http://wiki.xen.org/wiki/Mainline_Linux_Kernel_Configs"&gt;http://wiki.xen.org/wiki/Mainline_Linux_Kernel_Configs&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Georgia; font-size: small;"&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://wiki.xen.org/wiki/HostConfiguration/Networking"&gt;http://wiki.xen.org/wiki/HostConfiguration/Networking&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/feisky/aggbug/2441307.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/feisky/archive/2012/04/10/2441307.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
