这也是一篇关于tokyocabinet(以下简称tc)的文章。
对于tc这个东西,还是比较好用的,但是其默认的内存分配(系统的内存分配)是在令我不能满意。我的一个业务已把tc当做内存存储来使用的,所有的东西都不落地,于是我使用内存就得珍惜一点。 或者说我不是我太吝啬,那个内存分配也太浪费了。本来也就1.2G的数据,在tc中折腾几天之后,使用物理内存却需要4.1G,有点儿太离谱了。所以,今天尝试一下其它的内存分配器。
tcmalloc(Thread-Caching Malloc),不要和上面的tc混淆, 是一个内存分配的一个动态库。参考:
http://code.google.com/p/google-perftools/
在64位机器上,需要先安装libunwind:
http://mirror.csclub.uwaterloo.ca/nongnu/libunwind/
启用tcmalloc的两种方式:
方式一:
不需要重新编译程序, 使用LD_PRELOAD=/PATH/TO/libtcmalloc.so ; 重新启动程序就行(但是你要么把启动程序包装一下,要么每次启动程序前都记着先执行一下这个操作)
方式二:
重新编译程序,编译时,使用选项:
-ltcmalloc
这样,启动的是否就一定是这种内存分配方式了,但是,你也不可能再使用默认的分配方式了
参考资料:
http://www.tektalk.org/2011/10/20/tcmalloc%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E6%80%BB%E6%8B%AC/
http://blog.csdn.net/yfkiss/article/details/6902269
http://goog-perftools.sourceforge.net/doc/tcmalloc.html
-----------------------------------------------
我的测试程序已经跑了一个小时了,似乎tcmalloc表现的要好一些,不过不是太明显。明天再观察一下
PHP POST数组的初始化,下面的堆栈是我的PHP程序正在读POST的数据的时候打出来的:
# gstack 13339
#0 0x003aa7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1 0x0048b12d in poll () from /lib/tls/libc.so.6
#2 0x00762558 in apr_wait_for_io_or_timeout ()
#3 0x0075bba4 in apr_socket_recv () from /data1/apache2/lib/libapr-1.so.0
#4 0x00e3d840 in socket_bucket_read ()
#5 0x08072668 in ap_core_input_filter ()
#6 0x00b21ad5 in logio_in_filter () from /data1/apache2/modules/mod_logio.so
#7 0x0807f634 in ap_http_filter ()
#8 0x013496e8 in php_apache_sapi_read_post ()
#9 0x0129399a in sapi_deactivate () from /data1/apache2/modules/libphp5.so
#10 0x0128cae6 in php_request_shutdown ()
#11 0x0134a1ca in php_handler () from /data1/apache2/modules/libphp5.so
#12 0x08073dea in ap_run_handler ()
#13 0x080741bf in ap_invoke_handler ()
#14 0x0807ee55 in ap_process_request ()
#15 0x0807c8c9 in ap_process_http_connection ()
#16 0x08079762 in ap_run_process_connection ()
#17 0x08082a6e in child_main ()
#18 0x08082c46 in make_child ()
#19 0x080837cd in ap_mpm_run ()
#20 0x08063de4 in main ()
-----------------------
# telnet 10.55.38.14 80
Trying 10.55.38.14...
Connected to 10.55.38.14 (10.55.38.14).
Escape character is '^]'.
POST /sso/login.php HTTP/1.1
host: login.sina.com.cn
content-length: 1000000000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
io性质的应用:
随机读写比较厉害
avg-cpu: %user %nice %system %iowait %steal %idle
1.88 0.00 2.30 32.38 0.00 63.44
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 1224.80 0.94 4.65 4 23
avg-cpu: %user %nice %system %iowait %steal %idle
0.58 0.00 1.30 41.09 0.00 57.03
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 1056.80 0.55 4.00 2 20
avg-cpu: %user %nice %system %iowait %steal %idle
0.57 0.00 1.47 46.34 0.00 51.61
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 1406.00 0.73 5.33 3 26
avg-cpu: %user %nice %system %iowait %steal %idle
0.65 0.00 1.53 28.99 0.00 68.83
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 1027.40 0.70 3.93 3 19
avg-cpu: %user %nice %system %iowait %steal %idle
0.63 0.00 1.53 26.93 0.00 70.92
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 1183.80 0.68 4.52 3 22
查看路由:


设置路由

显示网络配置信息:

设置http代理:
设置路由
显示网络配置信息:
设置http代理:
实例一: 在windows上启动一个8181端口来代理phpor.net的80端口的服务

删除端口代理:

当然,你可能记不住这么长的命令,可以如下方式使用:
>netsh
>? // 查看可以使用的命令
...
>interface // 这里你可以不拼写完,只要不会和其他命令产生歧义就行,如: interf
>? // 查看可以使用的命令
...
>portproxy
>?
...
>set v4tov4 listenport=8181 connectaddress=phpor.net connectport=80
>show all
...
注意: 目前只支持tcp的端口代理。
这里又意外发现一处windows的错误:

=================================================
netsh还可以完成很多东西,有时间再看
删除端口代理:
当然,你可能记不住这么长的命令,可以如下方式使用:
>netsh
>? // 查看可以使用的命令
...
>interface // 这里你可以不拼写完,只要不会和其他命令产生歧义就行,如: interf
>? // 查看可以使用的命令
...
>portproxy
>?
...
>set v4tov4 listenport=8181 connectaddress=phpor.net connectport=80
>show all
...
注意: 目前只支持tcp的端口代理。
这里又意外发现一处windows的错误:
=================================================
netsh还可以完成很多东西,有时间再看





2012/01/02 23:15 | 
