新鲜出炉,PCIE卡SQLServer和SSD Mongodb集群4千万数据insert测试

http协议请求头我们再熟悉不过了,一些诸如content-type,etag等等的协议头规定了我们如何使用http协议,以及反映着一些资源的状态。但是我们有注意过http请求头的顺序吗?

最近公司需要测试1亿条数据10分钟插入数据库,主要是为了数据推送留存用。
最终我们讨论给出了2套方案
1、单台sqlserver 配合PCIE卡
2、Mongodb分片集群
因为目前数据量是4千万,所以我分别对4千万数据和1亿数据进行了写入测试。
被测试机器都是24CPU,64G内存的独立服务器
测试代码运行服务器也是24CPU,64G内存的独立服务器
网络环境是内网1G带宽。

1、单台sqlserver 配合PCIE卡

性能测试总结:
使用新配置的720 PCI-E硬盘机器和SQLServer2014,性能非常强劲,单机可达3万条/秒的写入,由于前几次测试本机压测本机,对cpu有抢占情况,所以性能并没完全发挥出来。

2、mongodb测试结果

性能测试总结:
尽管Mongodb单机性能不如带PCIE卡的SQLServer,但是一旦分片,性能将提升几倍
在分4片的情况下,写入可达60000条/s
在分5片的情况下,写入可达80000条/s
另外值得一提的是,由于分片不均匀,导致90%的数据仅使用了60%的时间,剩下10%的数据仅在单点插入,所以性能下降的很厉害,如果分片足够多,我们的片键足够散列,让每片存储平均,性能还能有进一步提升。

3、汇总总结:
想要达到1亿条数据10分钟插入,必须达到插入速度在16万/秒,所以如果我们将分片达到10片,理论上就可以达到1亿条数据10分钟的插入了,由于机器有限无法完成测试,不过最终20分钟的插入速度也让人满意了。

4、最后附上py测试脚本
sqlserver测试脚本:

-- coding: utf-8 --

import _mssql
import pymssql
import datetime,time
from multiprocessing import Process

def getTimestampFromDatetime(d=None):
if d is None:
d = datetime.datetime.now()
return time.mktime(d.timetuple())

def task(key):

server = 'localhost:2433'
user = 'testwzh'
password = '123456'
dbname = 'TCMobileNotification'
str = u'来的真巧!这么好的东西只为你准备,你忍心让给别人吗?'

all_data = (0,1,'d0118d2cffaf8000d0118d2cffaf8000',0,1,'2015-03-20 10:01:50.990',\
    str,'http://t.cn/RZsNwgG',71,\
    6, 9,'2015-03-27 10:01:50.990',0)
listData = []
for i in range(10000):
    listData.append(all_data)


tableName = 'PushMessageSystem_{0}'.format(key)
conn = pymssql.connect(server=server, user=user, password=password, database=dbname)
cursor = conn.cursor()
for i in range(0, 250000):
    cursor.executemany(
     "INSERT INTO "+tableName+" VALUES (%d,%d,%s,%d,%d,%s,%s,%s,%d,%d,%d,%s,%d)",
        listData)
    conn.commit()
conn.close()

if name == ‘main‘:
proc_record = []
keyList = [0,1,2,3,4,5,6,7,8,9,’a’,’b’,’c’,’d’,’e’,’f’,]
for i in range(0,16):
p = Process(target = task, args=(keyList[i],))
p.start()
proc_record.append(p)

start = getTimestampFromDatetime()

for p in proc_record:
    p.join()

end = getTimestampFromDatetime()
print('time: {0}s'.format(end-start))

mongodb集群测试脚本:

-- coding: utf-8 --

import pymongo
import json
import datetime,time
import sys
import copy
import sys, os
from multiprocessing import Process
from hashlib import md5

def getTimestampFromDatetime(d=None):
if d is None:
d = datetime.datetime.now()
return time.mktime(d.timetuple())

def md5Hash(str):
m = md5()
m.update(str)
return m.hexdigest().upper()

def task(key):

mongoUri = 'mongodb://root:[email protected]:10000/admin'
str = u'来的真巧!这么好的东西只为你准备,你忍心让给别人吗?'

all_data = {
    'PMSID':1,
    'PMSPushTaskID':0,
    'PMSPlatform':1,
    'PMSDeviceID':md5Hash(key),
    'PMSReadCount':0,
    'PMSVisible':1,
    'PMSCreateTime':'2014-06-24 16:40:00.000',
    'PMSContent':str,
    'PMSUrl':'http://t.cn/RZsNwgG',
    'PMSTaskSN':71,
    'PMSPushType':6,
    'PMSProductType':3,
    'PMSExpiredTime':'2015-03-27 10:01:50.990',
    'PMSContentType':0,
}

tableName = 'PushMessageSystem_{0}'.format(0)

client = pymongo.MongoClient(mongoUri, max_pool_size=100)
db = client.TCMobileNotification

for i in range(0, 125):
    listData = []
    for i in range(10000):
        listData.append(copy.copy(all_data))
    db[tableName].insert(listData)

if name == ‘main‘:
proc_record = []
keyList = [0,1,2,3,4,5,6,7,8,9,’a’,’b’,’c’,’d’,’e’,’f’,0,1,2,3,4,5,6,7,8,9,’a’,’b’,’c’,’d’,’e’,’f’]
for i in range(0,32):
p = Process(target = task, args=(str(keyList[i]),))
p.start()
proc_record.append(p)

start = getTimestampFromDatetime()

for p in proc_record:
    p.join()

end = getTimestampFromDatetime()
print('time: {0}s'.format(end-start))