“memcached全面剖析”笔记

December 3rd, 2010 by Dream☆Wing 1 comment »

1. 现在的memcached规格中,键长度最大为250字节,但二进制协议中键的大小用2字节表示。因此,理论上最大可使用65536字节(2的16次方)长的键。尽管250字节以上的键并不会太常用,二进制协议发布之后就可以使用巨大的键了。
二进制协议从版本1.3系列开始支持,memcached最新的版本为1.4.5

2. memcached默认采用slab allocation机制分配、整理内存,其基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块(chunk),以完全解决内存碎片问题。

2.5 slab allocation术语介绍
slab(有时又写作page):分配给slab的内存空间,默认是1M。分配给slab后根据slab的大小切分成chunk。
chunk:用于缓存记录的内存空间。
slab class:特定大小的slab组(所有在slab class中的slab拥有同样大小的chunk)

3. slab allocation可以重复使用已分配的内存,分配到的内存不会释放,而是重复利用。

4. slab allocation的缺点是由于分配的是特定长度的内存,因此无法有效利用分配的内存,将100字节的数据缓存到128字节的chunk中,就有28字节浪费了。
比较好的调优方案是计算预先客户端的数据大小,采用合适的chunk大小分组,调整chunk大小方法见第5点

5. chunk大小分组的方法:memcached -f 2,其中-f是growth factor因子,默认为1.25,曾经为2,即每个chunk划分的大小是前一个chunk大小的f倍。
按照计算的数据预期长度来调节growth factor值

6. 连接上memcached(可以用telnet连接),输入stats可以查看memcached状态,stats slabs或者stats items可以获得关于缓存的信息,quit退出。

7. 关于memcached分布式
7.1 根据余数进行打散:mc key的hash值(crc32等)/服务器台数,无法连接时将连接次数添加到key后面,rehash后再连接
余数打散法优点:方法简单,数据分散性也很优秀。
缺点:当添加/移除服务器时,缓存重组的代价相当巨大,缓存命中率明显下降。

7.2 mixi采用的Consistent Hashing分布法:首先求出memcached服务器(节点)的hash值,并将其配置到0~2的32次方的圆上,然后用同样的方法求出mc key的hash值,并映射到圆上。然后从数据映射的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2的32次方仍然找不到服务器,就会保存到第一台memcached服务器上。
优点:当添加服务器时,只有这台服务器添加位置的逆时针方向的第一台服务器上的key会受到影响,最大程序抑制了key的重新分布。

*而且,有的Consistent Hashing实现方法还采用了虚拟节点的思想。使用一般hash函数的话,服务器的映射地点非常不均匀。因此,使用虚拟节点的思想,为每个服务器在圆上虚拟分配100~200个点。这样就能抑制分布不均匀,最大限度减少服务器增减时的缓存重新分布。

8. last.fm开发了一个支持Consistent Hashing的PHP库,名为ketama

9. memcached进程的实际内存分配量要比指定的容量要大,因为启动指定的只是用于数据保存的内存大小,并不包括slab allocation本身占用的内存以及为保存数据而设置的管理空间等。

10. memcached内存分配量尽量不要超过3G(即使是64位的4G内存的服务器),因有可能造成内存交换(swap)

11. 将与memcache的连接保持在进程中,以减少TCP连接的开销。

12. 如果不支持连接失败的rehash功能,则最好限制连接失败后指定时间内不要再连接该失败的服务器。

13. 将所有共享/公用的缓存数据设置类命名空间,将该命名空间下的key保存到多台memcached服务器中,取得时从中仅选取一台即可。

14. daemontools可以监视memcached进程的停止并自动启动。

15. nagios监视memcached的get、add动作,也可以监视stats

16. rrdtool将stats目录转化成图形,进行性能监视

PDF下载地址:http://tech.idv2.com/2008/08/17/memcached-pdf/

  • Share/Save/Bookmark

能者多劳

October 20th, 2010 by Dream☆Wing No comments »

  • Share/Save/Bookmark

php使用exec调用svn进行update注意事项

October 15th, 2010 by Dream☆Wing No comments »

命令如下:
$output = array();
$command = “svn up $file”;
exec($command, $output);
结果$output仍为空array()

修改如下:
$command = “svn up $file 2>&1″;
提示warning: Can’t open file ‘/root/.subversion/servers’: Permission denied

再次修改如下:
$command = “svn up $file –config-dir /home/www/.subversion 2>&1″;
OK了

  • Share/Save/Bookmark

smarty3的一些实用的新特性

October 14th, 2010 by Dream☆Wing No comments »

表达式

支持更加随意的表达式

{$x+$y}                           输入x和y的和
{$foo = strlen($bar)}             变量支持PHP函数
{assign var=foo value= $x+$y}     属性支持表达式
{$foo = myfunct( ($x+$y)*3 )}     函数参数支持表达式
{$foo[$x+3]}                      数组下表支持表达式


可以在Smarty标签使用其他标签的值
{$foo="this is message {counter}"}

可以在双引号里使用Smarty标签

{$foo="this is message {counter}"}

双引号中可以使用变量,也可以使用Smarty标签

{$foo="this is message $counter"}

{func var="test $foo test"} // 同$foo
{func var="test $foo_bar test"} // 同$foo_bar
{func var="test `$foo[0]` test"} // 同$foo[0]
{func var="test `$foo[bar]` test"} // 同$foo[bar]
{func var="test $foo.bar test"} // 同$foo (而不是$foo.bar)
{func var="test `$foo.bar` test"} // 同$foo.bar
{func var="test `$foo.bar` test"|escape} // 引号外加修饰符
{func var="test {$foo|escape} test"} // 引号内加修饰符
{func var="test {time()} test"} // 调用PHP方法
{func var="test {counter} test"} // 调用插件返回值
{func var="variable foo is {if !$foo}not {/if} defined"} // 调用Smarty block方法

{* 将会替换$tpl_name为对应的值*}
{include file="subdir/$tpl_name.tpl"}
{* 不会替换$tpl_name *}
{include file='subdir/$tpl_name.tpl'} // 变量需要用双引号才可以解析!
{* 用点号"."的话必须加反引号 *}
{cycle values="one,two,`$smarty.config.myval`"}
{* 用点号"."的话必须加反引号 *}
{include file="`$module.contact`.tpl"}
{* 用点号语法可以使用变量 *}
{include file="`$module.$view`.tpl"}

可以在模板里头定义数组

{assign var=foo value=[1,2,3]}
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
{assign var=foo value=[1,[9,8],3]}   数组可以嵌套

简单的变量赋值

{$foo=$bar+2}

可以给指定的数组元素赋值,如果变量存在但不是数组,会先转换成数组,再进行赋值
{$foo['bar']=1}
{$foo['bar']['blar']=1}

同上,可以给数组添加值

{$foo[]=1}

点号.功能更强大:支持变量索引、支持表达式索引、支持嵌套索引
{$foo.a.b.c}        =>  $foo['a']['b']['c']
{$foo.a.$b.c}       =>  $foo['a'][$b]['c']        支持变量索引
{$foo.a.{$b+4}.c}   =>  $foo['a'][$b+4]['c']       支持表达式索引
{$foo.a.{$b.c}}     =>  $foo['a'][$b['c']]         支持嵌套索引

变量名中支持变量

$foo         一个普通的变量
$foo_{$bar}  变量名中包含变量
$foo_{$x+$y} 变量名中可以支持表达式
$foo_{$bar}_buh_{$blar}  变量名包含多个变量
{$foo_{$x}}  如果$x是1,则输出$foo_1

支持对象链,即是对象方法的连续调用,很像jquery

{$object->method1($x)->method2($y)}

{for}标签支持类似loop一样的循环

{for $x=0, $y=count($foo); $x<$y; $x++}  ....  {/for}

在FOR循环中可以通过如下特殊标示符限定位置:

$x@iteration  当前循环次数
$x@total     总循环次数
$x@first  循环第一次
$x@last     循环最后一次

新的foreach语法

{foreach $myarray as $var}...{/foreach}

同样是foreach里头的特殊表示符,看的就明白,不翻译了……

$var@key            foreach $var array key
$var@iteration      foreach current iteration count (1,2,3...)
$var@index          foreach current index count (0,1,2...)
$var@total          foreach $var array total
$var@first          true on first iteration
$var@last           true on last iteration

支持while循环

{while $foo}...{/while}
{while $x lt 10}...{/while}

可以直接使用PHP的函数

{time()}

支持将字符串作为模板显示:使用string的资源类型即可:
$smarty->display('string:This is my template, {$foo}!'); // php
{include file="string:This is my template, {$foo}!"} // template
支持纯php的模板:完全以php语法书写的模板,调用时使用php的资源类型即可:$smarty->display(‘php:foo.php’);
当然也可以{include file=”php:foo.php”},
不过在纯php的模板中是无法调用smarty的modifier/function的,以后的版本也许会考虑封装

模板继承:类似类的继承,可以继承父模板文件,同时重载父模板中相同name的{block}区块内容
静态类,命名空间的支持:可以这样注册一个静态类,其中命名空间可选
$smarty->register->templateClass(‘foo’,'name\name2\myclass’);
在模板中调用:
{foo::method()}

参考:http://www.emptykid.com/blog/archives/133

http://shameerc.wordpress.com/2010/10/06/an-introduction-to-smarty-3/

  • Share/Save/Bookmark

玄霄之歌

September 23rd, 2010 by Dream☆Wing No comments »

很给力呵呵

  • Share/Save/Bookmark