Wednesday, April 11, 2012

[Emacs] Emacs server 和client

如果已经打开了一个Eamcs的GUI, 想在命令行里让这个Emacs打开某个文件, 可以使用Emacs Server 的功能 在Emacs里键入
M-x server-start
或者在.emacs文件中加入
(server-start)
然后在命令行里就可以使用
emacsclient your-target-file
使得Emacs打开你要的文件. 不过这个命令会blocking(等待从Emacs返回). 如果需要其立即返回, 可以
emacsclient -n your-target-file
参考 Using emacs as server

Saturday, April 07, 2012

[Linux] 使用huge page

Linux在x86下默认的page size是4KB. 但是对很多应用(特别是很多数据库方面的应用)来说,这个page size值过小导致了很多TLB miss, 从而降低了系统的性能.所以这个时候我们希望使用hugepage来减少TLB miss. x86下典型的hugepage可以达到2MB. 查看当前系统hugepage的大小和使用情况
$ cat /proc/meminfo |grep Huge
HugePages_Total: 0
HugePages_Free:  0
HugePages_Rsvd:  0
HugePages_Surp:  0
Hugepagesize: 2048 kB
查看当前hugepage的数目
$ cat /proc/sys/vm/nr_hugepages 
0
#或者使用sysctl工具
$ sysctl vm.nr_hugepages 
0
设置可以使用的hugepage的数目为512 (这样你可以使用总共为1G大小的hugepage memory)
$ echo 512 > /proc/sys/vm/nr_hugepages 
#或者使用sysctl工具
$ sysctl -w vm.nr_hugepages= 512
这时候再看一下hugepage的使用情况
$ cat /proc/meminfo |grep Huge
HugePages_Total: 512
HugePages_Free:  512
HugePages_Rsvd:  0
HugePages_Surp:  0
Hugepagesize: 2048 kB
Ref: http://linuxgazette.net/155/krishnakumar.html

Memcached笔记

编译:

$ ./autogen.sh
$ ./configure
$ make
运行server
$ ./memcached -p 9527
这样memcached会在server上监听9527这个端口, 你也可以制定一个其他端口 (默认是11211) 如果需要看到多一些输出信息, 可以加上参数 -v -vv 或者-vvv
-p 端口号使用的TCP端口。默认为11211
-U 端口号使用的UDP端口。默认为11211
-m 内存大小(MB)最大内存大小。默认为64M
-t 线程数目使用多少个工作线程. 默认为4
-v,-vv,-vvv用very vrebose模式启动,调试信息和错误输出到控制台
-d作为daemon在后台启动

测试:

在本机用telnet运行client


$ telnet localhost 9527
set key1 14 0 1
a
STORED
get key1
VALUE key1 14 1
a
END
一些内部机制:

内存管理:

memcached将内存划分成1MB大小的单位,称作slab. 每个slab划分成许多相同大小的slot来存储key-value pair. 但是每个slab可能有不同的等级--根据这个等级,slot的大小不同.
图片来源:http://nosql.mypopescu.com/post/13506116892/memcached-internals-memory-allocation-eviction

LRU算法:

memcached 使用 LRU per slab class, not globally.

item:

每一个key-value pair的metadata存储在一个item结构当中
  • it_flags: 可以是如下几个标志的组合
    • ITEM_LINKED: 此item加入了LRU list
    • ITEM_CAS: 我暂时还不知到...
    • ITEM_FETCHED: 此item被access过
    • ITEM_SLABBED: 此item已经被free了
  • next, prev: per-slab LRU是用一个双向链表来实现的, 这两个指针就指向链表中前后item
  • h_next: 指针, 指向每个item在hashtable中下一个item(该hashtable使用chaining来实现)
  • time: 最近一次访问时间(用于检查该item是否expire)
  • exptime: expire时间(记住memcached是一个cache)
参考

memcached全面剖析–PDF总结篇
memcached源码分析(一): memcached.c主函数分析
memcached源码分析(二): settings结构体分析
memcached源码分析(三):socket建立过程分析
memcached源码分析(四):事件状态机分析
memcached源码分析(五):数据保存及内存管理
memcached源码分析(六):总结几个小点 Memcached internals