【原创翻译】GIT初始化–bare参数:git init & git init –bare

2011年12月12日 没有评论

       在使用Git初始化版本库的时候,使用"git init"命令和使用"git init –bare"命令有什么区别呢?

       用"git init"初始化的版本库(暂且称之为working repository)将会生成2类文件:“.git“版本库目录(记录版本历史)和实际项目文件的拷贝。你可以把这类版本库叫做“工作目录”。工作目录是一个包含有版本历史目录“.git"和源文件的目录。你可以在工作目录修改你的源文件并使用"git add"和"git commit"命令进行版本管理。

       用“git init –bare"初始化的版本库(暂且称之为bare repository)仅包含".git"目录(记录版本历史),不含项目源文件拷贝。如果你进入版本目录,你会发现仅有".git"目录,没有其他文件。版本库仅包含记录着版本历史的文件。

什么情况下使用“git init"和"git init –bare"呢?

       working repository适合于实际编辑生产过程中,在工作目录下,你将会进行实际的编码、文件管理操作和保存项目在本地工作。如果你开始创建一个项目将包含有源代码和和版本跟踪记录的时候你可以使用"git init".或者,如果你克隆"git clone"一个已经存在的版本库的时候,你也可以得到一个working repository,它也将包含".git"目录和源文件的拷贝。

       bare repository主要是用作分享版本库。开发者使用bare repository可以向其他人分享存储在本地的版本库,以便于实时分享代码更新和团队协作 。通过使用"git push"命令,你可以将你的本地更新提交至“中心版本库”(其他开发者可访问的中心库)。其他开发者可以使用“git pull"命令者接受你提交的版本更新。如果你正在一个多人协作的项目团队或者同一个项目需要在不同电脑上面完成的时候,bare repository可以满足你的分布式开发需求。

       总结:“工作目录”是通过使用“git init“或“git clone”创建的本地项目拷贝。我们可以在工作目录下面修改和测试代码。通过测试后我们可以使用“git add“和”git commit“命令本地提交修改,然后使用“git push”命令向远程 bare repository库提交更新,通常bare repository指定其他服务器,其他开发者将可以及时看到你的更新。当我们想去更新本地工作目录的时候,我们可以使用“git pull”命令去接受其他开发者提交的更新。

原文:what is a bare git repository? http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/
译By:  直来直往 http://hi.baidu.com/aboutstudy/blog/item/8cec7226e3c101098a82a1c6.html

分类: 其他 标签:

MongoDB、HandlerSocket和MySQL性能测试及其结果分析

2011年12月8日 没有评论

MongoDB性能还是十分强悍的,但HandlerSocket可以与传统MySQL同时使用MySQL数据库,互相不冲突,而且还可以继续使用MySQL的Master-Slave、Replication等成熟的机制,系统运维与传统的MySQL运维一致。


一、测试环境
1、测试服务器状况
共涉及4台测试服务器:

压力测试服务器
Web服务器
MongoDB服务器

MySQL服务器。

 

机器配置为:
CPU:Intel(R) Core(TM)2 Duo CPU     E7200  @ 2.53GHz
RAM:8G DDR2 667
磁盘:SATA

操作系统:Redhat 5.5

 

1. 压力测试服务器
安装Webbench 1.5,通过Webbench来压Web服务器。

 

2. Web服务器
Nginx 0.8.54 + PHP 5.3.3 (php-fpm),安装有Mongodb和HandlerSocket的php驱动。
Mongodb的php驱动为:mongodb-mongo-php-driver-1.1.1-19-gc584231.tar.gz
HandlerSocket的php驱动为:php-handlersocket-0.0.7.tar.gz
通过Php程序来调用Mongodb和HandlerSocket。

 

3. MongoDB服务器
MongoDB版本:1.6.5

 

4. MySQL服务器
MySQL版本:5.1.53
HandlerSocket版本:1.0.6-60-gf51e061
MySQL存储引擎:Innodb,调整了innodb的Thread Pool Size为2G

2、测试程序和测试数据提取
1. 为了避免打开连接和Http服务器成为瓶颈,在测试程序里设置为每1000个请求公用同一个连接,同时设置为每个页面请求执行1000次数据请求。
2. 测试的数据,包括QPS、CPU、IO等方面的数据,从操作系统提供的命令(如vmstat、iostat等)或者Mongodb、Mysql提供的命令(如mongostat、mysqladmin等)来获取。

二、测试结果
1、100万条记录
1. 查询

 

 

2. 插入

2、1000万条记录
1. 查询

2. 插入

 

3、2000万条记录

1. 查询

 
2. 插入

 

4、5000万条记录
1. 查询

 

2. 插入 

三、测试分析总结

1、 I/O读写情况
从插入情况下的TPS数据可以看出, MySQL、HandlerSocket和Mongodb的数据有比较明显的差别,这主要跟他们的内部实现和测试方式有关系。

 

测试场景下MySQL采用的是单条Insert的方式,所以可以看出QPS数和TPS数是基本一致的,也就是每个Insert操作,都对应有一次I/O写入操作。可以从MySQL数据库本身做一些优化,这次测试没有覆盖到这种场景。

 

HandlerSocket内部采用的是Bulk Insert操作,所以,可以看出QPS数明显大于TPS数,批量的插入操作明显提高了整体性能。

 

Mongodb内部采用合并操作的方式,采用数据先存放到内存中,然后再Flush到磁盘上的方式。所以,从测试数据可以看出,TPS曲线坡度非常大:有时候TPS是零,这时候是还放到内存中,还没有Flush到磁盘上;有时候TPS非常高,同时这时候CPU也非常高,几乎是100%,这时候是在做Flush到磁盘的操作。基于此种机制,以后会再做一些更细化的优化和测试,因为这样有可能会存在几种问题:
第一, 可能会导致某个时间段IO和CPU的压力非常大,甚至达到峰值,这种情况下,服务的整体健康状态将面临着一些挑战。
第二, 如果服务器重启,可能会出现数据丢失的情况,内存中的数据还没有Flush到磁盘的会丢失。当然这种情况是两面性的,因为采用这种方式,从测试结果也可以看出,整体的写入性能比MySQL和HandlerSocket都高,这是一种取舍,就看具体业务是否可以接受这样的以高性能换取数据可靠性,有些业务可能是可以接受的,比如Feed。

2、 CPU占用情况
从查询情况下的CPU数据可以看出,MySQL和Mongodb几乎都接近100%,而HandlerSocket由于省去了各种Sql Parser和相关的操作,CPU占用率保持在40%-60%之间,在一个比较合理的范围内。

 

从插入情况下的CPU数据可以看出,HandlerSocket的CPU占用率还是保持在40%-60%之间,低于MySQL和Mongodb。MySQL和Mongodb大部分情况保持在50%-90%之间。

 

3、 QPS情况
从查询情况下的QPS数据可以看出,HandlerSocket和Mongodb的查询性能几乎差不多,都达到3万以上,并且随着数据量的增长,性能没有回落,还是保持在3万以上。目前只是最大测试到5000万数据的情况,更高的数值这次测试还没有覆盖到。而MySQL的性能相比之下则差一些,一般在18000到25000之间。当然这次没有太多的针对MySQL做优化,只是增大了innodb_thread_pool大小和每次分配的数据块的大小,如果针对MySQL做优化,可能能同时提高HandlerSocket和MySQL的性能。

 

从插入情况下的QPS数据可以看出,Mongodb明显占有比较大的优势,这根之前说的它的实现方式有关。随着数据量的增长,QPS都相应的在减少,这方面,MySQL的幅度最大,数据量到达5000万以上时,MySQL的插入性能为2000-3000,而HandlerSocket能保持在1万以上,Mongodb为2万以上。

 

作者:洪小军
出处:http://www.cnblogs.com/inrie

分类: MySQL 标签:

HandlerSocket: 从MySQL到NoSQL的过渡替代方案?

2011年12月8日 没有评论

       HandlerSocket是MySQL的一个Plugin,通过它可以直接跟MySQL的Storage Engine Layer(比如InnoDB)交互,而不需要通过MySQL的Parser Layer。从性能角度有很大的提升。

       HandlerSocket特别适用于海量数据、高并发的具有简单业务模型的应用,比如微博、Feed。可以用来替代传统Memcached+MySQL的方式,而且性能上也接近于目前主流的NoSQL产品,所以还是有比较大的优势。但是需要清楚理性的看待这个问题,由于目前还刚发布不久,还远没有Memcached+MySQL成熟,所以,还是需要更多的功能和性能测试,更多地去研究它的源代码,这样才能更加放心的使用。现在的Memcached+MySQL的方式还是很好的方式,我觉得还将会长久下去,HandlerSocket+MySQL的出现,是给大家多了一个选择。 

一、HandlerSocket整体架构

HandlerSocket设计为MySQL的一个plugin,作为mysqld进程的daemon存在,与Client通过TCP/IP交互,进行CRUD相关的操作。基于此原因,不仅可以通过HandlerSocket操作存储层,还可以通过传统的MySQL的方式来操作。这样就可以实现:简单快速的操作通过HandlerSocket来实现,而对于一些复杂的操作,还是通过传统的MySQL方式来实现。

 

HandlerSocket的结构图如下(图片来自作者Blog):

 

这里分两条主线来分析上图:
1. MySQL Client -> MySQL Upper Layer -> Storage Engine Layer
这是传统的使用MySQL的方式,MySQL客户端通过3306端口与Upper层交互,在Upper层做SQL解析、打开表、查询计划优化、关闭表等操作,然后提交到Storage层。

2. HandlerSocket Client -> HandlerSocket daemon plugin -> Storage Engine Layer
这是采用HandlerSocket的方式,通过比较MySQL Upper Layer和HandlerSocket daemon plugin,可以明显看出,HandlerSocket减少了很多操作,这正是性能得以提高的最重要的关键点。这里使用的是9998和9999两个端口,9998作为读的端口,不能做写入操作,9999为写的端口,可以做读取操作,但是不建议使用,因为在9999端口做读取操作,从性能角度看,比起在9998端口上差一些。

 

下图更具体的列出了调用关系和结构:

 

注意目前版本的HandlerSocket暂时只支持Innodb,相信后续版本肯定会支持其他的Storage Engine。

二、HandlerSocket特点
HandlerSocket相比MySQL及其其他的NoSQL产品,具有一些优势:

1. 由于省去了MySQL的SQL层相关的操作,大大的减少了CPU开销。

2. 采用合并操作的方式,合并多个请求同时执行,减少了CPU开销和降低I/O操作次数。关于这个其他的一些NoSQL产品也有这样的机制,比如Mongodb。

3. 由于基于简单的文本协议,能节省不少网络流量,提高网络吞吐量。大部分的NoSQL产品都有这个优势,不少是兼容Memcached协议,当然更多的是采用专有的协议。

4. 能同时使用传统MySQL和HandlerSocket的方式访问MySQL数据库,互相不冲突。这个优势其实挺突出的,是HandlerSocket 的核心竞争力之一。 

5. 支持较大的并发连接,可以通过my.cnf的handlersocket_threads来配置连接数。

6. 还可以继续使用MySQL的Master-Slave、Replication等成熟的机制,系统运维与传统的MySQL运维一致。这也是HandlerSocket相比其他NoSQL产品具有的最大的优势。

7. 避免有双重缓存,比如对于Memcached+MySQL的应用来说,在Memcached和MySQL中都存有数据,需要双倍的内存资源,同时也可能会有数据不一致的问题。而采用HandlerSocket则可以避免这样的问题。具体的在接下来的应用场景里介绍。

8. 具有较高的读写性能,在CPU Bound的场景中,读取性能一般是同等环境下MySQL的3-7.5倍。同时写入性能也能达到3-5倍。

 

具有这些优势的同时,也要看到它目前存在的待改进或者应该注意的问题:
1. 由于采用合并操作的方式,这样做牺牲了响应时间,响应时间相比MySQL来说大一些。

2. 没有安全相关的保证,绝大部分NoSQL产品都有这样的问题。由于采用这样产品的应用的数据一般都不是核心数据,比如不会涉及到账户信息、用户信息等的,所以,安全性方面的暂时应该都不是什么大问题。

3. 在I/O Bound的场景中,性能的提升可能不是很明显。在这种场景下,性能的提升主要依靠的是合并操作,减少I/O操作次数,但是提高的幅度有限。

4. 由于2010年11月份刚发布,目前版本还有部分Bug待修复,比如通过HandlerSocket做Update操作后,没有清除Query Cache,这可能出现数据不一致的情况。

5. 目前只支持5.1和5.5的Innodb存储引擎,以后应该会支持其他存储引擎。

 

三、HandlerSocket应用场景
HandlerSocket目前已经在DeNA的生产环境上使用,据作者介绍,运行状态很不错,节省了不少Memcached和MySQL Slave服务器,同时网络传输量也减少了。到目前为止还没有发现什么性能问题,比如响应时间比较长等。

纵观目前绝大部分大型互联网应用,基本上采用的都是Memcached+MySQL的方式。这是一种很成熟并且很有效的方式,基本都成了标准方式。由于HandlerSocket在Innodb Buffer Pool命中率很高的情况下性能不会逊色于Memcached,所以在这种情况下,可以采用HandlerSocket+MySQL来替代Memcached+MySQL。这样有以下几个优势:

1. 采用Memcached+MySQL,需要保存两份数据:Memcached和MySQL本身的缓存,需要双倍的内存资源。而HandlerSocket+MySQL的方式,只需要保存一份缓存数据。

2. 采用Memcached+MySQL,需要保持Memcached与MySQL的数据一致性,有时候可能会出现数据不一致的情况,而如果用HandlerSocket+MySQL就没这情况。

3. 采用Memcached+MySQL,还有一个这样的应用都非常小心和特别注意的问题,就是雪崩效应。新应用上线的时候需要先做好各种预热,尽量减少瞬间超级大的I/O压力。前段时间新浪微博出现一次比较严重的故障,据不完全可靠消息证实,就是雪崩效应引起的,当时有部分Memcached服务器出现故障或者失效,导致DB服务器压力瞬间增大,支撑不住。当然了,HandlerSocket应用不是不需要预热,也是需要的,但是在面对这样的问题的时候,它的支撑能力比起MySQL+Memcached的能力强。

四、HandlerSocket性能

HandlerSocket作者测试HandlerSocket在查询情况下QPS为75K,Memcached为40K,MySQL为10K。但是需要注意到它的测试场景,一般的应用是很难有这样的场景的,所以说一般应用是很难达到7.5倍于MySQL的情况,但是性能的大幅度提高是不容置疑的。作者的测试场景如下:
1. 关闭MySQL的query cache:也就是MySQL的每次操作都需要执行sql解析等那一系列操作。

2. CPU Bound而非I/O Bound:InnoDB Buffer Pool设置为比较大,命中率接近100%。

所以,应该更客观的来看待测试数据。对于CPU Bound而非I/O Bound类型的应用,在InnoDB_Buffer_Pool接近100%命中率的时候,HandlerSocket可以将查询性能提高7.5倍。这一点其实不难理解,因为HandlerSocket主要性能优化点在于节省了SQL层的开销,SQL层的开销主要是CPU的开销。而如果对于一个I/O Bound的应用来说,HandlerSocket的查询性能可能就达不到7.5倍了,可能距离7.5倍有比较大的差距,所以,对于HandlerSocket的应用来说,应该尽量提高InnoDB_Buffer_Pool的大小,多多益善。

 

我也做过一些基准测试,基本上在插入的情况下,HandlerSocket的性能能达到同等环境的MySQL的3-5倍,数据量越大时候越明显,特别是达到5000万以后。在查询情况下,HandlerSocket是同等环境下MySQL的1.5-2倍,这跟作者的测试的7.5倍有比较大的出入,这也是上面我特别提到的,作者的测试数据是在Innodb_Buffer_Pool足够大并且命中率很高的情况,由于我做基准测试的机器条件有限,没有足够大的Buffer Pool,命中率不是很高,所以,I/O开销不小,这也验证了上面提到的,对于I/O Bound的场景,性能的提升不会特别的明显,所以应该尽量增大InnoDB_Buffer_Pool的大小,尽量接近于数据的大小。而且我在测试的时候,没有关闭Query Cache,所以对于MySQL的测试场景来说,能重用到执行计划和Cache数据等。

 

上面说到了,HandlerSocket具有不少的优点,性能也有很大的提升,但是也需要理性的来看待,有一些需要特别注意的事项,在做决策的时候,应该整体上的考虑,我这里简单的总结一下。
1. 应该尽量达到CPU-Bound场景,而非IO-Bound,这样才能更好的发挥出HandlerSocket的优势。具体做法是增大内存,尽量提高InnoDB_Buffer_Pool大小。

2. 由于采用合并操作,响应时间会有不同程度的增加,应该考虑好是否满足你的应用场景。可以继续关注后续版本优化策略,比如可能有些朋友会想要这样的:读取的时候不是合并操作,但是写入是合并操作,当然这样的情况读取的总体性能会有不同程度降低,不过一切不就是在权衡嘛?还是看具体应用场景。

 

五、HandlerSocket性能优化
前面也提到了,HandlerSocket性能相比传统MySQL有了比较显著的提高,但是要想更好的发挥出它的优势,需要做一些相关的优化。

 

性能优化主要从以下三方面考虑,当然除了这三方面,还有其他一些优化方式,比如优化操作系统,使用Direct IO等,这里说的这三方面是相对比较容易做到并且实现技术成本也不高的方式:
1. 硬件环境
前面也提到了,应该尽量提高Innodb Buffer Pool的大小,对应到硬件上,就是要尽量增加内存的大小,最理想的情况下是内存大小与数据大小一样。如果有资源,也可以考虑采用SSD,这有个基于SSD的测试数据(http://www.percona.com/docs/wiki/benchmark:handlersocket:ssd:start),性能还是非常给力的。

2. 客户端优化
客户端与服务端基于Socket通信,打开关闭连接、OpenIndex等操作都是比较耗费资源的操作,应该尽量避免频繁的做这些操作。所以,在客户端应该要做连接池,同时应该采用一些更好的通信模型,比如Linux下基于epoll和NIO等。比如,这个Java客户端(http://code.google.com/p/hs4j/)这方面就做得不错。

3. HandlerSocket和Innodb配置
HandlerSocket配置:
//读线程的个数,推荐为逻辑CPU个数,比如超线程的应该*2
handlersocket_threads = 16
//写线程的个数,目前的版本推荐设置为1
handlersocket_thread_wr = 1
//读请求的监听端口
handlersocket_port = 9998
//写请求的监听端口
handlersocket_port_wr = 9999

 

Innodb配置:
//Innodb Buffer Pool大小,推荐越大越好
innodb_buffer_pool_size
//Innodb日志文件大小,根据需求设置,在允许的情况下越大也越好
innodb_log_file_size, innodb_log_files_in_group
//mysqld进程可以打开的文件数,推荐为65535
open_files_limit = 65535
//设置为1能提高性能,但是相应的也会消耗内存,需要权衡好
innodb_adaptive_hash_index = 1

================================================================================

项目地址:

文库资料:http://wenku.baidu.com/view/c1898218a8114431b90dd88d.html

参考资料:http://www.cnblogs.com/inrie/archive/2011/01/28/1946998.html

分类: MySQL 标签:

MongoDB运行状态、性能监控,分析

2011年12月2日 没有评论

使用任何一个产品,必不可少的一项工作就是对存储的监控,监控可以让你更了解存储的运作方式,让你更早的发现使用上的问题,下面文章转自泛城科技技术博客,对MongoDB的监控做了详细深入的探讨。推荐给各位使用MongoDB的朋友。

原文链接:tech.lezi.com

这篇文章的目的是让你知道怎么了解你正在运行的Mongdb是否健康。

mongostat详解

mongostat是mongdb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。

它的输出有以下几列:

  • inserts/s 每秒插入次数
  • query/s 每秒查询次数
  • update/s 每秒更新次数
  • delete/s 每秒删除次数
  • getmore/s 每秒执行getmore次数
  • command/s 每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
  • flushs/s 每秒执行fsync将数据写入硬盘的次数。
  • mapped/s 所有的被mmap的数据量,单位是MB,
  • vsize 虚拟内存使用量,单位MB
  • res 物理内存使用量,单位MB
  • faults/s 每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展
  • locked % 被锁的时间百分比,尽量控制在50%以下吧
  • idx miss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了
  • q t|r|w 当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。
  • conn 当前连接数
  • time 时间戳

使用profiler

类似于MySQL的slow log, MongoDB可以监控所有慢的以及不慢的查询。

Profiler默认是关闭的,你可以选择全部开启,或者有慢查询的时候开启。

> use testswitched to db test> db.setProfilingLevel(2);{"was" : 0 , "slowms" : 100, "ok" : 1} // "was" is the old setting> db.getProfilingLevel()

查看Profile日志

> db.system.profile.find().sort({$natural:-1}){"ts" : "Thu Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" :"query test.$cmd ntoreturn:1 reslen:66 nscanned:0 query: { profile: 2 } nreturned:1 bytes:50" ,"millis" : 0} ...

3个字段的意义

  • ts:时间戳
  • info:具体的操作
  • millis:操作所花时间,毫秒

不多说,此处有官方文档。注意,造成满查询可能是索引的问题,也可能是数据不在内存造成因此磁盘读入造成。

使用Web控制台

Mongodb自带了Web控制台,默认和数据服务一同开启。他的端口在Mongodb数据库服务器端口的基础上加1000,如果是默认的Mongodb数据服务端口(Which is 27017),则相应的Web端口为28017

这个页面可以看到

  • 当前Mongodb的所有连接
  • 各个数据库和Collection的访问统计,包括:Reads, Writes, Queries, GetMores ,Inserts, Updates, Removes
  • 写锁的状态
  • 以及日志文件的最后几百行(CentOS+10gen yum 安装的mongodb默认的日志文件位于/var/log/mongo/mongod.log)

可以参考右边的截图

db.stat()

获取当前数据库的信息,比如Obj总数、数据库总大小、平均Obj大小等

> use testswitched to db test> db.stats(){    "collections" : 9,    "objects" : 4278845,    "avgObjSize" : 224.56603031892953,    "dataSize" : 960883236,    "storageSize" : 1195438080,    "numExtents" : 59,    "indexes" : 13,    "indexSize" : 801931264,    "fileSize" : 6373244928,    "ok" : 1}

db.serverStatus()

获取服务器的状态

{    "version" : "1.6.5",    "uptime" : 7208469,    "uptimeEstimate" : 7138829,    "localTime" : "Wed Oct 26 2011 22:23:07 GMT+0800 (CST)",    "globalLock" : {        "totalTime" : 7208469556704,        "lockTime" : 4959693717,        "ratio" : 0.000688036992871448,        "currentQueue" : {            "total" : 0,            "readers" : 0,            "writers" : 0        }    },    "mem" : {        "bits" : 64,        "resident" : 3131,        "virtual" : 6172,        "supported" : true,        "mapped" : 4927    },    "connections" : {        "current" : 402,        "available" : 2599    },    "extra_info" : {        "note" : "fields vary by platform",        "heap_usage_bytes" : 832531920,        "page_faults" : 8757    },    "indexCounters" : {        "btree" : {            "accesses" : 2821726,            "hits" : 2821725,            "misses" : 1,            "resets" : 0,            "missRatio" : 3.543930204420982e-7        }    },    "backgroundFlushing" : {        "flushes" : 120133,        "total_ms" : 73235923,        "average_ms" : 609.6236920746173,        "last_ms" : 1332,        "last_finished" : "Wed Oct 26 2011 22:22:23 GMT+0800 (CST)"    },    "cursors" : {        "totalOpen" : 0,        "clientCursors_size" : 0,        "timedOut" : 238392    },    "repl" : {        "ismaster" : true    },    "opcounters" : {        "insert" : 269351,        "query" : 19331151,        "update" : 14199331,        "delete" : 1,        "getmore" : 145575,        "command" : 55982302    },    "asserts" : {        "regular" : 0,        "warning" : 0,        "msg" : 0,        "user" : 27,        "rollovers" : 0    },    "ok" : 1}

需要关心的地方:

  • connections 当前连接和可用连接数,听过一个同行介绍过,mongodb最大处理到2000个连接就不行了(要根据你的机器性能和业务来设定),所以设大了没意义。设个合理值的话,到达这个值mongodb就拒绝新的连接请求,避免被太多的连接拖垮。
  • indexCounters:btree:misses 索引的不命中数,和hits的比例高就要考虑索引是否正确建立。你看我的”missRatio” : 3.543930204420982e-7,很健康吧。所以miss率在mongostat里面也可以看
  • 其他的都能自解释,也不是查看mongo健康状况的关键,就不说明了。

db.currentOp()

Mongodb 的命令一般很快就完成,但是在一台繁忙的机器或者有比较慢的命令时,你可以通过db.currentOp()获取当前正在执行的操作。

在没有负载的机器上,该命令基本上都是返回空的

>  db.currentOp(){ "inprog" : [ ] }

以下是一个有负载的机器上得到的返回值样例:

{ "opid" : "shard3:466404288", "active" : false, "waitingForLock" : false, "op" : "query", "ns" : "sd.usersEmails", "query" : { }, "client_s" : "10.121.13.8:34473", "desc" : "conn" },

字段名字都能自解释。如果你发现一个操作太长,把数据库卡死的话,可以用这个命令杀死他

> db.killOp("shard3:466404288")

MongoDB Monitoring Service

MongoDB Monitoring Service(MMS)是Mongodb厂商提供的监控服务,可以在网页和Android客户端上监控你的MongoDB状况。请参考。不知道是习惯还是什么原因,MMS提供的在线服务总觉得没有提供程序由使用者搭建环境靠谱,改天体验一下效果再报告。

分类: NoSQL 标签:

用Gvim建立IDE编程环境 (Windows篇)

2011年11月24日 没有评论

准备软件及插件。

(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe
(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download
(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip
(d)taglist_45.zip 地址http://www.vim.org/scripts/download_script.php?src_id=7701
(e)winmanager.zip 地址http://www.vim.org/scripts/download_script.php?src_id=754
(f)minibufexpl.vim 地址http://www.vim.org/scripts/download_script.php?src_id=3640
(g)a.vim 地址http://www.vim.org/scripts/download_script.php?src_id=7218
(h)grep.vim 地址http://www.vim.org/scripts/download_script.php?src_id=7645
(i)visualmark.vim 地址http://www.vim.org/scripts/download_script.php?src_id=4700

1.安装gvim7.2。
运行gvim72.exe,选择完全安装(Full),我的安装目录是默认的C:\Program Files\Vim
安装完成后,包括了文件夹vim72和文件夹vimfiles,以及脚本_vimrc。

2.安装中文帮助手册。
运行vimcdoc-1.7.0-setup.exe,它会自动找到gvim的安装位置。
安装完毕后重新打开gvim,:help 时帮助手册已经是中文的了。
进行到这一步时,我的gvim菜单处的中文出现了乱码。
在网上寻找解决方案,将C:\Program Files\Vim\vim72下名为 lang 的文件夹删去,使菜单语言变为英语。

3.语法高亮。
首先,编辑_vimrc文件加入以下内容:
set nu!
colorscheme desert
syntax enable
syntax on
这些设置使得gvim可以显示行号,并使用了desert配色方案,而且打开了语法高亮功能(用不同颜色显示注释、关键字、字符串等)。
我们还可以让函数名也高亮起来,在C:\Program Files\Vim\vim72\syntax下找到 c.vim 和 cpp.vim,分别添加以下内容:
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
hi cFunction gui=NONE guifg=#B5A1FF
重新打开gvim,效果如下:

4.程序中跳转。
ec57w32.zip解压,在解压后文件夹中找到ctags.exe,将其复制到C:\ProgramFiles\Vim\vim72下,并编辑_vimrc文件,添加以下内容:
set tags=tags;
set autochdir
打开cmd命令行,切换到你要查看的源代码的根目录处,运行
ctags -R
将会在此目录处生成一个tags文件。
用gvim打开一个代码文件,将光标放到某一函数名上,如下图的UpdateViewByPosNo(),按下"ctrl+]",光标会自动跳转到定义处。

按下"ctrl+T"会跳回到原来的位置。
变量、结构体、宏等等,都可以这样做。
当你的源文件有更新时,只能重新运行ctags -R命令,来更新tags文件。

5.窗口管理。
taglist_45.zip解压,解压后包含一个doc文件夹和一个plugin文件夹,将其中内容分别复制到C:\Program Files\Vim\vim72下的doc及plugin中。
在_vimrc文件中加入以下内容:
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
用gvim打开代码文件(已生成过tags文件),:Tlist,TagList窗口即出现在左侧。
用相同的方法将winmanager.zip解压和拷贝,在_vimrc文件中加入以下内容:
let g:winManagerWindowLayout=’FileExplorer|TagList’
nmap wm :WMToggle<cr>
用gvim打开代码文件,normal状态下输入命令"wm",窗口如下

其中左上是netrw窗口(浏览文件),左下是TagList窗口,再次输入"wm"时这两个窗口会关闭。

6.多文件编辑。
minibufexpl.vim复制到C:\Program Files\Vim\vim72\plugin,在_vimrc中添加:
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplMapWindowsNavVim=1
let g:miniBufExplMapWindowNavArrows=1
当用gvim打开两个或两个以上的文件时,会自动弹出MiniBufExplorer窗口,如下图

ctrl+Tab,切换到前一个buffer,并在当前窗口打开文件;
ctrl+shift+Tab,切换到后一个buffer,并在当前窗口打开文件;
ctrl+箭头键,可以切换到上下左右窗口中;
ctrl+h,j,k,l,切换到上下左右的窗口中。

7.快速切换头文件/源文件。
a.vim复制到C:\Program Files\Vim\vim72\plugin,在_vimrc中添加:
nnoremap <silent> <F12> :A<CR>
用gvim打开源码文件后,按F12即可以在c/h文件中切换,也可以通过输入:A实现。

8.在工程中快速查找。
grep.vim复制到C:\Program Files\Vim\vim72\plugin,在_vimrc中添加:
nnoremap <silent> <F3> :Grep<CR>
用gvim打开源码文件,并将光标定位到要查找的内容上,按下F3,确定要查找的内容和搜索范围,gvim会在弹出的QuickFix窗口中列出所有符合条件的搜索结果。如下图

确定查找内容时,支持正则表达式。

9.高亮的书签。
visualmark.vim复制到C:\Program Files\Vim\vim72\plugin
用gvim打开源码文件,将光标定位在需要添加书签的地方,按下ctrl+F2,即添加了书签。

使用F2在书签之间正向切换,shift+F2反向切换。


说明:本文是作者在完全按照著名的《手把手教你把Vim改装成一个IDE编程环境》一文,在Windows XP上用gvim建立IDE环境时所作的备忘。
原作地址:http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx

分类: VIM 标签:

XP下安装VIM中文帮助手册后乱码问题

2011年11月24日 没有评论

VIM中文版项目地址:http://sourceforge.net/projects/vimcdoc/files/

安装完后出现菜单乱码(我的版本是gvim7.2)

方法1是网友Hawly分享,经验证只对从程序菜单中或文件右键启动VIM有效。对于从命令行启动VIM的童鞋可以试试方法2

方法1:

在你的安装目录下(在本文皆用Home表示,比如我把vim安装在了C:\Program Files下,则Home\vim代表C:\Program Files\Vim),即Home\vim下找到_vimrc,用记事本打开(鉴于你还不熟悉vim,这儿权且用记事本,当你熟悉vim之后,就可以用vim编辑了)按如下步骤修改:

将一下代码复制到_vimrc中,保存退出,再重新打开,怎么样,菜单栏正确显示了吧。

""""""""""""""""""""""""""""""""

"解决中文乱码问题

set fenc=chinese

 "处理文本中显示乱码

 set encoding=utf-8
 set fileencodings=utf-8,chinese,latin-1

 if has("win32")

 set fileencoding=chinese

 else

 set fileencoding=utf-8

endif

 "处理菜单及右键菜单乱码

 source $VIMRUNTIME/delmenu.vim

 source $VIMRUNTIME/menu.vim

   

"处理consle输出乱码

 language messages zh_CN.utf-8

"中文乱码结束

"""""""""""""""""""""""""""""""""""""""""""""""

注:"后的东西是注释,如果你学过c++语言,这儿的"就类似于//。

 

方法2:

采用命令行方式启动VIM(将VIM安装路径加入XP的$PATH环境变量中,可实现CMD下输入vim启动gvim)的童鞋解决乱码问题方法如下

VIM中文帮助会默认安装一个全局插件vim\vimfiles\plugin\vimcdoc.vim

里面有个语言设置set encoding=utf-8,因为windows 使用GBK字符集,所以乱码了,注释这个选项就可以了。

 

好了,看一下最终效果吧:

 

分类: 其他 标签:

跨域资源共享的10种方式

2011年11月22日 没有评论

跨域问题算是老生长谈的了,下面是口碑UDE团队整理的资料,有代码演示可供下载 。

同源策略

在客户端编程语言中,如JavaScript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?当两个域具有相同的协议(如http), 相同的端口(如80),相同的host(如www.example.org),那么我们就可以认为它们是相同的域。比如http://www.example.org/index.html和http://www.example.org/sub/index.html是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理,比如限制file协议下脚本的访问权限。本地的HTML文件在浏览器中是通过file协议打开的,如果脚本能通过file协议访问到硬盘上其它任意文件,就会出现安全隐患,目前IE8还有这样的隐患。

受到同源策略的影响,跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步,目前在跨域请求的技巧上,有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种,一种是单向的数据请求,还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式,以下跨域实例的源代码可以从这里获得

单向跨域

JSONP

JSONP (JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的JavaScript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,在提交开发资源之前必须认真考虑它们。第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。

JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。(参见参考资料 了解更多信息)。

Flash URLLoader

Flash有自己的一套安全策略,服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问,SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时,例如从域www.a.com请求域www.b.com上的数据,我们可以借助Flash来发送HTTP请求。首先,修改域www.b.com上的crossdomain.xml(一般存放在根目录,如果没有需要手动创建) ,把www.a.com加入到白名单。其次,通过Flash URLLoader发送HTTP请求,最后,通过Flash API把响应结果传递给JavaScript。Flash URLLoader是一种很普遍的跨域解决方案,不过需要支持iOS的话,这个方案就无能为力了。

Access Control

Access Control是比较超越的跨域方式,目前只在很少的浏览器中得以支持,这些浏览器可以发送一个跨域的HTTP请求(Firefox, Google Chrome等通过XMLHTTPRequest实现,IE8下通过XDomainRequest实现),请求的响应必须包含一个Access-Control-Allow-Origin的HTTP响应头,该响应头声明了请求域的可访问权限。例如www.a.com对www.b.com下的asset.php发送了一个跨域的HTTP请求,那么asset.php必须加入如下的响应头:

header("Access-Control-Allow-Origin: http://www.a.com");

window.name

window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。那么我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给window.name,iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值了。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。

server proxy

在数据提供方没有提供对JSONP协议或者window.name协议的支持,也没有对其它域开放访问权限时,我们可以通过server proxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时,直接发送一个指向www.b.com/asset.txt的ajax请求肯定是会被浏览器阻止。这时,我们在www.a.com下配一个代理,然后把ajax请求绑定到这个代理路径下,例如www.a.com/proxy/, 然后这个代理发送HTTP请求访问www.b.com下的asset.txt,跨域的HTTP请求是在服务器端进行的,客户端并没有产生跨域的ajax请求。这个跨域方式不需要和目标资源签订协议,带有侵略性,另外需要注意的是实践中应该对这个代理实施一定程度的保护,比如限制他人使用或者使用频率。

双向跨域

document.domain

通过修改document的domain属性,我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域,比如www.a.com和sub.a.com是不同的域,这时,我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript方法。但是当我们把它们document的domain属性都修改为a.com,浏览器就会认为它们处于同一个域下,那么我们就可以互相调用对方的method来通信了。

FIM C Fragment Identitier Messaging

不同的域之间,JavaScript只能做很有限的访问和操作,其实我们利用这些有限的访问权限就可以达到跨域通信的目的了。FIM (Fragment Identitier Messaging)就是在这个大前提下被发明的。父窗口可以对iframe进行URL读写,iframe也可以读写父窗口的URL,URL有一部分被称为frag,就是#号及其后面的字符,它一般用于浏览器锚点定位,Server端并不关心这部分,应该说HTTP请求过程中不会携带frag,所以这部分的修改不会产生HTTP请求,但是会产生浏览器历史记录。FIM的原理就是改变URL的frag部分来进行双向通信。每个window通过改变其他window的location来发送消息,并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录,而且有些浏览器不支持onhashchange事件,需要轮询来获知URL的改变,最后,URL在浏览器下有长度限制,这个制约了每次传送的数据量。

Flash LocalConnection

页面上的双向通信也可以通过Flash来解决,Flash API中有LocalConnection这个类,该类允许两个SWF之间通过进程通信,这时SWF可以播放在独立的Flash Player或者AIR中,也可以嵌在HTML页面或者是PDF中。遵循这个通信原则,我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递数据的目的了。SWF通过LocalConnection交换数据是很快的,但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂,而且需要了2个SWF文件,实用性不强。

window.postMessage

window.postMessage是HTML5定义的一个很新的方法,这个方法可以很方便地跨window通信。由于它是一个很新的方法,所以在很旧和比较旧的浏览器中都无法使用。

Cross Frame

Cross Frame是FIM的一个变种,它借助了一个空白的iframe,不会产生多余的浏览器历史记录,也不需要轮询URL的改变,在可用性和性能上都做了很大的改观。它的基本原理大致是这样的,假设在域www.a.com上有页面A.html和一个空白代理页面proxyA.html, 另一个域www.b.com上有个页面B.html和一个空白代理页面proxyB.html,A.html需要向B.html中发送消息时,页面会创建一个隐藏的iframe, iframe的src指向proxyB.html并把message作为URL frag,由于B.html和proxyB.html是同域,所以在iframe加载完成之后,B.html可以获得iframe的URL,然后解析出message,并移除该iframe。当B.html需要向A.html发送消息时,原理一样。Cross Frame是很好的双向通信方式,而且安全高效,但是它在Opera中无法使用,不过在Opera下面我们可以使用更简单的window.postMessage来代替。

总结

跨域的方法很多,不同的应用场景我们都可以找到一个最合适的解决方案。比如单向的数据请求,我们应该优先选择JSONP或者window.name,双向通信我们采取Cross Frame,在未与数据提供方没有达成通信协议的情况下我们也可以用server proxy的方式来抓取数据。

分类: 其他 标签:

让你提升命令行效率的 Bash 快捷键

2011年11月15日 没有评论

让你提升命令行效率的 Bash 快捷键

 

生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率。

编辑命令

       Ctrl + a :移到命令行首

       Ctrl + e :移到命令行尾

       Ctrl + f :按字符前移(右向)

       Ctrl + b :按字符后移(左向)

       Alt + f :按单词前移(右向)

       Alt + b :按单词后移(左向)

       Ctrl + xx:在命令行首和光标之间移动

       Ctrl + u :从光标处删除至命令行首

       Ctrl + k :从光标处删除至命令行尾

       Ctrl + w :从光标处删除至字首

       Alt + d :从光标处删除至字尾

       Ctrl + d :删除光标处的字符

       Ctrl + h :删除光标前的字符

       Ctrl + y :粘贴至光标后

       Alt + c :从光标处更改为首字母大写的单词

       Alt + u :从光标处更改为全部大写的单词

       Alt + l :从光标处更改为全部小写的单词

       Ctrl + t :交换光标处和之前的字符

       Alt + t :交换光标处和之前的单词

       Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别 [感谢rezilla 指正]

重新执行命令

       Ctrl + r:逆向搜索命令历史

       Ctrl + g:从历史搜索模式退出

       Ctrl + p:历史中的上一条命令

       Ctrl + n:历史中的下一条命令

       Alt + .:使用上一条命令的最后一个参数

控制命令

       Ctrl + l:清屏

       Ctrl + o:执行当前命令,并选择上一条命令

       Ctrl + s:阻止屏幕输出

       Ctrl + q:允许屏幕输出

       Ctrl + c:终止命令

       Ctrl + z:挂起命令

Bang (!) 命令

       !!:执行上一条命令

       !blah:执行最近的以 blah 开头的命令,如 !ls

       !blah:p:仅打印输出,而不执行

       !$:上一条命令的最后一个参数,与 Alt + . 相同

       !$:p:打印输出 !$ 的内容

       !*:上一条命令的所有参数

       !*:p:打印输出 !* 的内容

       ^blah:删除上一条命令中的 blah

       ^blah^foo:将上一条命令中的 blah 替换为 foo

       ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo

友情提示

1.    以上介绍的大多数 Bash 快捷键仅当在 emacs 编辑模式时有效,若你将Bash 配置为 vi 编辑模式,那将遵循 vi 的按键绑定。Bash 默认为 emacs 编辑模式。如果你的 Bash 不在 emacs 编辑模式,可通过 set -o emacs 设置。

2.    ^S、^Q、^C、^Z 是由终端设备处理的,可用 stty 命令设置。

 

引用:http://linuxtoy.org/archives/bash-shortcuts.html

分类: Linux 标签:

Centos 升级安装 VIM7.3

2011年11月11日 没有评论

Centos系统自带Vim为7.0版,使用过程中发现netrw的目录浏览功能有bug,表现为:

子目录名称无法正常显示:目录名前面加添有字母’e’。

子目录无法打开:光标置于子目录上时,按回车无反映。

只好升级VIM的netrw插件,但是VIM7.1以后netrw是以Vimball形式发布。所以还得先升级VIM到最新版本了

VIM最新版本7.3 官网

默认安装

./configure
make
make install

安装过程中提示:installing /usr/local/share/man/fr/man1/vim.1 ,然后就卡着不动了。

查资料提示可能是跟locale设置有关系

我的locale 设置为

LANG=zh_CN.GBXXXX

修改为

LANG=zh_CN.UTF-8

安装成功!

分类: Linux, VIM 标签:

Varnishhist 中文man page

2011年11月9日 没有评论

Author:    Dag-Erling Sm?rgrav

Date:        2010-05-31

Version:   1.0

Manual section:       1

Varnish request histogram(varnish请求柱状图)

 

SYNOPSIS

varnishhist [-b] [-C] [-c] [-d] [-I regex] [-i tag] [-n varnish_name] [-r file] [-V] [-w delay][-X regex] [-x tag]

DESCRIPTION

Varnishhist工具读取varnishd(1)的共享内存日志,生成一个连续不断更新的柱状图显示最后N个请求的分布。N的值取决于左上角垂直刻度的高度。水平标尺是对数。如果命中,则使用“|”表示,如果没有命中,使用“#”表示。

下面的选项是可用的:

                  -b               分析指定后端服务器的日志,如果没有使用-b和-c参数,varnish就充当他们。

                   -C               忽略正则表达式的大小写。

                   -c               分析指定客户端的日志。

                   -d               在启动过程中处理旧的日志,一般情况下,varnishhist只会在进程写入日           志后启动。

                   -I       regex        匹配正则表达式的日志,如果没有使用-i或者-I,那么所有的日志都                      会匹配。

                   -i       tag            匹配指定的tag,如果没有使用-i或者-I,那么所有的日志都会被匹配。

                   -n               指定varnish实例的名字,用来获取日志,如果没有指定,默认使用主机 名。

                   -r      file    读入日志文件,代替共享内存。

                   -V               显示版本号,然后退出。

                   -w     delay         等待更新的延迟时间,默认是1秒。

                   -X      regex        导入匹配表达式的日志。

                   -x      tag            导入匹配tag的日志。

SEE ALSO

    * varnishd(1)

    * varnishlog(1)

    * varnishncsa(1)

    * varnishstat(1)

    * varnishtop(1)

HISTORY

The varnishhist utility was developed by Poul-Henning Kamp in cooperation with  Verdens Gang AS and Linpro AS. This manual page was written by Dag-Erling Sm?rgrav.

COPYRIGHT

这个文档的版权和varnish自身的版权一样,请看LICENCE。

    * Copyright (c) 2006 Verdens Gang AS

    * Copyright (c) 2006-2008 Linpro AS

    * Copyright (c) 2008-2010 Redpill Linpro AS

    * Copyright (c) 2010 Varnish Software AS

 

引用:http://linuxguest.blog.51cto.com/195664/369338

分类: 架构 标签: