<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>朽木自雕 &#187; 技术随笔</title>
	<atom:link href="http://www.xiumu.org/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xiumu.org</link>
	<description>关注互联网动态，专注于WEB开发</description>
	<lastBuildDate>Sun, 05 Feb 2012 17:20:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CentOS安装GD库支持</title>
		<link>http://www.xiumu.org/technology/centos-install-gd-the-library-support.shtml</link>
		<comments>http://www.xiumu.org/technology/centos-install-gd-the-library-support.shtml#comments</comments>
		<pubDate>Sun, 05 Feb 2012 17:19:43 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[CentOS]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1723</guid>
		<description><![CDATA[默认CentOS服务器装好LAMP环境后并不支持GD库，网上有很多教程非常复杂的讲述了一些安装GD库的方法。其实完全不必如此复杂。 由于CentOS将支持GD库的PHP作为另外一个版本的PHP来发布，如果需要服务器支持GD库，只需要直接安装带GD库的php版本即可。 下面是最简便的安装GD库的方法： 具体操作只有2个命令如下： 运行在线安装带GD库的PHP的命令： yum -y install php-gd 重新启动apachce服务以使安装后的GD库生效 service httpd restart gd的安装路径 /etc/php.d/gd.ini 这个是让php支持gd的哦,这个是CentOS的特色之一,不用把全部东西都写在php.ini这个文件里,只是需要把*.ini文件写在/etc/php.d/文件夹就可以了,系统会自动把这个目录下的*.ini读入php.ini /usr/lib/php/modules/gd.so 这个就是gd的文件啦]]></description>
			<content:encoded><![CDATA[<p>默认CentOS服务器装好LAMP环境后并不支持GD库，网上有很多教程非常复杂的讲述了一些安装GD库的方法。其实完全不必如此复杂。</p>
<p>由于CentOS将支持GD库的PHP作为另外一个版本的PHP来发布，如果需要服务器支持GD库，只需要直接安装带GD库的php版本即可。</p>
<p>下面是最简便的安装GD库的方法：<br />
具体操作只有2个命令如下：<br />
运行在线安装带GD库的PHP的命令：</p>
<pre>yum -y install php-gd</pre>
<p>重新启动apachce服务以使安装后的GD库生效</p>
<pre>service httpd restart</pre>
<p>gd的安装路径</p>
<pre>/etc/php.d/gd.ini</pre>
<p><span id="more-1723"></span><br />
这个是让php支持gd的哦,这个是CentOS的特色之一,不用把全部东西都写在php.ini这个文件里,只是需要把*.ini文件写在/etc/php.d/文件夹就可以了,系统会自动把这个目录下的*.ini读入php.ini</p>
<pre>/usr/lib/php/modules/gd.so</pre>
<p>这个就是gd的文件啦</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/centos-install-gd-the-library-support.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为网站添加favicon.ico图标(透明)</title>
		<link>http://www.xiumu.org/technology/add-favicon-ico-icon-for-the-site-the-the-transparent.shtml</link>
		<comments>http://www.xiumu.org/technology/add-favicon-ico-icon-for-the-site-the-the-transparent.shtml#comments</comments>
		<pubDate>Sat, 04 Feb 2012 16:03:57 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[ICO]]></category>
		<category><![CDATA[图标]]></category>
		<category><![CDATA[百度]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1716</guid>
		<description><![CDATA[favicon图标的作用众所周知，一来可以在地址栏、收藏夹等位置显示，美观和其他网站区分开来，也易于赢得用户的信任，二网站图标对SEO也有些微的影响，并且一些搜索引擎包括百度已经开始收录ICO图标，在关键时刻可以赢得众多目光。 现在网上有很多favicon.ico的在线生成器，直接PS一个图片格式的图标放上去转化一下即可，那么我今天啰嗦这么多是想说一个小窍门，就是转换器做出来的图标是有白色背景的，无论你是否用了透明GIF/PNG结果都是一样的。 不过百度搜索结果的ICON图标显示，现在是百度人工添加的，现在门槛还是比较高，必须是业内的知名网站，记得在站长网看到有细心的站长提过说是显示图标的站都是被HAO123收录的站点。 那么我们需要一款图标软件 IconWorkshop，下载安装完成之后用IconWorkshop直接打开我们的PNG图标 点击上图所示按钮，只勾选32X32 RGBA（也可以16X16，32比较清晰），单击确定，文件另存为 格式选择ICO 名字为favicon.ico 将放到网站根目录，或者添加以下代码到HEAD中  &#60;link rel=”shortcut icon” href=”/dir/favicon.ico” mce_href=”/dir/favicon.ico” type=”image/x-icon”&#62; 清空浏览器缓存刷新即可看到效果。]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1718" title="ico" src="http://www.xiumu.org/blog-uploads/2012/02/ico.jpg" alt="" width="277" height="274" /><br />
favicon图标的作用众所周知，一来可以在地址栏、收藏夹等位置显示，美观和其他网站区分开来，也易于赢得用户的信任，二网站图标对SEO也有些微的影响，并且一些搜索引擎包括百度已经开始收录ICO图标，在关键时刻可以赢得众多目光。</p>
<p>现在网上有很多favicon.ico的在线生成器，直接PS一个图片格式的图标放上去转化一下即可，那么我今天啰嗦这么多是想说一个小窍门，<strong>就是转换器做出来的图标是有白色背景的</strong>，无论你是否用了透明GIF/PNG结果都是一样的。</p>
<p>不过百度搜索结果的ICON图标显示，现在是百度人工添加的，现在门槛还是比较高，必须是业内的知名网站，记得在站长网看到有细心的站长提过说是显示图标的站都是被HAO123收录的站点。</p>
<p>那么我们需要一款图标软件 <a href="http://www.xiazaiba.com/html/161.html" target="_blank">IconWorkshop</a>，下载安装完成之后用IconWorkshop直接打开我们的PNG图标</p>
<p><img class="size-full wp-image-1717" title="ico2" src="http://www.xiumu.org/blog-uploads/2012/02/ico2.jpg" alt="" width="391" height="68" /></p>
<p>点击上图所示按钮，只勾选32X32 RGBA（也可以16X16，32比较清晰），单击确定，文件另存为 格式选择ICO 名字为favicon.ico</p>
<p>将放到网站根目录，或者添加以下代码到HEAD中</p>
<pre> &lt;link rel=”shortcut icon” href=”/dir/favicon.ico” mce_href=”/dir/favicon.ico” type=”image/x-icon”&gt;</pre>
<p>清空浏览器缓存刷新即可看到效果。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/add-favicon-ico-icon-for-the-site-the-the-transparent.shtml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VPS上优化Apache</title>
		<link>http://www.xiumu.org/technology/vps-to-optimize-apache.shtml</link>
		<comments>http://www.xiumu.org/technology/vps-to-optimize-apache.shtml#comments</comments>
		<pubDate>Thu, 02 Feb 2012 14:08:59 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[VPS]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1693</guid>
		<description><![CDATA[一、削减模块以及计算调整可供APACHE使用的内存 影响WEB服务器最大的因素即为内存，所以我们把它放在最前面 在默认状态下，Apache会分配最大256个并发客户端连接，或者256个进程（每一个都对应一个请求）。按照这种设置，一个流量巨大的网站会在顷刻间崩溃（即使你假设每个进程占用5MB内存，那也需要1.3GB的内存来满足请求的数量）。如果不采取其它措施，系统会通过硬盘来尝试使用交换空间以处理它无法在物理内存中完成的任务。 所以，我们需要修改httpd.conf，使它使用最小的模块集 修改httpd.conf文件，保留 LoadModule authz_host_module modules/mod_authz_host.so LoadModule log_config_module modules/mod_log_config.so LoadModule expires_module modules/mod_expires.so LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule mime_module modules/mod_mime.so LoadModule autoindex_module modules/mod_autoindex.so LoadModule dir_module modules/mod_dir.so LoadModule alias_module modules/mod_alias.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule php5_module        modules/libphp5.so LoadModule fastcgi_module modules/mod_fastcgi.so 去掉其它的模块 我们配置的VPS服务器，系统加LAMP程序启动后总共在300M左右的内存，你可能希望要求50％的物理内存都供Apache使用，这样，你需要确定可以让httpd真正使用的内存数。 首先准确计算出apache占用的进程数 # ps -ef&#124;grep httpd root     21678     1  0 [...]]]></description>
			<content:encoded><![CDATA[<p>一、削减模块以及计算调整可供APACHE使用的内存<br />
影响WEB服务器最大的因素即为内存，所以我们把它放在最前面</p>
<p>在默认状态下，Apache会分配最大256个并发客户端连接，或者256个进程（每一个都对应一个请求）。按照这种设置，一个流量巨大的网站会在顷刻间崩溃（即使你假设每个进程占用5MB内存，那也需要1.3GB的内存来满足请求的数量）。如果不采取其它措施，系统会通过硬盘来尝试使用交换空间以处理它无法在物理内存中完成的任务。<br />
<span id="more-1693"></span><br />
所以，我们需要修改httpd.conf，使它使用最小的模块集<br />
修改httpd.conf文件，保留</p>
<pre>
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.so
LoadModule fastcgi_module modules/mod_fastcgi.so
</pre>
<p>去掉其它的模块</p>
<p>我们配置的VPS服务器，系统加LAMP程序启动后总共在300M左右的内存，你可能希望要求50％的物理内存都供Apache使用，这样，你需要确定可以让httpd真正使用的内存数。</p>
<p>首先准确计算出apache占用的进程数</p>
<pre>
# ps -ef|grep httpd
root     21678     1  0 Jul19 ?        00:00:00 /usr/local/apache//bin/httpd -k start
vuser    21679 21678  0 Jul19 ?        00:00:00 /usr/local/apache//bin/httpd -k start
vuser    21714 21678  0 Jul19 ?        00:00:07 /usr/local/apache//bin/httpd -k start
vuser    21855 21678  0 Jul19 ?        00:00:07 /usr/local/apache//bin/httpd -k start
</pre>
<p>看apache是以什么用户启动的，然后我们再用</p>
<pre>
# ps -U vuser -u vuser u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vuser    29838  0.0  0.0 200404  5580 ?        S    11:29   0:00 /usr/local/apache//bin/fcgi- -k start
vuser    29845  0.0  0.0 879952  7592 ?        Sl   11:29   0:00 /usr/local/apache//bin/httpd -k start
vuser    29851  0.0  0.0 879952  7592 ?        Sl   11:29   0:00 /usr/local/apache//bin/httpd -k start
</pre>
<p>(注：一般是用# ps -U apache -u apache u察看，但我这里运行apache的是vuser用户）</p>
<p>我们看到单个httpd进程使用了7.6 MB的RSS（驻留集大小）内存以及最大为88M左右的VSZ(虚拟内存)，这当然在很大程度上取决于你在Apache里加载和运行的模块数量。这决不是一个固定的数字。由于这个数字里还包含了共享库包，所以不是100％的准确。我们可以认为RSS数字的一半是httpd线程真正使用的内存数，这可能还有点保守，但是离我们的目的已经非常接近了，这样，我们HTTPD线呈使用的内存数即为8M/2=4M</p>
<p>说明：MinSpareservers和MaxSpareServers分别设置空闲子进程的最小和最大数量，StartServers设置了服务器启动时建立的子进程数量。<br />
ServerLimit则是控制MaxClients所能使用的最大值。缩减MaxClients能让运行动态内容（比如：Drupal）的服务器有很大的改变。如果你的VPS遭遇到流量的大幅增加，而你的MaxClients设置的太高的话，你的服务器将会无限循环工作于从物理内存交换页面到虚拟内存中，最终导致宕机。一般计算适当的MaxClients值取决于你总共可用的系统内存除于每个Apache进程使用的内存。</p>
<p>计算MaxClient<br />
MaxClients＝(总内存－预留内存)/单个APACHE子进程使用的内存。<br />
那么我们的1GRAM的VPS服务器的MaxClient即为：<br />
MaxClients＝(1024-512)/4=128个</p>
<p>设置MaxRequestsPerChild</p>
<p>MaxRequestsPerChild设置的是每个子进程可以处理的请求数。每个子进程在处理了MaxRequestsPerChild个请求后将自动销毁。0意味着无限，即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求，但如果设成非零值也有两点重要的好处：</p>
<p>1、可防止意外的内存卸漏；<br />
2、在服务器负载下降的时侯会自动减少子进程数。</p>
<p>因此，可根据服务器的负载来调整这个值，如果非零的话，vps上个人认为1000左右是比较合适的。事实上这个值对Apache的性能影响不是很大。</p>
<p>以下是本人在1G内存的VPS上常用的配置</p>
<pre>
&lt;IfModule mpm_prefork_module&gt;
StartServers            5
MinSpareServers        5
MaxSpareServers       20
ServerLimit        128
MaxClients            128
MaxRequestsPerChild   1000
&lt;/IfModule&gt;
</pre>
<p>它们要根据你的VPS的大小和你的Apache进程大小等来决定。</p>
<p>备注：<br />
HostnameLookups最好设置为off，否则会带来延迟，因为对每一个请求都需要作一次DNS查询。如果你使用了任何”Allow from domain”或”Deny from domain”指令(也就是domain使用的是主机名而不是IP地址)，则代价是要进行两次DNS查询(一次正向和一次反向，以确认没有作假)。所以，为了得到最高的性能，应该避免使用这些指令(不用域名而用IP地址也是可以的)。如果网站空间中没有使用 Options FollowSymLinks，Apache就必须执行额外的系统调用以验证符号连接。为了避免这种情况应该在所有地方都设置FollowSymLinks。如果设置AllowOverride all，则Apache会试图对文件名的每一个组成部分都打开.htaccess，如无必要应该对文件系统中所有的地方都使用 AllowOverride None。在Apache2.0能够忽略将要被发送的文件的内容的时候(比如发送静态内容)，如果操作系统支持sendfile() ，则Apache将使用内核提供的sendfile()来发送文件。使用sendfile可以通过免除分离的读和写操作来提升性能。我们可以通过设置EnableSendfile on来开启它。</p>
<p>二、优化KeepAlive<br />
KeepAlive允许你的访问者在同一个TCP连接上完成多个请求，理论上它有助于提升反应时间，因为你的访问者可以在同一个连接上请求你的网页，图片和javascripts。遗憾地是，Apache对于每个请求都需要一个工作进程去处理。默认的每个工作进程将持续打开15秒来处理每个请求，即使你的访问者已经不再使用它了！这也就意味着你的系统在任何时间都是缺少工作进程的。我们都希望我们那只有有限资源的小VPS能有确实在工作的工作进程。实现的方法之一是关闭KeepAlive。在你的httpd.conf文件中找到下面的一行：<br />
KeepAlive On<br />
然后将它改变为：<br />
KeepAlive Off<br />
如果你的网站有大量的图片和javascripts，通常最好还是让KeepAlive保持打开，然后做些调整。<br />
如果你决定让KeepAlive保持打开状态，改变默认的KeepAliveTimeout值就显得很重要了。它能避免连接没有在使用时仍然打开。在你的httpd.conf文件中找到下面一行：<br />
KeepAliveTimeout 15<br />
你只希望连接打开5秒钟，这已经足够用户打开大部分必须的文件。所以改变此行为：<br />
KeepAliveTimeout 5<br />
如果你希望让KeepAlive保持打开状态，同时应该增加MaxKeepAliveRequests。设置它为更大的值让每个连接可以处理更多的请求，从而增加效率。找到这行：<br />
MaxKeepAliveRequests 100<br />
改变为：<br />
MaxKeepAliveRequests 200</p>
<p>三、调整Timeout<br />
另一个较小的调整是改变TimeOut指令，这个调整可以得到小的性能提升和减小DDOS攻击的效果。这个指令用于设置Apache当接收新请求，处理请求和返回响应前需等待多少秒。找到这行：<br />
Timeout 120<br />
改变为：<br />
Timeout 60<br />
重启Apache，感受VPS的性能吧！即节约了建站成本，又提升了服务器质量，何乐而不为。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/vps-to-optimize-apache.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VPS 上优化 MySQL</title>
		<link>http://www.xiumu.org/technology/optimizing-mysql-on-vps.shtml</link>
		<comments>http://www.xiumu.org/technology/optimizing-mysql-on-vps.shtml#comments</comments>
		<pubDate>Thu, 02 Feb 2012 13:51:37 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[VPS]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1685</guid>
		<description><![CDATA[MySQL 是一个很棒的 open source 数据库引擎，大部分的网站和博客都是由 MySQL 驱动的。MySQL 的默认安装占用的内存资源比较大（相对于一个只有 64MB 的 VPS来说），优化 MySQL 可以减少内存消耗，把更多的内存省下来留给其他程序。 MySQL 的配置文件在 /etc/mysql/my.cnf（Debian 5），为了方便调整配置，MySQL 为小资源系统提供了一个叫做 my-small.cnf 的配置文件，是给小于 32MB 内存的服务器设置的。我们可以在这个配置文件的基础上作小部分的调整。 先找到 /usr/share/doc/mysql-server-5.0/examples/my-small.cnf，然后覆盖 /etc/mysql/my.cnf（Debian）。如果是 CentOS 5 的话，路径是：/usr/share/doc/mysql-server-5.0.45/my-small.cnf，覆盖 /etc/my.cnf。 参数说明 如果不使用 BDB table 和 InnoDB table 的话，加入下面2行关闭不需要的表类型很有必要，关闭 innodb 可以省下大量内存，虽然 InnoDB 好处多多但是在一个64MB的 VPS 上并不能体现出来，并且很占内存。 skip-bdb skip-innodb key_buffer 是优化性能的重要参数，用来缓存 tables keys 和 indexes，增加这个值可以更好的处理索引，读和写都需要索引。这里设设置成 16K 足够了。table_cache 是所有线程打开的表的数量，增加值可以增大 MySQL [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1686" title="mysql" src="http://www.xiumu.org/blog-uploads/2012/02/mysql.png" alt="" width="200" height="202" />MySQL 是一个很棒的 open source 数据库引擎，大部分的网站和博客都是由 MySQL 驱动的。MySQL 的默认安装占用的内存资源比较大（相对于一个只有 64MB 的 VPS来说），优化 MySQL 可以减少内存消耗，把更多的内存省下来留给其他程序。</p>
<p>MySQL 的配置文件在 /etc/mysql/my.cnf（Debian 5），为了方便调整配置，MySQL 为小资源系统提供了一个叫做 my-small.cnf 的配置文件，是给小于 32MB 内存的服务器设置的。我们可以在这个配置文件的基础上作小部分的调整。<br />
<span id="more-1685"></span><br />
先找到 /usr/share/doc/mysql-server-5.0/examples/my-small.cnf，然后覆盖 /etc/mysql/my.cnf（Debian）。如果是 CentOS 5 的话，路径是：/usr/share/doc/mysql-server-5.0.45/my-small.cnf，覆盖 /etc/my.cnf。</p>
<h2>参数说明</h2>
<p>如果不使用 BDB table 和 InnoDB table 的话，加入下面2行关闭不需要的表类型很有必要，关闭 innodb 可以省下大量内存，虽然 InnoDB 好处多多但是在一个64MB的 VPS 上并不能体现出来，并且很占内存。</p>
<pre>skip-bdb
skip-innodb</pre>
<p>key_buffer 是优化性能的重要参数，用来缓存 tables keys 和 indexes，增加这个值可以更好的处理索引，读和写都需要索引。这里设设置成 16K 足够了。table_cache 是所有线程打开的表的数量，增加值可以增大 MySQL 的文件描述符数量，避免频繁的打开表，原始 my-small.cnf 中 table_cache 设置成4有点小，一个 wordpress 的页面通常会涉及到10个左右的表，其他的程序比如 Drupal，MediaWiki 会涉及到更多，将table_cache改为8。</p>
<pre>key_buffer = 16K
table_cache = 8</pre>
<p>max_connections 是数据库最大的连接数量，可以根据自己博客/网站的访问量来定这个值。如果博客/网站经常出现：Too many connections 错误的信息说明需要增大 max_connections 的值。thread_concurrency 是最大并发线程数，通常设置为 CPU核数量×2，在 VPS 宿主机上如果服务器有2颗物理 CPU，而每颗物理 CPU 又支持 H.T 超线程（一个处理器上整合了两个逻辑处理器单元），所以实际取值为4 × 2 ＝ 8。</p>
<p>如果我们在优化 php.ini 的时候设置了同时只有2个 php-cgi 运行的话，那么我们也应该只设置2个 MySQL 线程同时运行。</p>
<pre>max_connections = 16
thread_concurrency = 2</pre>
<p>对于博客/新闻网站来说，用得最多的就是查询，所以需要加入 query cache 的设置。query_cache_size 是执行查询所使用的缓冲大小。</p>
<pre>query_cache_limit = 256K
query_cache_size = 4M</pre>
<p>thread_stack 用来存放每个线程的标识信息，如线程 id，线程运行时环境等，可以通过设置 thread_stack 来决定给每个线程分配多大的内存。</p>
<p>sort_buffer_size 是每个需要排序的线程分配的缓冲区大小，增加该值可以加速 order by 和 group by 的操作。注意：该参数是以每个连接分配内存，也就是说，如果有16个连接，sort_buffer_size 为 64K，那么实际分配的内存为：16 × 64K = 1MB。如果设置的缓存大小无法满足需要，MySQL 会将数据写入磁盘来完成排序。因为磁盘操作和内存操作不在一个数量级，所以 sort_buffer_size 对排序的性能影响很大。</p>
<p>read_buffer_size 是顺序读取数据时的缓冲区大小，与 sort_buffer_size 一样，该参数分配的内存也是以每连接为单位的。read_buffer_size 是用来当需要顺序读取数据的时候，如无发使用索引的情况下的全表扫描，全索引扫描等。在这种时候，MySQL 按照数据的存储顺序依次读取数据块，每次读取的数据快首先会暂存在 read_buffer_size 中，当 buffer 空间被写满或者全部数据读取结束后，再将 buffer 中的数据返回给上层调用者，以提高效率。</p>
<p>read_rnd_buffer_size 是随机读取数据时的缓冲区大小，与顺序读相对应。</p>
<p>net_buffer_size 用来存放客户端连接线程的连接信息和返回客户端的结果集的缓存大小。当 MySQL 接到请求后，产生返回结果集时，会在返回给请求线程之前暂存在在这个缓存中，等积累到一定大小的时候才开始向客户端发送，以提高网络效率。不过，net_buffer_size 所设置的仅仅只是初始大小，MySQL 会根据实际需要自行申请更多的内存，但最大不会超过 max_allowed_packet。</p>
<pre>sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K</pre>
<p>skip-locking用来避免 MySQL 外部锁定，减少出错几率，增强稳定性。</p>
<pre>skip-locking</pre>
<h2>优化后配置</h2>
<p>经优化后，my.cnf 的配置如下，top 查看 mysqld 保持在 5M 一下。</p>
<pre>[mysqld]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
skip-locking

key_buffer = 16K
query_cache_limit = 256K
query_cache_size = 4M
max_allowed_packet = 1M
table_cache = 8

max_connections = 16
thread_concurrency = 2

sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K

skip-bdb
skip-innodb

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
#safe-updates

[isamchk]
key_buffer = 8M
sort_buffer_size = 8M

[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout</pre>
<h2>内存计算公式</h2>
<blockquote><p>MySQL memory = key_buffer + max_connections *<br />
(join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/optimizing-mysql-on-vps.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>是什么吃掉了我的VPS硬盘？</title>
		<link>http://www.xiumu.org/technology/what-is-vps-ate-my-hard-drive.shtml</link>
		<comments>http://www.xiumu.org/technology/what-is-vps-ate-my-hard-drive.shtml#comments</comments>
		<pubDate>Thu, 02 Feb 2012 04:00:09 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[VPS]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1690</guid>
		<description><![CDATA[这多半是因为系统上的各种日志长期积累下来的结果，比如 nginx, apache 等留下来的访问日志信息长时间不清理、而且访问量大的话会很容易就膨胀到 GB；有时候某种应用程序的日志藏在文件系统的深处，不易发觉；有时候自己拷贝了一些大文件放在某个地方时间长了就忘了。那么如何在 Linux 系统上找到这些占用硬盘空间的文件呢？ 首先我们可以统计一下根目录下各个目录占用硬盘的情况，找出最占用硬盘的那个目录： # du -sh /* 6.2M /bin 17M /boot 136K /dev 97M /etc 147G /home 584M /lib 16M /lib64 16K /lost+found 8.0K /media 12K /mnt 252K /opt 0 /proc 1.7G /root 28M /sbin 8.0K /selinux 3.1M /srv 0 /sys 20K /tmp 1.9G /usr 748M /var 从上面可看出 /home 占用了最多的硬盘，我们去看看 [...]]]></description>
			<content:encoded><![CDATA[<p>这多半是因为系统上的各种日志长期积累下来的结果，比如 nginx, apache 等留下来的访问日志信息长时间不清理、而且访问量大的话会很容易就膨胀到 GB；有时候某种应用程序的日志藏在文件系统的深处，不易发觉；有时候自己拷贝了一些大文件放在某个地方时间长了就忘了。那么如何在 Linux 系统上找到这些占用硬盘空间的文件呢？<br />
<span id="more-1690"></span><br />
首先我们可以统计一下根目录下各个目录占用硬盘的情况，找出最占用硬盘的那个目录：</p>
<pre># du -sh /*
6.2M	/bin
17M	/boot
136K	/dev
97M	/etc
147G	/home
584M	/lib
16M	/lib64
16K	/lost+found
8.0K	/media
12K	/mnt
252K	/opt
0	/proc
1.7G	/root
28M	/sbin
8.0K	/selinux
3.1M	/srv
0	/sys
20K	/tmp
1.9G	/usr
748M	/var</pre>
<p>从上面可看出 /home 占用了最多的硬盘，我们去看看 /home 下哪些用户占用了最多的空间：</p>
<pre># du -sh /home/*
4.0K	/home/bak
106M	/home/cos
28K	/home/guest
16K	/home/lost+found
105G	/home/vpsee
33G	/home/somebody
8.2G	/home/abc</pre>
<p>可以看到 vpsee 这个用户和他的 home 目录 /home/vpsee 用掉了最多的硬盘（105GB），我们再看看 /home/vpsee 下究竟哪些文件占用了空间，用下面的一行命令找出某个目录下（这里是 /home/vpsee）大小超过 500MB 的文件（打印前40行并按照 MB 从小到大排列）：</p>
<pre># find /home/vpsee -printf "%k %p\n" | sort -g -k 1,1 | \
awk '{if($1 &gt; 500000) print $1/1024 "MB" " " $2 }' |tail -n 40

647.68MB  /home/vpsee/linux/debian-504-amd64-CD-1.iso
675.664MB /home/vpsee/linux/Fedora-13-i686-Live.iso
677.656MB /home/vpsee/unix/osol-0906-x86.iso
678.172MB /home/vpsee/linux/ubuntu-10.04-server-amd64.iso
700.133MB /home/vpsee/linux/ubuntu-10.04-desktop-i386.iso
1304.64MB /home/vpsee/mac/MacTeX.mpkg.zip</pre>
<p>可以看到 /home/vpsee 是个 iso 收藏狂，收了一堆 Linxu ISO 安装文件，以前拨号上网时代大家都喜欢收集一些软件和工具存在硬盘里，现在网络这么发达，这些旧习惯已经没必要了，ISO 文件可有可无，需要的时候就去下一个最新的，用不着自己保留，网络就是我们的硬盘。</p>
<p>摘自 http://www.vpsee.com/2010/08/what-is-using-my-disk-space-up/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/what-is-vps-ate-my-hard-drive.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mb_strimwidth() 函数不可用 解决办法</title>
		<link>http://www.xiumu.org/technology/mb_strimwidth-han-shu-bu-ke-yong-jie-jue-ban-fa.shtml</link>
		<comments>http://www.xiumu.org/technology/mb_strimwidth-han-shu-bu-ke-yong-jie-jue-ban-fa.shtml#comments</comments>
		<pubDate>Wed, 01 Feb 2012 14:21:29 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1676</guid>
		<description><![CDATA[强烈推荐mb_strimwidth() 函数进行截断，对于中文用户来说，这个函数是相当实用的，因为很多摘要的方法都会把中文字截断出乱码，因为中文字在 UTF-8 编码下占三个长度，是一个很尴尬的数字。8过，并不是所有主机都默认支持这个函数的，前提是要开启 mb_string 这个模块。那如果主机没有开启 mb_string 就不能使用 mb_strimwidth() 函数了吗？有没有变通的办法呢？答案当然是 YES，于是也就有了本文。 先在 WordPress 主题的 functions.php 文件中添加如下代码： function dm_strimwidth($str ,$start , $width ,$trimmarker ){ $output = preg_replace('/^(?:[\x00-\x7F]&#124;[\xC0-\xFF][\x80-\xBF]+){0,'.$start.'}((?:[\x00-\x7F]&#124;[\xC0-\xFF][\x80-\xBF]+){0,'.$width.'}).*/s','\1',$str); return $output.$trimmarker; } 接下来在需要的地方调用如下： echo dm_strimwidth(strip_tags($post-&#62;post_content),0,200,'&#60;a href="'.get_permalink().'"&#62;......[阅读全文]&#60;/a&#62;'); 用过 mb_strimwidth() 函数的朋友已经发现了，这个新建的函数和 mb_strimwidth() 的用法是一模一样的，如果你的主机不支持 mb_string 扩展库，那可以试试本文的方法。]]></description>
			<content:encoded><![CDATA[<p>强烈推荐mb_strimwidth() 函数进行截断，对于中文用户来说，这个函数是相当实用的，因为很多摘要的方法都会把中文字截断出乱码，因为中文字在 UTF-8 编码下占三个长度，是一个很尴尬的数字。8过，并不是所有主机都默认支持这个函数的，前提是要开启 mb_string 这个模块。那如果主机没有开启 mb_string 就不能使用 mb_strimwidth() 函数了吗？有没有变通的办法呢？答案当然是 YES，于是也就有了本文。</p>
<p>先在 WordPress 主题的 functions.php 文件中添加如下代码：</p>
<pre lang="php">function dm_strimwidth($str ,$start , $width ,$trimmarker ){
    $output = preg_replace('/^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$start.'}((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$width.'}).*/s','\1',$str);
    return $output.$trimmarker;
}</pre>
<p>接下来在需要的地方调用如下：</p>
<pre lang="php">echo dm_strimwidth(strip_tags($post-&gt;post_content),0,200,'&lt;a href="'.get_permalink().'"&gt;......[阅读全文]&lt;/a&gt;');</pre>
<p>用过 mb_strimwidth() 函数的朋友已经发现了，这个新建的函数和 mb_strimwidth() 的用法是一模一样的，如果你的主机不支持 mb_string 扩展库，那可以试试本文的方法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/mb_strimwidth-han-shu-bu-ke-yong-jie-jue-ban-fa.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 修改文件所有者-备忘</title>
		<link>http://www.xiumu.org/technology/linux-change-the-file-owner-memo.shtml</link>
		<comments>http://www.xiumu.org/technology/linux-change-the-file-owner-memo.shtml#comments</comments>
		<pubDate>Thu, 15 Dec 2011 06:12:22 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1638</guid>
		<description><![CDATA[#chown -R user.group /dir]]></description>
			<content:encoded><![CDATA[<pre lang="php">#chown -R user.group /dir</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/linux-change-the-file-owner-memo.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>修改MySQL自增字段(auto_increment)默认值</title>
		<link>http://www.xiumu.org/technology/modify-the-mysql-auto-increment-field-auto_increment-default.shtml</link>
		<comments>http://www.xiumu.org/technology/modify-the-mysql-auto-increment-field-auto_increment-default.shtml#comments</comments>
		<pubDate>Mon, 29 Aug 2011 13:34:46 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1633</guid>
		<description><![CDATA[在MySQL中一个表table_a中的ID字段设为auto_increment 插入两条记录后ID=2,这时删除1条记录，再插入一条变成 ID 1 3 自增时跳过了2，如何设置在新插入一条时，ID从2开始计数 解决办法： alter table test auto_increment=2; 可以使再新加入一条时，ID从2开始。 如果auto_increment=值小于max(id)，ID从max(ID)+1开始计数]]></description>
			<content:encoded><![CDATA[<p>在MySQL中一个表table_a中的ID字段设为auto_increment<br />
插入两条记录后ID=2,这时删除1条记录，再插入一条变成<br />
ID<br />
1<br />
3<br />
自增时跳过了2，如何设置在新插入一条时，ID从2开始计数</p>
<p>解决办法：</p>
<pre lang="mysql">
alter table test auto_increment=2;
</pre>
<p>可以使再新加入一条时，ID从2开始。<br />
如果auto_increment=值小于max(id)，ID从max(ID)+1开始计数</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/modify-the-mysql-auto-increment-field-auto_increment-default.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>屏蔽河北联通（网通）ADSL用户强制广告</title>
		<link>http://www.xiumu.org/technology/shielding-hebei-unicom-cnc-adsl-users-forced-ads.shtml</link>
		<comments>http://www.xiumu.org/technology/shielding-hebei-unicom-cnc-adsl-users-forced-ads.shtml#comments</comments>
		<pubDate>Thu, 25 Aug 2011 17:04:46 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1626</guid>
		<description><![CDATA[联通这次广告弹出几率修改的太大，利益熏心也不能置客户的利益不顾啊，多次投诉无果，伤透了 解决办法： 进入 C:\WINDOWS\system32\drivers\etc 目录，使用记事本编辑HOST文件，将以下代码加入文件底部并保存。 #屏蔽河北联通强制广告 127.0.0.1 hbinfo4.cnc114dns.com.cn 127.0.0.1 hbinfo3.cnc114dns.com.cn 127.0.0.1 hbinfo2.cnc114dns.com.cn 127.0.0.1 hbinfo1.cnc114dns.com.cn 127.0.0.1 hbinfo5.cnc114dns.com.cn 127.0.0.1 hbinfo6.cnc114dns.com.cn 127.0.0.1 hbinfo7.cnc114dns.com.cn 127.0.0.1 hbinfo8.cnc114dns.com.cn 127.0.0.1 hbinfo9.cnc114dns.com.cn 127.0.0.1 hbinfo10.cnc114dns.com.cn 127.0.0.1 hbdns1.cncmax.cn 127.0.0.1 hbdns2.cncmax.cn 127.0.0.1 hbdns3.cncmax.cn 127.0.0.1 hbdns4.cncmax.cn 127.0.0.1 hbdns5.cncmax.cn 127.0.0.1 hbdns6.cncmax.cn 127.0.0.1 hbdns7.cncmax.cn 127.0.0.1 hbdns8.cncmax.cn 127.0.0.1 hbdns9.cncmax.cn 127.0.0.1 hbdns10.cncmax.cn #屏蔽河北联通DNS解析失败跳转广告 127.0.0.1 hbdnserror4.wo.com.cn 打开360网盾设置 添加网址黑名单输入http://221.193.206.100/、http://focus.inhe.net/tuisong/，确定保存即可。 更新360网盾广告规则，直接导入启用即可！下载链接：河北联通强制广告]]></description>
			<content:encoded><![CDATA[<p>联通这次广告弹出几率修改的太大，利益熏心也不能置客户的利益不顾啊，多次投诉无果，伤透了</p>
<p>解决办法：<br />
进入 C:\WINDOWS\system32\drivers\etc 目录，使用记事本编辑HOST文件，将以下代码加入文件底部并保存。</p>
<pre lang="php" line="1">
#屏蔽河北联通强制广告
127.0.0.1       hbinfo4.cnc114dns.com.cn
127.0.0.1       hbinfo3.cnc114dns.com.cn
127.0.0.1       hbinfo2.cnc114dns.com.cn
127.0.0.1       hbinfo1.cnc114dns.com.cn
127.0.0.1       hbinfo5.cnc114dns.com.cn
127.0.0.1       hbinfo6.cnc114dns.com.cn
127.0.0.1       hbinfo7.cnc114dns.com.cn
127.0.0.1       hbinfo8.cnc114dns.com.cn
127.0.0.1       hbinfo9.cnc114dns.com.cn
127.0.0.1       hbinfo10.cnc114dns.com.cn
127.0.0.1       hbdns1.cncmax.cn
127.0.0.1       hbdns2.cncmax.cn
127.0.0.1       hbdns3.cncmax.cn
127.0.0.1       hbdns4.cncmax.cn
127.0.0.1       hbdns5.cncmax.cn
127.0.0.1       hbdns6.cncmax.cn
127.0.0.1       hbdns7.cncmax.cn
127.0.0.1       hbdns8.cncmax.cn
127.0.0.1       hbdns9.cncmax.cn
127.0.0.1       hbdns10.cncmax.cn
#屏蔽河北联通DNS解析失败跳转广告
127.0.0.1       hbdnserror4.wo.com.cn
</pre>
<p>打开360网盾设置 添加网址黑名单输入<strong>http://221.193.206.100/</strong>、<strong>http://focus.inhe.net/tuisong/</strong>，确定保存即可。</p>
<p><img src="http://www.xiumu.org/blog-uploads/2011/08/adslad.gif" alt="" title="360拦截图示" width="407" height="314" class="aligncenter size-full wp-image-1630" /></p>
<p><b style="color:red;">更新360网盾广告规则，直接导入启用即可！下载链接：<a href='http://www.xiumu.org/blog-uploads/2011/08/13150623803401.xml_.zip'>河北联通强制广告</a></b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/shielding-hebei-unicom-cnc-adsl-users-forced-ads.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>手工释放linux内存</title>
		<link>http://www.xiumu.org/technology/manually-release-the-memory-linux.shtml</link>
		<comments>http://www.xiumu.org/technology/manually-release-the-memory-linux.shtml#comments</comments>
		<pubDate>Mon, 22 Aug 2011 05:41:52 +0000</pubDate>
		<dc:creator>朽木</dc:creator>
				<category><![CDATA[技术随笔]]></category>

		<guid isPermaLink="false">http://www.xiumu.org/?p=1619</guid>
		<description><![CDATA[总有很多朋友对于Linux的内存管理有疑问。而在新版核心中，似乎对这个问题提供了新的解决方法，特转出来给大家参考一下。最后，还附上我对这方法的意见，欢迎各位一同讨论。 当在Linux下频繁存取文件后，物理内存会很快被用光，当程序结束后，内存不会被正常释放，而是一直作为caching。这个问题，貌似有不少人在问，不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题。 一、通常情况 先来说说free命令： 引用 [root@server ~]# free -m total used free shared buffers cached Mem: 249 163 86 0 10 94 -/+ buffers/cache: 58 191 Swap: 511 0 511 其中： 引用 total 内存总数 used 已经使用的内存数 free 空闲的内存数 shared 多个进程共享的内存总额 buffers Buffer Cache和cached Page Cache 磁盘缓存的大小 -buffers/cache 的内存数:used &#8211; buffers &#8211; cached +buffers/cache 的内存数:free + [...]]]></description>
			<content:encoded><![CDATA[<p>总有很多朋友对于Linux的内存管理有疑问。而在新版核心中，似乎对这个问题提供了新的解决方法，特转出来给大家参考一下。最后，还附上我对这方法的意见，欢迎各位一同讨论。<br />
当在Linux下频繁存取文件后，物理内存会很快被用光，当程序结束后，内存不会被正常释放，而是一直作为caching。这个问题，貌似有不少人在问，不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题。<span id="more-1619"></span></p>
<p>一、通常情况<br />
先来说说free命令：<br />
引用<br />
[root@server ~]# free -m<br />
total used free shared buffers cached<br />
Mem: 249 163 86 0 10 94<br />
-/+ buffers/cache: 58 191<br />
Swap: 511 0 511</p>
<p>其中：<br />
引用<br />
total 内存总数<br />
used 已经使用的内存数<br />
free 空闲的内存数<br />
shared 多个进程共享的内存总额<br />
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小<br />
-buffers/cache 的内存数:used &#8211; buffers &#8211; cached<br />
+buffers/cache 的内存数:free + buffers + cached</p>
<p>可用的memory=free memory+buffers+cached。</p>
<p>有了这个基础后，可以得知，我现在used为163MB，free为86MB，buffer和cached分别为10MB，94MB。<br />
那么我们来看看,如果我执行复制文件,内存会发生什么变化.<br />
引用<br />
[root@server ~]# cp -r /etc ~/test/<br />
[root@server ~]# free -m<br />
total used free shared buffers cached<br />
Mem: 249 244 4 0 8 174<br />
-/+ buffers/cache: 62 187<br />
Swap: 511 0 511</p>
<p>在我命令执行结束后，used为244MB，free为4MB，buffers为8MB，cached为174MB，天呐，都被cached吃掉了。别紧张，这是为了提高文件读取效率的做法。</p>
<p>为了提高磁盘存取效率，Linux做了一些精心的设计，除了对dentry进行缓存（用于VFS，加速文件路径名到inode的转换），还采取了两种主要Cache方式：Buffer<br />
Cache和Page<br />
Cache。前者针对磁盘块的读写，后者针对文件inode的读写。这些Cache有效缩短了<br />
I/O系统调用（比如read，write，getdents）的时间。</p>
<p>那么有人说过段时间，linux会自动释放掉所用的内存。等待一段时间后，我们使用free再来试试，看看是否有释放？<br />
引用<br />
[root@server test]# free -m<br />
total used free shared buffers cached<br />
Mem: 249 244 5 0 8 174<br />
-/+ buffers/cache: 61 188<br />
Swap: 511 0 511</p>
<p>似乎没有任何变化。（实际情况下，内存的管理还与Swap有关）</p>
<p>那么我能否手动释放掉这些内存呢？回答是可以的！</p>
<p>二、手动释放缓存<br />
/proc是一个虚拟文件系统，我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件，来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下：<br />
引用<br />
[root@server test]# cat /proc/sys/vm/drop_caches<br />
0</p>
<p>首先，/proc/sys/vm/drop_caches的值，默认为0。<br />
引用<br />
[root@server test]# sync</p>
<p>手动执行sync命令（描述：sync 命令运行 sync<br />
子例程。如果必须停止系统，则运行sync 命令以确保文件系统的完整性。sync<br />
命令将所有未写的系统缓冲区写到磁盘中，包含已修改的 i-node、已延迟的块 I/O<br />
和读写映射文件）<br />
引用<br />
[root@server test]# echo 3 > /proc/sys/vm/drop_caches<br />
[root@server test]# cat /proc/sys/vm/drop_caches<br />
3</p>
<p>将/proc/sys/vm/drop_caches值设为3<br />
引用<br />
[root@server test]# free -m<br />
total used free shared buffers cached<br />
Mem: 249 66 182 0 0 11<br />
-/+ buffers/cache: 55 194<br />
Swap: 511 0 511</p>
<p>再来运行free命令，会发现现在的used为66MB，free为182MB，buffers为0MB，cached为11MB。那么有效的释放了buffer和cache。</p>
<p>◎ 有关/proc/sys/vm/drop_caches的用法在下面进行了说明<br />
引用<br />
/proc/sys/vm/drop_caches (since Linux 2.6.16)<br />
Writing to this file causes the kernel to drop clean caches,<br />
dentries and inodes from memory, causing that memory to become<br />
free.</p>
<p>To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to<br />
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;<br />
to free pagecache, dentries and inodes, use echo 3 ><br />
/proc/sys/vm/drop_caches.</p>
<p>Because this is a non-destructive operation and dirty objects<br />
are not freeable, the user should run sync first.</p>
<p>三、我的意见<br />
上述文章就长期以来很多用户对Linux内存管理方面的疑问，给出了一个比较”直观”的回复，我更觉得有点像是核心开发小组的妥协。<br />
对于是否需要使用这个值，或向用户提及这个值，我是有保留意见的：<br />
引用<br />
1、从man可以看到，这值从2.6.16以后的核心版本才提供，也就是老版的操作系统，如红旗DC<br />
5.0、RHEL 4.x之前的版本都没有；<br />
2、若对于系统内存是否够用的观察，我还是原意去看swap的使用率和si/so两个值的大小；</p>
<p>用户常见的疑问是，为什么free这么小，是否关闭应用后内存没有释放？<br />
但实际上，我们都知道这是因为Linux对内存的管理与Windows不同，free小并不是说内存不够用了，应该看的是free的第二行最后一个值：<br />
引用<br />
-/+ buffers/cache: 58 191</p>
<p>这才是系统可用的内存大小。<br />
实际项目中告诉我们，如果因为是应用有像内存泄露、溢出的问题，从swap的使用情况是可以比较快速可以判断的，但free上面反而比较难查看。<br />
相反，如果在这个时候，我们告诉用户，修改系统的一个值，”可以”释放内存，free就大了。用户会怎么想？不会觉得操作系统”有问题”吗？<br />
所以说，我觉得既然核心是可以快速清空buffer或cache，也不难做到（这从上面的操作中可以明显看到），但核心并没有这样做（默认值是0），我们就不应该随便去改变它。<br />
一般情况下，应用在系统上稳定运行了，free值也会保持在一个稳定值的，虽然看上去可能比较小。<br />
当发生内存不足、应用获取不到可用内存、OOM错误等问题时，还是更应该去分析应用方面的原因，如用户量太大导致内存不足、发生应用内存溢出等情况，否则，清空buffer，强制腾出free的大小，可能只是把问题给暂时屏蔽了。</p>
<p>我觉得，排除内存不足的情况外，除非是在软件开发阶段，需要临时清掉buffer，以判断应用的内存使用情况；或应用已经不再提供支持，即使应用对内存的时候确实有问题，而且无法避免的情况下，才考虑定时清空buffer。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiumu.org/technology/manually-release-the-memory-linux.shtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

