用技术创造价值,用艺术塑造自我!
Linux
linux 下面使用的软件的总结
MongoDB在Ubuntu10.04下的单机性能测试
Aug 31st
MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。它比纯noSQL数据库查询功能强悍,比关系数据库更面向集合。
测试的硬件:酷睿双核3.0G,2G内存,7200转普通硬盘,Ubuntu10.04 32bit,MongoDB1.61
安装&启动
longhao@aliyun:~$ sudo apt-get install mongodb
#添加一个so,否则启动不了mongodb
longhao@aliyun:~$ sudo ln -s /usr/lib/xulrunner-devel-1.9.2.8/lib/libmozjs.so /usr/lib/libmozjs.so
#启动
longhao@aliyun:~$ sudo service mongodb start
安装python库
到github上去下载mongodb到python driver或者 git clone git://github.com/mongodb/mongo-python-driver.git pymongo
longhao@aliyun:~$ tar zxvf pymongo.*.tar.gz
longhao@aliyun:~$ cd pymongo
longhao@aliyun:~$ python setup.py install
编写测试代码
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
connection = Connection('127.0.0.1', 27017)
db = connection['testdb']
'''
test program execute time,use python decorator!
'''
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def insert(num):
posts = db.posts
for x in range(num):
post = {"author": str(x)+"Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts.insert(post)
@func_time
def find():
posts = db.posts
print posts.find_one()
@func_time
def remove():
posts = db.posts
print 'count before remove:',posts.count();
posts.remove({});
print 'count after remove:',posts.count();
if __name__ == "__main__":
num = 1000000
insert(num)
find()
remove()
测试结果
longhao@aliyun:~$ python mongodb.py
insert run: 211.037979126
{u'date': datetime.datetime(2010, 8, 31, 12, 59, 30, 456000), u'text': u'My first blog post!', u'_id': ObjectId('4c7cfcb28cb52a3eec00002e'), u'author': u'46Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
find run: 0.0865120887756
count before remove: 1000000
count after remove: 0
remove run: 9.01437902451
测试显示向数据库中插入100W条数据耗时211.038秒,删除100W条数据耗时9.014秒,数据库文件总大小为1G(这个和保持的对象大小有关系)
遇到到问题:
1:数据库文件大小在清空库后不能自动更改;
2:单线程测试的结果,多线程效率会怎样还需要测试!
Apache MPM(Multi-processing module) 学习笔记
Jul 13th
编译参数:
–with-mpm=MPM Choose the process model for Apache to use.
MPM={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool|win_nt}
linux和unix下面默认为profork模式,常用的有worker模式和profork模式,windows下面是win_nt模式。
1:profork
工作原理:一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的(spare)或者是空 闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。将MaxClients设置为一个足够大的数值以处理潜在的请求高 峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
优点:具有很强的自我调节能力,只需要很少的配置指令调整。
| 默认值 | 说明 | |
| MaxSpareServers | 10 | 设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有非常繁忙的机器才用设置这个值,不要设置的太大。 |
| MinSpareServers | 5 | 空闲子进程的最小数量 |
| StartServers | 5 | 设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数 |
| ServerLimit | 最大200000,编译默认20000 | 只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。 |
| MaxClients | 256 | MaxClients指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令限制的最大值为止。一旦一个链接被释放,队列中的请求将得到服务。对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit 。 |
| MaxRequestsPerChild | 10000 | 设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。 |
2:worker
工作原理:每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可 以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
优点:由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM,是apache2.0后的发展趋势。
典型设置:
ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
| 默认值 | 说明 | |
| MaxSpareThreads | 250 | 最大空闲线程数 |
| MinSpareThreads | 75 | 最小空闲线程数 |
| StartServers | 3 | 设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数 |
| ServerLimit | 最大200000,编译默认20000 | 只有需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。 |
| MaxClients | 50 | 表示可以用于伺服客户端请求的最大线程数量。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。 |
| ThreadsPerChild | 25 | 这个指令设置了每个子进程建立的线程数。子进程在启动时建立这些线程后就不再建立新的线程了。如果使用一个类似于mpm_winnt只有一个子进程的MPM,这个数值要足够大,以便可以处理可能的请求高峰。如果使用一个类似于worker有多个子进程的MPM,每个子进程所拥有的所有线程的总数要足够大,以便可以处理可能的请求高峰。 |
3:event
event多路处理模块(MPM)被设计成面向需要处理大量并发连接的场合(特别是在开启KeepAlive的场合),它基于worker开发,并且配置 指令与worker完全相同。
要使用event MPM,你必须在配置脚本configure的命令行上使用–with-mpm=event选项。
该MPM依赖于APR用于线程同步的compare-and-swap原子操作,并且你还需要在configure命令行上使用–enable- nonportable-atomics=yes选项。如果你为x86平台编译,那么最低要求i486以上的CPU支持;如果你为SPARC平台编译,那 么最低要求UltraSPARC芯片。因为更老的CPU不支持compare-and-swap原子操作。
