test luapgsql driver performance (vs pgbench)

前面我们测试了luasql这个驱动的性能, 无法达到pgbench的性能. 损失17%左右, 原因是luasql不支持prepared sql.

这篇将介绍一下luapgsql这个驱动的性能.

首先要在环境中安装, 前面的安装是在CentOS 5.x中安装的, 需要依赖libbsd-devel包(bsd/bsd.h头文件)

环境

Lua 5.2.3
CentOS 6.4 x64
PostgreSQL 9.3.1
CPU
model name      : Intel(R) Xeon(R) CPU           E5504  @ 2.00GHz
stepping        : 5
cpu MHz         : 1596.010

在CentOS 6.x 中没有这个包, 需要下载并安装

wget http://elrepo.reloumirrors.net/testing/el6/x86_64/RPMS/libbsd-devel-0.2.0-4.el6.elrepo.x86_64.rpm
wget http://elrepo.org/linux/testing/el6/i386/RPMS/libbsd-0.2.0-4.el6.elrepo.i686.rpm
rpm -ivh libbsd-0.2.0-4.el6.elrepo.i686.rpm
rpm -ivh libbsd-devel-0.2.0-4.el6.elrepo.x86_64.rpm

安装完后, 就有依赖的bsd/bsd.h头文件了.

另一个需要注意的是, 如果系统中安装了其他版本的postgresql-libs , 例如使用rpm包安装的, 那么要先卸载这些rpm, 否则安装luapgsql时会用那些pg 版本的so文件, 造成不可用.

[root@db-172-16-3-150 luapgsql]# rpm -qa|grep postg
postgresql-libs-8.4.13-1.el6_3.x86_64
postgresql-8.4.13-1.el6_3.x86_64
postgresql-devel-8.4.13-1.el6_3.x86_64

这些全部卸载掉.

然后修改GNUmakefile

luapgsql]# vi GNUmakefile
SRCS=           luapgsql.c
LIB=            pgsql

LUAVER=         `lua -v 2>&1 | cut -c 5-7`

CFLAGS+=        -O3 -Wall -fPIC -I/usr/include -I/usr/include/lua${LUAVER} \
                -I/home/pg931/pgsql/include/server -I/home/pg931/pgsql/include -D_GNU_SOURCE
LDADD+=         -L/usr/lib -L/home/pg931/pgsql/lib -lpq -lbsd

LIBDIR=         /usr/local/lib
LUADIR=         /usr/local/lib/lua/${LUAVER}

${LIB}.so:      ${SRCS:.c=.o}
                cc -shared -o ${LIB}.so ${CFLAGS} ${SRCS:.c=.o} ${LDADD}

clean:
                rm -f *.o *.so
install:
        install -d ${DESTDIR}${LIBDIR}
        install -m 755 ${LIB}.so ${DESTDIR}${LUADIR}/${LIB}.so

使用正确的LIBDIR, CFLAGS, LDADD编译安装.

[root@db-172-16-3-150 luapgsql]# make
cc -O3 -Wall -fPIC -I/usr/include -I/usr/include/lua`lua -v 2>&1 | cut -c 5-7` -I/home/pg931/pgsql/include/server -I/home/pg931/pgsql/include -D_GNU_SOURCE   -c -o luapgsql.o luapgsql.c
cc -shared -o pgsql.so -O3 -Wall -fPIC -I/usr/include -I/usr/include/lua`lua -v 2>&1 | cut -c 5-7` -I/home/pg931/pgsql/include/server -I/home/pg931/pgsql/include -D_GNU_SOURCE luapgsql.o -L/usr/lib -L/home/pg931/pgsql/lib -lpq -lbsd
/usr/bin/ld: skipping incompatible /usr/lib/libbsd.a when searching for -lbsd
/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
[root@db-172-16-3-150 luapgsql]# make install
install -d /usr/local/lib
install -m 755 pgsql.so /usr/local/lib/lua/`lua -v 2>&1 | cut -c 5-7`/pgsql.so

测试 : 

[root@db-172-16-3-150 luapgsql]# lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> require "pgsql"
error loading module 'pgsql' from file '/usr/local/lib/lua/5.2/pgsql.so':
        libpq.so.5: cannot open shared object file: No such file or directory
stack traceback:
        [C]: in ?
        [C]: in function 'require'
        stdin:1: in main chunk
        [C]: in ?
> os.exit()

这是由于libpq没有在LD_LIBRARY_PATH路径中, 可以配置这个变量或者修改/etc/ld.so.conf

[root@db-172-16-3-150 luapgsql]# export LD_LIBRARY_PATH=/home/pg931/pgsql/lib:$LD_LIBRARY_PATH
[root@db-172-16-3-150 luapgsql]# lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> pgsql = require "pgsql"
> conn = pgsql.connectdb('host=/ssd1/pg931/pg_root port=1922 dbname=digoal user=digoal password=digoal')
> print(conn:errorMessage())

> print (conn:status())
0
> conn:prepare('pre5','select $1',23)
> conn:execPrepared('pre5','10')
> function foo(cnt)
>>  local var1 = os.time()
>>  for i = 1,cnt do
>>    conn:execPrepared('pre5','10')
>>  end
>>  return (os.time()-var1)
>> end
> print(foo(100000))
5
> print(foo(1000000))
49
# 20408.163265306122 TPS
因为关闭了log_statement, 速度有一定提升.

关闭了log_statement后的pgbench测试结果 : 

pg931@db-172-16-3-150-> taskset -c 2 pgbench -M prepared -n -r -c 1 -j 1 -T 30 -f ./test.sql -U digoal digoal
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 1
number of threads: 1
duration: 30 s
number of transactions actually processed: 643458
tps = 21448.561393 (including connections establishing)
tps = 21450.541989 (excluding connections establishing)
statement latencies in milliseconds:
        0.045633        select 10;

现在lua和pgbench的测试结果非常相近. 仅仅相差5%的性能.

stap输出可以看出, luapgsql正常使用了prepared sql.

process("/home/pg931/pgsql9.3.1/bin/postgres").mark("query__execute__start")10754
process("/home/pg931/pgsql9.3.1/bin/postgres").mark("query__execute__start")10754
... 略

[参考]
1. http://blog.163.com/digoal@126/blog/static/163877040201412125644452/

2. http://blog.163.com/digoal@126/blog/static/1638770402014121113037760/

3. https://github.com/mbalmer/luapgsql

时间: 2024-12-23 00:01:10

test luapgsql driver performance (vs pgbench)的相关文章

test luadbi's postgresql driver performance (vs pgbench)

测试机环境 :  Lua 5.1.5 CentOS 5.7 x64 PostgreSQL 9.3.2 CPU model name : Intel(R) Xeon(R) CPU E5440 @ 2.83GHz stepping : 6 cpu MHz : 2833.435 Luadbi测试结果 :  [root@db-172-16-3-33 luadbi]# taskset -c 2 /opt/lua5.1/bin/lua Lua 5.1.5 Copyright (C) 1994-2012 Lu

test luasql's postgresql driver performance (not better than pgbench)

测试数据库性能的方法很多, 例如使用pgbench, sysbench. 对PostgreSQL而言, pgbench是性能损失最小的一种测试工具, 本文将使用lua以及luasql驱动测试一下, 我们对比一下使用lua和pgbench测试的结果, 看看lua会带来多少性能损失. 本文测试环境 :  Lua 5.2.3 CentOS 6.4 x64 PostgreSQL 9.3.1 CPU model name : Intel(R) Xeon(R) CPU E5504 @ 2.00GHz ste

iOS 各版本中的新特性(What's New in iOS)- 目录翻译完成

iOS 各版本中的新特性(What's New in iOS) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 介绍 Introduction文档组织结构 Organization of Thi

Ruby on Rails框架程序连接MongoDB的教程_ruby专题

前边有介绍mongodb的安装以及ror项目的搭建,现在进行一下整合. 1.创建项目 创建项目时不再使用rails active_record支持 rails new todo -O 2.我们将要使用MongoMapper来驱动MongoDB到Rails 编辑GemFile,增加下面的内容 gem"mongo_mapper" 然后  执行 bundle install 安装gem bundle install 3.添加数据库链接 在config/initializer下面新建一个mon

我的第一个Ruby On Rails + MongoDB程序

    最近想进一步学习一下MongoDB,而很久之前使用过ROR,正好也凑个机会重新拾起来.下面是建立第一个项目的过程.        主要参考文档:        1. Rails 3 - Getting started        2. MongoDB and MongoMapper (可能需要翻墙)        3. Getting started with VMware CloudFoundry, MongoDB and Rails (可能需要翻墙) 一.创建程序的框架 创建项目时

Driver Class Name and JDBC URL Format

The name of the class that implements java.sql.Driver in MySQL Connector/J is 'com.mysql.jdbc.Driver'. The 'org.gjt.mm.mysql.Driver' class name is also usable to remain backwards-compatible with MM.MySQL. You should use this class name when registeri

汇编源码系列之driver

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... name driver page 55,132 title 'DRIVER --- installable driver template';; This is a "template" for a MS-DOS installable device driver.; The actual driver subroutines

一个可能影响IO performance的问题

最近写了一个driver,将一个文件虚拟成SCSI DISK.该驱动程序本质上就是一个HBA driver.在驱动性能测试的时候,发现IO performance很低,在大量数据写的时候只达到了4MB/s的吞吐量,在少量数据写的时候,性能很高.该驱动的IO模型如下图所示: 在驱动中对queuecommand的流程进行了打印分析,发现SCSI Middle Layer发送请求的速度很慢.这就表明SCSI command的queue已经满了,所以SML无法dispatch command.通过分析,

mongoDB VS PostgreSQL dml performance use python (pymongo & py-postgresql)

前面测试了mongodb和postgresql的插入性能对比, 参考如下 :  1. http://blog.163.com/digoal@126/blog/static/16387704020151435825593/ 2. http://blog.163.com/digoal@126/blog/static/1638770402015142858224/ 3. http://blog.163.com/digoal@126/blog/static/16387704020151210840303