<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[榨干服务器：让进程运行在指定的CPU]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Sat, 24 Sep 2011 08:00:50 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	我的Linode十分繁忙，在跑一些密集操作数据库的Rake任务时尤其如此。但我观察发现，Linode服务器的4核CPU，只有第1个核心（CPU#0）非常忙，其他都处于idle状态。<br/><br/>不了解Linux是如何调度的，但在Linode的这种状态下，显然有优化的余地。除了处理正常任务，CPU#0还需要处理各种中断。因此，若能将CPU#0分担的任务摊派到其他CPU核心上，可以预见，系统的处理能力将有更大的提升。<br/><br/>两个名词<br/><br/><strong>SMP</strong> (Symmetrical Multi-Processing)：指在一个计算机上汇集了一组处理器(多CPU)，各CPU之间共享内存子系统以及总线结构。<br/><br/><strong>CPU affinity</strong>：中文唤作“CPU亲和力”，是指在CMP架构下，能够将一个或多个进程绑定到一个或多个处理器上运行。<br/><br/><strong>一、在Linux上修改进程的“CPU亲和力”</strong><br/>在Linux上，可以通过 taskset 命令进行修改。以Ubuntu为例，运行如下命令可以安装taskset工具。<br/><br/># apt-get install schedutils对运行中的进程，文档上说可以用下面的命令，把CPU#1 #2 #3分配给PID为2345的进程：<br/><br/># taskset -cp 1,2,3 2345但我尝试没奏效，于是我关掉了MySQL，并用taskset将它启动：<br/><br/># taskset -c 1,2,3 /etc/init.d/mysql start对于其他进程，也可如此处理（nginx除外，详见下文）。之后用top查看CPU的使用情况，原来空闲的#1 #2 #3，已经在辛勤工作了。<br/><a href="http://www.dzhope.com/attachment.php?fid=58" target="_blank"><img src="http://www.dzhope.com/attachment.php?fid=58" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><strong>二、配置nginx绑定CPU</strong><br/>刚才说nginx除外，是因为nginx提供了更精确的控制。<br/><br/>在conf/nginx.conf中，有如下一行：<br/><br/>worker_processes&nbsp;&nbsp;1;这是用来配置nginx启动几个工作进程的，默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项，也就是说，nginx可以为每个工作进程绑定CPU。我做了如下配置：<br/><br/>worker_processes&nbsp;&nbsp;3;<br/>worker_cpu_affinity 0010 0100 1000;这里0010 0100 1000是掩码，分别代表第2、3、4颗cpu核心。<br/><br/>重启nginx后，3个工作进程就可以各自用各自的CPU了。<br/><br/>三、刨根问底<br/><br/>1.如果自己写代码，要把进程绑定到CPU，该怎么做？可以用sched_setaffinity函数。在Linux上，这会触发一次系统调用。<br/>2.如果父进程设置了affinity，之后其创建的子进程是否会有同样的属性？我发现子进程确实继承了父进程的affinity属性（其实用taskset启动进程就是一次fork+exec）。<br/>四、Windows？<br/><br/>在Windows上修改“CPU亲和力”，可以通过任务管理器搞定。<br/><br/><a href="http://www.dzhope.com/attachment.php?fid=59" target="_blank"><img src="http://www.dzhope.com/attachment.php?fid=59" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><a href="http://www.dzhope.com/attachment.php?fid=60" target="_blank"><img src="http://www.dzhope.com/attachment.php?fid=60" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>* 个人感觉，Windows系统中翻译的“处理器关系”比“CPU亲和力”容易理解点儿<br/><br/>—————–<br/><br/>进行了这样的修改后，即使系统负载达到3以上，不带缓存打开blogkid.net首页（有40多次查询）依然顺畅；以前一旦负载超过了1.5，响应就很慢了。效果很明显。<br/><br/><br/><br/><br/><br/>Tags - <a href="http://www.dzhope.com/tags/nginx/" rel="tag">nginx</a> , <a href="http://www.dzhope.com/tags/cpu/" rel="tag">cpu</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 榨干服务器：让进程运行在指定的CPU]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>