TokyoTyrant调谐参数之 xmsiz

不同的情景适合不同的参数,我们的场景是读写比例2:1, 写操作高峰时间为 6000/s ;资源为 2台8核16G内存机器。每台机器 6 * 149G的磁盘做了raid10。

每台机器2个端口,每个端口数据文件为5G; 存储方式为 .tch ; 没有任何调谐参数时, 每个端口处理写操作量为:
200~400/s ; 添加调谐参数 #xmsiz=5242880000 后, 每个端口处理写操作量为:
1000~2000/s ;  速度整整提高了原来的4倍。

关于负载的比较(只取了部分时间点来比较):
调整参数前:
sar  -f /var/log/sa/sa05

调整参数后:
sar  -f /var/log/sa/sa06

关于磁盘的读写数据的变化,因为没有sar没有收集,这里就不能给出了

关于页面的换入换出的比较:
调整参数前:
sar -B -f /var/log/sa/sa05

调整参数后:
sar -B -f /var/log/sa/sa06

可以看到,页面的换入换出明显减少了大约一半, 或许你发现了fault变多了,这也是使用了mmap的缘故,具体需要了解一下mmap了。

关于mmap
因为tc是从文件的开始固定地map文件的一段区域的,所以,如果map的那段区域如果慢慢变冷的话,这样的map也就变的没有意义了;或者文件太大,能map到内存的也不过1/10或者更少,则map的意义也是很小的,故要根据实际情况来选择之。
如果tc能聪明地选择map热数据的话,自然是件好事,但是目前确实还没有这么做,而且其升级版kc也没有这么做,至少到1.2.70版本是没有这么做的。

TokyoTyrant的全内存存储不支持压缩

最近由于使用TokyoTyrant的全内存存储方式导致内存吃紧,于是突然想到TokyoTyrant支持压缩存储,抱着试一试的态度,看看内存存储是不是也能压缩;测试了一下发现似乎没有压缩,看了一下代码,如下图:

不解释了,意思就是说内存型的不支持压缩,其实也可以理解

mysql中的datetime 与 timestamp

MMAP 与 SHR

一直不太清楚Linux top命令中的SHR字段究竟都包含了些什么,前些天了解了一下MMAP,今天猜想MMAP申请的内存应该会算到SHR头上的吧,下面写了一个脚本测试了一下:

 

代码写的比较差,不过只是为了说明问题而已,没有太多时间来写这些东西,这里仅仅记录一下,有时间再整理。

匿名的mmap:

 

区别于上面的代码的部分:
1. 不需要再打开一个fd
2. mmap调用时使用 MAP_ANONYMOUS 这个flag,有了这个flag,就会忽略fd参数,但是也有的实现依然要求fd参数为-1

 

mmap中lock到内存的部分好像也不是绝对的lock: https://blog.csdn.net/lotluck/article/details/81632071

ecshop模板引擎学习

ecshop模板引擎比较简单,相对于smarty要轻量多了,她的实现不到1500行的代码,一个文件搞定。
参考ecshop模板引擎的文档时,里面提到了 {if $num is odd} 的语法,觉得这个语法不错,就尝试了一下,结果失败,查看了一下模板引擎的代码,发现该语法不知道什么时候已经没有了,出于好奇,简单看了一下语法解析的实现,可以通过简单的hack来添加该语法。
在cls_template.php 的 _compile_if_tag 函数中添加如下分支:

 
  1. <?php
  2.                 case ‘is’:
  3.                     $token = ‘%’;
  4.                     $i++;
  5.                     if($tokens[$i] == ‘odd’) {
  6.                         $tokens[$i] = ‘2 == 0’;
  7.                     }else if($tokens[$i] == ‘even’) {
  8.                         $tokens[$i] = ‘2 == 1’;
  9.                     }else {
  10.                         throw new exception("is odd or is even");
  11.                     }
  12.                     break;
  13. ?>

当然,这里只共学习之用,随便hack别人的代码是不好的。

关于unix的历史(点滴)

要想学好linux就要了解unix,聊了解unix就要了解unix的历史,否则很多名词不知道啥意思; 今天从mmap开始,出现了System V(http://baike.baidu.com/view/1503404.htm);
System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支。 又一次遇到了AT&T, 以前遇到就当没看见,这次就了解一下吧; 发现这个100多年历史的公司最初居然是贝尔创建的,而所谓的“贝尔实验室”也是这个公司的一个机构,难怪很多计算机方面的东西总要和AT&T最终老跟扯上一些关系。

system-v: http://baike.baidu.com/view/1503404.htm
关于unix: http://baike.baidu.com/view/8095.htm
关于AT&T: http://baike.baidu.com/view/259956.htm

tar:从压缩包中解压出指定文件

如果你下载了一个压缩包,虽然本身不是很大,但是解压后会很大;可是你并不会去看里面所有的文件,而是只看具体的某一个或几个文件而已,这时你的磁盘空间有很有限,于是你很想只解压指定的文件,于是下面命令就可以用上了。
1. tar -ztf xx.tar.gz | grep file_you_want_to_get
看看你要解压的文件的具体路径,假设为 path/to/file

2. tar -zxf xx.tar.gz path/to/file
然后,你要的file就放到了path/to 目录下了

例如:
>tar -ztf glibc-2.9.tar.gz | grep ldconfig.c
glibc-2.9/elf/ldconfig.c

>tar -zxf glibc-2.9.tar.gz glibc-2.9/elf/ldconfig.c

关于PHP的memcache模块的get、delete方法的patch

patch原因:

解决get、delete方法无法区分连接失败和not found的问题

patch内容

本次修改是在memcache-2.2.6 的基础上修改的,我把她修改版本号为 2.2.6.1来使用了,

patch 文件:

patch说明

修改的地方如下:

1. 添加参数检查(memcache.c), 在 ZEND_DECLARE_MODULE_GLOBALS(memcache) 下面添加:


 

2. 修改memcache_get、memcache_delete函数的定义:


 

3. 修改memcache_get 函数的实现:


 

4. 修改delete函数的实现:


 

这里的error_flag 是新添加的可选参数,与改变量相关的地方都是新添加的

 

测试脚本:

 

 

遗留问题

===========================
如果没有第一部分的修改,貌似也是可以的,但是下面三段脚本是值得思考的:


 

 

关于PHP的memcache模块的delete方法的修改(2)

前面有篇文章(http://phpor.net/blog/post/883/)提到了PHP 的memcache模块的delete方法的问题,并且做了一些修改,但是,那篇文章也提到,那种修改办法也有很大的缺点,这里给出一种比较好一些的方式。

修改memcache_delete函数如下:

 

测试:

 

输出结果:
should no found:        no found
should ok:      OK
should connect error:   connect error
should key error:       Key in unvalidate
it can work without flag argument, that’s ok
====================================================

本次所学
1. 关于参数的传递,可以直接解析成内部类型,也可以直接使用zval类型
2. 关于引用传参这里做的不太对,且看后面的文章